summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-10-18 10:49:24 +0300
committerLars Wirzenius <liw@liw.fi>2019-10-18 10:49:24 +0300
commit5822e79a9355970a1190194e351a4761e9db6859 (patch)
tree83947c82747eb7404a575e40594e9afd059bfd08
parenta799ddebdc516dba40a846e7e370825049cd97d7 (diff)
downloadick2-5822e79a9355970a1190194e351a4761e9db6859.tar.gz
Revert "Change: move exceptions to exceptions.py, rename persitent.py"
This reverts commit 066664763f16318076e34d702cce746b2fd4afca.
-rw-r--r--ick2/__init__.py6
-rw-r--r--ick2/exceptions.py18
-rw-r--r--ick2/persistent.py (renamed from ick2/resource.py)8
-rw-r--r--ick2/persistent_tests.py92
-rw-r--r--ick2/store.py10
-rw-r--r--without-tests1
6 files changed, 113 insertions, 22 deletions
diff --git a/ick2/__init__.py b/ick2/__init__.py
index 2720d61..7229a5f 100644
--- a/ick2/__init__.py
+++ b/ick2/__init__.py
@@ -17,8 +17,10 @@ from .version import __version__, __version_info__
from .logging import setup_logging, log
from .store import (
MemoryStore,
+ Conflict,
)
-from .resource import (
+from .persistent import (
+ NotFound,
Resource,
resource_from_dict,
)
@@ -48,9 +50,7 @@ from .buildsm import (
)
from .exceptions import (
BadUpdate,
- NotFound,
ExistsAlready,
- Conflict,
IckException,
MethodNotAllowed,
ClientIdMissing,
diff --git a/ick2/exceptions.py b/ick2/exceptions.py
index bd394af..3af7ff0 100644
--- a/ick2/exceptions.py
+++ b/ick2/exceptions.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2017-2019 Lars Wirzenius
+# Copyright (C) 2017-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
@@ -18,28 +18,12 @@ class IckException(Exception):
pass
-class NotFound(Exception):
-
- def __init__(self, kind, name):
- super().__init__(
- 'Resource {}:{} not found'.format(
- kind or "unknown", name or "unknown"))
-
-
class ExistsAlready(IckException):
def __init__(self, name):
super().__init__('Resource {} already exists'.format(name))
-class Conflict(IckException):
-
- def __init__(self, rid, expected, got):
- super().__init__(
- 'Update conflict for {}: expected revision {}, got {}'.format(
- rid, expected, got))
-
-
class BadUpdate(IckException):
def __init__(self, how):
diff --git a/ick2/resource.py b/ick2/persistent.py
index ca02d30..33903fe 100644
--- a/ick2/resource.py
+++ b/ick2/persistent.py
@@ -25,6 +25,14 @@ import yaml
import ick2
+class NotFound(Exception): # pragma: no cover
+
+ def __init__(self, kind, name):
+ super().__init__(
+ 'Resource {}:{} not found'.format(
+ kind or "unknown", name or "unknown"))
+
+
class Resource: # pragma: no cover
def __init__(self, as_dict=None):
diff --git a/ick2/persistent_tests.py b/ick2/persistent_tests.py
new file mode 100644
index 0000000..961742f
--- /dev/null
+++ b/ick2/persistent_tests.py
@@ -0,0 +1,92 @@
+# Copyright (C) 2018-2019 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 <http://www.gnu.org/licenses/>.
+
+
+import shutil
+import tempfile
+import unittest
+
+
+import ick2
+
+
+class PersistentStateTestsMixIn:
+
+ def get_token(self):
+ raise NotImplementedError()
+
+ def test_has_no_resources_initially(self):
+ token = self.get_token()
+ self.assertEqual(self.state.get_resource_names(token, 'silly'), [])
+
+ def test_has_no_resource_initially(self):
+ token = self.get_token()
+ with self.assertRaises(ick2.NotFound):
+ self.state.get_resource(token, 'silly', '#1')
+
+ def test_creates_resource(self):
+ as_dict = {'foo': 'bar'}
+ r = ick2.resource_from_dict(as_dict)
+
+ token = self.get_token()
+ self.state.write_resource(token, 'silly', '#1', r)
+ self.assertTrue(self.state.has_resource(token, 'silly', '#1'))
+ self.assertEqual(self.state.get_resource_names(token, 'silly'), ['#1'])
+
+ r2 = self.state.get_resource(token, 'silly', '#1')
+ self.assertTrue(isinstance(r2, ick2.Resource))
+ self.assertEqual(r.as_dict(), r2.as_dict())
+
+ def test_updates_resource(self):
+ as_dict = {'foo': 'bar'}
+ r = ick2.resource_from_dict(as_dict)
+
+ as_dict = {'foo': 'yo'}
+ r2 = ick2.resource_from_dict(as_dict)
+
+ token = self.get_token()
+ self.state.write_resource(token, 'silly', '#1', r)
+ self.state.update_resource(token, 'silly', '#1', r2)
+
+ self.assertTrue(self.state.has_resource(token, 'silly', '#1'))
+ self.assertEqual(self.state.get_resource_names(token, 'silly'), ['#1'])
+
+ actual = self.state.get_resource(token, 'silly', '#1')
+ self.assertTrue(isinstance(actual, ick2.Resource))
+ self.assertEqual(actual.as_dict(), r2.as_dict())
+
+ def test_removes_resource(self):
+ as_dict = {'foo': 'bar'}
+ r = ick2.resource_from_dict(as_dict)
+
+ token = self.get_token()
+ self.state.write_resource(token, 'silly', '#1', r)
+ self.state.remove_resource(token, 'silly', '#1')
+ self.assertFalse(self.state.has_resource(token, 'silly', '#1'))
+ self.assertEqual(self.state.get_resource_names(token, 'silly'), [])
+
+ def test_raises_error_removing_nonexistent_resource_kind(self):
+ token = self.get_token()
+ with self.assertRaises(ick2.NotFound):
+ self.state.remove_resource(token, 'silly', '#1')
+
+ def test_raises_error_removing_nonexistent_resource(self):
+ as_dict = {'foo': 'bar'}
+ r = ick2.resource_from_dict(as_dict)
+
+ token = self.get_token()
+ self.state.write_resource(token, 'silly', '#1', r)
+ with self.assertRaises(ick2.NotFound):
+ self.state.remove_resource(token, 'silly', '#2')
diff --git a/ick2/store.py b/ick2/store.py
index 5c01f89..2d93daf 100644
--- a/ick2/store.py
+++ b/ick2/store.py
@@ -68,10 +68,18 @@ class MemoryStore(StoreInterface):
def update(self, token, rid, obj, revision):
old_obj, old_rev = self.show(token, rid)
if old_rev != revision:
- raise ick2.Conflict(rid, old_rev, revision)
+ raise Conflict(rid, old_rev, revision)
new_rev = self._new_id()
self._set(rid, new_rev, obj)
return new_rev
def delete(self, token, rid):
del self._objs[rid]
+
+
+class Conflict(Exception):
+
+ def __init__(self, rid, expected, got):
+ super().__init__(
+ 'Update conflict for {}: expected revision {}, got {}'.format(
+ rid, expected, got))
diff --git a/without-tests b/without-tests
index ca8a65a..0e24420 100644
--- a/without-tests
+++ b/without-tests
@@ -9,7 +9,6 @@ ick2/logapi.py
ick2/logging.py
ick2/notificationapi.py
ick2/pipelineapi.py
-ick2/resource.py
ick2/responses.py
ick2/trans.py
ick2/sendmail.py