home · contact · privacy
Simplify JSON-ification of VersionedAttributes.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 17 Jun 2024 21:15:48 +0000 (23:15 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 17 Jun 2024 21:15:48 +0000 (23:15 +0200)
plomtask/db.py
plomtask/versioned_attributes.py
tests/conditions.py
tests/processes.py
tests/utils.py

index 1cecc16f6985b555f25757ad6e9f65724311a287..054060e13b7c1fa4aa27274efab13ff1c2828815 100644 (file)
@@ -275,6 +275,8 @@ class BaseModel(Generic[BaseModelId]):
     def as_dict(self) -> dict[str, object]:
         """Return self as (json.dumps-coompatible) dict."""
         d: dict[str, object] = {'id': self.id_}
+        if len(self.to_save_versioned) > 0:
+            d['_versioned'] = {}
         for k in self.to_save:
             attr = getattr(self, k)
             if hasattr(attr, 'as_dict'):
@@ -282,7 +284,8 @@ class BaseModel(Generic[BaseModelId]):
             d[k] = attr
         for k in self.to_save_versioned:
             attr = getattr(self, k)
-            d[k] = attr.as_dict
+            assert isinstance(d['_versioned'], dict)
+            d['_versioned'][k] = attr.history
         for r in self.to_save_relations:
             attr_name = r[2]
             d[attr_name] = [x.as_dict for x in getattr(self, attr_name)]
index cc42bbc40f761c35715f11b0ca4f61ba67dbe579..cbd1c8e348a9230b10176d55b4b6a490fe11ff33 100644 (file)
@@ -25,12 +25,6 @@ class VersionedAttribute:
                     history_tuples)
         return hash(hashable)
 
-    @property
-    def as_dict(self) -> dict[str, object]:
-        """Return self as (json.dumps-coompatible) dict."""
-        d = {'parent_id': self.parent.id_, 'history': self.history}
-        return d
-
     @property
     def _newest_timestamp(self) -> str:
         """Return most recent timestamp."""
index 53a75b87de137fb2258d7183e94acbb8fab1e158..5270812a41e9f7fc369a426876fe316b349e34b7 100644 (file)
@@ -74,16 +74,18 @@ class TestsWithServer(TestCaseWithServer):
         """Return JSON of Condition to expect."""
         d = {'id': id_,
              'is_active': is_active,
-             'title': {'history': {}, 'parent_id': id_},
-             'description': {'history': {}, 'parent_id': id_}}
+             '_versioned': {
+                 'title': {},
+                 'description': {}
+                 }
+             }
         titles = titles if titles else []
         descriptions = descriptions if descriptions else []
+        assert isinstance(d['_versioned'], dict)
         for i, title in enumerate(titles):
-            assert isinstance(d['title'], dict)
-            d['title']['history'][f'[{i}]'] = title
+            d['_versioned']['title'][i] = title
         for i, description in enumerate(descriptions):
-            assert isinstance(d['description'], dict)
-            d['description']['history'][f'[{i}]'] = description
+            d['_versioned']['description'][i] = description
         return d
 
     @staticmethod
@@ -100,9 +102,11 @@ class TestsWithServer(TestCaseWithServer):
              'calendarize': False,
              'suppressed_steps': [],
              'explicit_steps': [],
-             'title': {'history': {'[0]': title}, 'parent_id': id_},
-             'effort': {'history': {'[0]': 1.0}, 'parent_id': id_},
-             'description': {'history': {'[0]': ''}, 'parent_id': id_},
+             '_versioned': {
+                 'title': {0: title},
+                 'description': {0: ''},
+                 'effort': {0: 1.0}
+                 },
              'conditions': conditions if conditions else [],
              'disables': disables if disables else [],
              'enables': enables if enables else [],
@@ -117,7 +121,7 @@ class TestsWithServer(TestCaseWithServer):
         post = {'title': 'foo', 'description': 'oof', 'is_active': False}
         self.check_post(post, '/condition', 302, '/condition?id=1')
         # … single /condition
