commit b63d2d271bc5fca3626053914efb5678d4f7a4e2
parent 8d16035dc11345e3675d7524f64ccb899ca7fafa
Author: lash <dev@holbrook.no>
Date: Tue, 15 Nov 2022 05:23:33 +0000
Serialize and deserialize assignments in issues
Diffstat:
8 files changed, 247 insertions(+), 14 deletions(-)
diff --git a/piknik/error.py b/piknik/error.py
@@ -1,2 +1,6 @@
class DeadIssue(Exception):
pass
+
+
+class AlreadyAssignedError(Exception):
+ pass
diff --git a/piknik/identity.py b/piknik/identity.py
@@ -1,14 +1,18 @@
import hashlib
+
class Identity:
def __init__(self, fingerprint):
- self.fp = bytes.fromhex(fingerprint)
-
+ self.__id = bytes.fromhex(fingerprint)
+
+
+ def id(self):
+ return self.__id.hex()
+
def uri(self):
h = hashlib.sha256()
- h.update(self.fp)
+ h.update(self.id)
z = h.digest()
return 'sha256:' + z.hex()
-
diff --git a/piknik/issue.py b/piknik/issue.py
@@ -1,5 +1,10 @@
+# standard imports
import uuid
import json
+import datetime
+
+# local imports
+from piknik.identity import Identity
class Issue:
@@ -9,20 +14,45 @@ class Issue:
issue_id = str(uuid.uuid4())
self.id = issue_id
self.title = title
+ self.assigned = []
+ self.assigned_time = []
@staticmethod
def from_str(s):
r = json.loads(s)
o = Issue(title=r['title'], issue_id=r['id'])
+ for k in r['assigned'].keys():
+ p = Identity(k)
+ o.assigned.append(p)
+ t = datetime.datetime.utcfromtimestamp(r['assigned'][k])
+ o.assigned_time.append(t)
return o
+ def assign(self, identity, t=None):
+ if identity in self.assigned:
+ raise AlreadyAssignedError(identity)
+ if t == None:
+ t = datetime.datetime.utcnow()
+ self.assigned.append(identity)
+ self.assigned_time.append(t)
+
+
+ def get_assigned(self):
+ return list(zip(self.assigned, self.assigned_time))
+
+
def __str__(self):
- return json.dumps({
+ o = {
'id': str(self.id),
'title': self.title,
- })
+ 'assigned': {},
+ }
+ for v in self.get_assigned():
+ o['assigned'][v[0].id()] = v[1].timestamp()
+
+ return json.dumps(o)
def __eq__(self, o):
diff --git a/tests/beastman.asc b/tests/beastman.asc
@@ -0,0 +1,41 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+qiZscOR0QoWhxq+qlVwIJspu1bkZmG5kLrk=
+=8AJB
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/merman.asc b/tests/merman.asc
@@ -0,0 +1,41 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+VSVADovBu+pz/Ov1y/3jUe8hZ/KleQ==
+=et4c
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/merman.priv.asc b/tests/merman.priv.asc
@@ -0,0 +1,83 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+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
+=sth5
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/tests/test_assign.py b/tests/test_assign.py
@@ -3,17 +3,20 @@ import unittest
import logging
import json
-logging.basicConfig(level=logging.DEBUG)
-logg = logging.getLogger()
-
+# local imports
from piknik import Issue
from piknik.identity import Identity
+logging.basicConfig(level=logging.DEBUG)
+logg = logging.getLogger()
+
class TestAssign(unittest.TestCase):
def setUp(self):
self.alice = 'F3FAF668E82EF5124D5187BAEF26F4682343F692'
+ self.bob = 'F645E047EE5BC4E2824C94DB42DC91CFA8ABA02B'
+
def test_identity_pointer(self):
check = "sha256:65ea9b0609341322903823660bf45326f473d903ee7d327dff442f46d68eacd9"
@@ -22,9 +25,17 @@ class TestAssign(unittest.TestCase):
self.assertEqual(r, check)
- def test_basic(self):
+ def test_identity_load(self):
o = Issue('foo')
- #p = Identity()
+ alice = Identity(self.alice)
+ o.assign(alice)
+ bob = Identity(self.bob)
+ o.assign(bob)
+ r = o.get_assigned()
+ self.assertEqual(len(r), 2)
+ self.assertEqual(r[0][0], alice)
+ self.assertEqual(r[1][0], bob)
+ self.assertGreater(r[1][1], r[0][1])
if __name__ == '__main__':
diff --git a/tests/test_issue.py b/tests/test_issue.py
@@ -3,11 +3,13 @@ import unittest
import logging
import json
+# local imports
+from piknik import Issue
+from piknik.identity import Identity
+
logging.basicConfig(level=logging.DEBUG)
logg = logging.getLogger()
-from piknik import Issue
-
class TestIssue(unittest.TestCase):
@@ -18,12 +20,29 @@ class TestIssue(unittest.TestCase):
self.assertEqual(o.title, r['title'])
- def test_from_str(self):
+ def test_basic_from_str(self):
+ o = Issue('foo')
+ v = str(o)
+ r = Issue.from_str(v)
+ self.assertTrue(o == r)
+
+
+
+ def test_assigned_from_str(self):
o = Issue('foo')
+ alice_fp = 'F3FAF668E82EF5124D5187BAEF26F4682343F692'
+ alice = Identity(alice_fp)
+ bob_fp = 'F645E047EE5BC4E2824C94DB42DC91CFA8ABA02B'
+ bob = Identity(bob_fp)
+ o.assign(alice)
+ o.assign(bob)
v = str(o)
r = Issue.from_str(v)
self.assertTrue(o == r)
+ check = r.get_assigned()
+ self.assertEqual(len(check), 2)
+
if __name__ == '__main__':
unittest.main()