diff options
author | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2019-07-20 17:30:42 +0200 |
---|---|---|
committer | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2019-07-20 17:31:14 +0200 |
commit | 4852ba0f09ececeb3f542801bedf981217ba6a4c (patch) | |
tree | 539a184b0130f9444d30e99387aa7d419010a01a | |
parent | 1396f2ef54b71d4344e28329a4d874a73e2e8e12 (diff) |
Refactor Object to be a dataclass
-rw-r--r-- | pyapd/objects.py | 98 | ||||
-rw-r--r-- | tests/test_app.py | 2 | ||||
-rw-r--r-- | tests/test_memory_store.py | 4 | ||||
-rw-r--r-- | tests/test_objects.py | 4 | ||||
-rw-r--r-- | tests/test_sqlite_store.py | 4 |
5 files changed, 51 insertions, 61 deletions
diff --git a/pyapd/objects.py b/pyapd/objects.py index 690c3f9..c8bbbb0 100644 --- a/pyapd/objects.py +++ b/pyapd/objects.py @@ -1,72 +1,62 @@ +import dataclasses import json -class Object(): - PROPERTIES = [ - 'type', - 'attachment', - 'attributedTo', - 'audience', - 'content', - 'context', - 'contentMap', - 'name', - 'nameMap', - 'endTime', - 'generator', - 'icon', - 'image', - 'inReplyTo', - 'location', - 'preview', - 'published', - 'replies', - 'startTime', - 'summary', - 'summaryMap', - 'tag', - 'updated', - 'url', - 'to', - 'bto', - 'cc', - 'bcc', - 'mediaType', - 'duration', - ] - - def __init__(self, *args, **kw): - self.context = "https://www.w3.org/ns/activitystreams" - for p in self.PROPERTIES: - if p in kw: - setattr(self, "ap_"+p, kw[p]) - if 'id' in kw: - self.ap_id = kw['id'] - else: +@dataclasses.dataclass +class Object: + # TODO: assign the correct type + ap_id: str = '' + ap_type: str = '' + ap_attachment: str = '' + ap_attributedTo: str = '' + ap_audience: str = '' + ap_content: str = '' + ap_context: str = '' + ap_contentMap: str = '' + ap_name: str = '' + ap_nameMap: str = '' + ap_endTime: str = '' + ap_generator: str = '' + ap_icon: str = '' + ap_image: str = '' + ap_inReplyTo: str = '' + ap_location: str = '' + ap_preview: str = '' + ap_published: str = '' + ap_replies: str = '' + ap_startTime: str = '' + ap_summary: str = '' + ap_summaryMap: str = '' + ap_tag: str = '' + ap_updated: str = '' + ap_url: str = '' + ap_to: str = '' + ap_bto: str = '' + ap_cc: str = '' + ap_bcc: str = '' + ap_mediaType: str = '' + ap_duration: str = '' + + def __post_init__(self): + if not self.ap_id: self.ap_id = self._generate_id() @classmethod def from_jsons(cls, data: str): - return cls(**json.loads(data)) + kw = {} + for k, v in json.loads(data).items(): + kw['ap_'+k] = v + return cls(**kw) def to_jsonable(self): data = { - 'id': self.ap_id, } - for p in self.PROPERTIES: - v = getattr(self, "ap_"+p, None) - if v is not None: - data[p] = v + for k, v in dataclasses.asdict(self).items(): + data[k[3:]] = v return data def to_jsons(self): return json.dumps(self.to_jsonable()) - def __eq__(self, other): - for i in self.PROPERTIES: - if getattr(self, "ap_"+i, "") != getattr(other, "ap_"+i, ""): - return False - return True - def _generate_id(self): raise NotImplementedError diff --git a/tests/test_app.py b/tests/test_app.py index f78149b..1f9116b 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -15,7 +15,7 @@ class TestApp(AsyncHTTPTestCase): def test_object_view(self): oid = self.get_url('/object/12345') - obj = objects.Object(id=oid) + obj = objects.Object(ap_id=oid) self.app.store.add(obj) res = self.fetch('/object/12345') self.assertEqual(res.code, 200) diff --git a/tests/test_memory_store.py b/tests/test_memory_store.py index 899a776..56f6185 100644 --- a/tests/test_memory_store.py +++ b/tests/test_memory_store.py @@ -8,12 +8,12 @@ class TestMemoryStore(unittest.TestCase): def setUp(self): self.store = memory.Store() self.oid = 'https://test/object/12345' - self.obj = objects.Object(id=self.oid) + self.obj = objects.Object(ap_id=self.oid) self.store.add(self.obj) def test_add_object(self): oid = 'https://test/object/12345' - obj = objects.Object(id=oid) + obj = objects.Object(ap_id=oid) self.store.add(obj) self.assertIn(oid, self.store.objects) diff --git a/tests/test_objects.py b/tests/test_objects.py index 63228f5..4f27424 100644 --- a/tests/test_objects.py +++ b/tests/test_objects.py @@ -16,8 +16,8 @@ class TestObjects(unittest.TestCase): def test_activity_to_json(self): act = objects.Object( - id="http://example.org/123456", - type="object", + ap_id="http://example.org/123456", + ap_type="object", ) data = act.to_jsons() self.assertIsInstance(data, str) diff --git a/tests/test_sqlite_store.py b/tests/test_sqlite_store.py index ea3fef6..70a4b17 100644 --- a/tests/test_sqlite_store.py +++ b/tests/test_sqlite_store.py @@ -9,12 +9,12 @@ class TestSqliteStore(unittest.TestCase): self.store = sqlite.Store(file=':memory:') self.store.createdb() self.oid = 'https://test/object/12345' - self.obj = objects.Object(id=self.oid) + self.obj = objects.Object(ap_id=self.oid) self.store.add(self.obj) def test_add_object(self): oid = 'https://test/object/12345' - obj = objects.Object(id=oid) + obj = objects.Object(ap_id=oid) self.store.add(obj) # self.assertIn('object', self.store.objects) # self.assertIn(oid, self.store.objects['object']) |