-        cond = self.cond_as_dict(titles = ['foo'], descriptions = ['oof'])
+        cond = self.cond_as_dict(titles=['foo'], descriptions=['oof'])
         expected_single: dict[str, object]
         expected_single = {'is_new': False,
                            'enabled_processes': [],
@@ -137,7 +141,8 @@ class TestsWithServer(TestCaseWithServer):
         # test effect of POST changing title and activeness
         post = {'title': 'bar', 'description': 'oof', 'is_active': True}
         self.check_post(post, '/condition?id=1', 302)
-        expected_single['condition']['title']['history']['[1]'] = 'bar'
+        assert isinstance(expected_single['condition'], dict)
+        expected_single['condition']['_versioned']['title'][1] = 'bar'
         expected_single['condition']['is_active'] = True
         self.check_json_get('/condition?id=1', expected_single)
         # test deletion POST's effect on …
@@ -162,7 +167,7 @@ class TestsWithServer(TestCaseWithServer):
         proc_2_post = {'title': 'B', 'description': '', 'effort': 1.0,
                        'enables': [1], 'blocker': [1]}
         self.post_process(2, proc_2_post)
-        cond = self.cond_as_dict(titles = ['foo'], descriptions = ['oof'])
+        cond = self.cond_as_dict(titles=['foo'], descriptions=['oof'])
         proc_1 = self.proc_as_dict(conditions=[cond], disables=[cond])
         proc_2 = self.proc_as_dict(2, 'B', blockers=[cond], enables=[cond])
         expected_single = {'is_new': False,
@@ -193,7 +198,7 @@ class TestsWithServer(TestCaseWithServer):
         self.check_post(post_2, '/condition', 302, '/condition?id=2')
         post_3 = {'title': 'baz', 'description': 'zab', 'is_active': True}
         self.check_post(post_3, '/condition', 302, '/condition?id=3')
-        cond_1 = self.cond_as_dict(titles = ['foo'], descriptions = ['oof'])
+        cond_1 = self.cond_as_dict(titles=['foo'], descriptions=['oof'])
         cond_2 = self.cond_as_dict(2, titles=['bar'], descriptions=['rab'])
         cond_3 = self.cond_as_dict(3, True, ['baz'], ['zab'])
         cons = [cond_2, cond_3, cond_1]
index 34f6427e4d06152a17f035672061757cce203cac..4d2252c4b748718ee5f61844521322a15ff03669 100644 (file)
@@ -279,7 +279,8 @@ class TestsWithServer(TestCaseWithServer):
         form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.0}
         self.post_process(2, form_data | {'condition': []})
         self.check_post(form_data | {'condition': [1]}, '/process?id=', 404)
-        self.check_post({'title': 'foo', 'description': 'foo'},
+        self.check_post({'title': 'foo', 'description': 'foo',
+                         'is_active': False},
                         '/condition', 302, '/condition?id=1')
         self.post_process(3, form_data | {'condition': [1]})
         self.post_process(4, form_data | {'disables': [1]})
index 86d049dac2387b97f441d228ecc3c33e9bfe6552..d6c5b20ac7882281d4958e99e3dbcd6a35de708b 100644 (file)
@@ -274,22 +274,23 @@ class TestCaseWithServer(TestCaseWithDB):
         """Compare JSON on GET path with expected.
 
         To simplify comparison of VersionedAttribute histories, transforms
-        keys under "history"-named dicts into bracketed integer strings
-        counting upwards in chronology.
+        timestamp keys of VersionedAttribute history keys into integers
+        counting chronologically forward from 0.
         """
         def rewrite_history_keys_in(item: Any) -> Any:
             if isinstance(item, dict):
-                if 'history' in item.keys():
-                    vals = item['history'].values()
-                    history = {}
-                    for i, val in enumerate(vals):
-                        history[f'[{i}]'] = val
-                    item['history'] = history
+                if '_versioned' in item.keys():
+                    for k in item['_versioned']:
+                        vals = item['_versioned'][k].values()
+                        history = {}
+                        for i, val in enumerate(vals):
+                            history[i] = val
+                        item['_versioned'][k] = history
                 for k in list(item.keys()):
                     rewrite_history_keys_in(item[k])
             elif isinstance(item, list):
                 item[:] = [rewrite_history_keys_in(i) for i in item]
-            return item 
+            return item
         self.conn.request('GET', path)
         response = self.conn.getresponse()
         self.assertEqual(response.status, 200)