Skip to content

Commit

Permalink
Labeler finished with unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
SmithSamuelM committed Aug 12, 2024
1 parent 56535e3 commit 227f9b0
Show file tree
Hide file tree
Showing 2 changed files with 204 additions and 23 deletions.
43 changes: 24 additions & 19 deletions src/keri/core/coring.py
Original file line number Diff line number Diff line change
Expand Up @@ -2999,7 +2999,6 @@ class Labeler(Matter):
(See Matter)
Hidden:
_label (str): base value without encoding
Methods:
Expand All @@ -3015,8 +3014,6 @@ def __init__(self, label='', raw=None, code=None, soft=None, **kwa):
label (str | bytes): base value before encoding
"""
self._label = None

if label:
if hasattr(label, "encode"): # make label bytes
label = label.encode("utf-8")
Expand All @@ -3025,41 +3022,49 @@ def __init__(self, label='', raw=None, code=None, soft=None, **kwa):
try:
code = Tagger._codify(tag=label)
soft = label

except InvalidSoftError as ex: # too big
if label[0] != b'A': # use Bexter code
code = MtrDex.StrB64_L0
raw = Bexter.rawify(label)
else: # use Texter code
code = MtrDex.Bytes_L0
if label[0] != ord(b'A'): # use Bexter code
code = LabelDex.StrB64_L0
raw = Bexter._rawify(label)

else: # use Texter code since ambiguity if starts with 'A'
code = LabelDex.Bytes_L0
raw = label

else:
if len(label) == 1:
code = MtrDex.Label1
code = LabelDex.Label1

elif len(label) == 2:
code = MtrDex.Label2
code = LabelDex.Label2

else:
code = MtrDex.Bytes_L0
raw = label
code = LabelDex.Bytes_L0

self._label = label.decode() # convert bytes to str
raw = label

super(Labeler, self).__init__(raw=raw, code=code, soft=soft, **kwa)


if self.code not in LabelDex:
raise InvalidCodeError(f"Invalid code={self.code} for Labeler.")

# need way to extract label from raw and code


@property
def label(self):
"""Returns:
"""Extracts and returns label from .code and .soft or .code and .raw
Returns:
label (str): base value without encoding
"""
if self.code in TagDex: # tag
return self.soft # soft part of code

getter for ._label. Makes ._label read only
if self.code in BexDex: # bext
return Bexter._derawify(raw=self.raw, code=self.code) # derawify

"""
return self._label
return self.raw.decode() # everything else is just raw as str



Expand Down
184 changes: 180 additions & 4 deletions tests/core/test_coring.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,15 @@
from keri.kering import Protocols, Protocolage, Ilkage, Ilks, TraitDex

from keri.help import helping
from keri.help.helping import (sceil, intToB64, intToB64b, b64ToInt, codeB64ToB2, codeB2ToB64,
from keri.help.helping import (sceil, intToB64, intToB64b, b64ToInt,
codeB64ToB2, codeB2ToB64,
B64_CHARS, Reb64, nabSextets)

from keri import core
from keri.core import coring
from keri.core.coring import (Saids, Sadder, Tholder, Seqner, NumDex, Number,
Dater, Bexter, Texter,
TagDex, Tagger, Ilker, Traitor, Labeler,
TagDex, Tagger, Ilker, Traitor, Labeler, LabelDex,
Verser, Versage, )
from keri.core.coring import Kindage, Kinds
from keri.core.coring import (Sizage, MtrDex, Matter)
Expand Down Expand Up @@ -4274,11 +4275,186 @@ def test_labeler():
"""
Test Labeler subclass of Matter
"""


with pytest.raises(EmptyMaterialError):
labeler = Labeler() # defaults

# test taggable label
label = 'z'
raw = b''
code = LabelDex.Tag1
qb64 = '0J_z'
qb2 = decodeB64(qb64)

labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
assert labeler.soft == label
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code, soft=label)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label


# Test all sizes taggable labels
labels = ('A', 'AB', 'ABC', 'ABCD', 'ABCDE', 'ABCDEF', 'ABCDEFG', 'ABCDEFGH',
'ABCDEFGHI', 'ABCDEFGHIJ')

raw = b''
for i, label in enumerate(labels):
code = astuple(LabelDex)[i]
xs = Matter._xtraSize(code)
qb64 = code + ('_' * xs) + label
qb2 = decodeB64(qb64)

labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
assert labeler.soft == label
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code, soft=label)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label


# test bextable labels
label = 'zyxwvutsrqponm'
code = LabelDex.StrB64_L1
qb64 = '5AAEAAzyxwvutsrqponm'
qb2 = decodeB64(qb64)
raw = qb2[4:] # skip 3 for code and 1 for lead pad

labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
rs = (len(label) + len(label) % 4) // 4
assert labeler.soft == intToB64(rs, 2) == 'AE'
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code, soft=label)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label

# test textable labels
# fixed size short
label = '@'
code = LabelDex.Label1
raw = label.encode()
qb64 = 'VABA'
qb2 = decodeB64(qb64) # b'T\x00@'

labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
assert labeler.soft == ''
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label

label = '!$'
code = LabelDex.Label2
raw = label.encode()
qb64 = 'WCEk'
qb2 = decodeB64(qb64) # b'X!$'

labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
assert labeler.soft == ''
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label


# variable sized
label = '#yxwvutsrqponm'
code = LabelDex.Bytes_L1
raw = label.encode()
qb64 = '5BAFACN5eHd2dXRzcnFwb25t'
qb2 = decodeB64(qb64)


labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
assert labeler.soft == 'AF'
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label

# test base64 that starts with 'A' get encoded as textable, is not bextable
label = 'Ayxwvutsrqponm'
code = LabelDex.Bytes_L1
raw = label.encode()
qb64 = '5BAFAEF5eHd2dXRzcnFwb25t'
qb2 = decodeB64(qb64)


labeler = Labeler(label=label)
assert labeler.label == label
assert labeler.code == code
assert labeler.soft == 'AF'
assert labeler.raw == raw
assert labeler.qb64 == qb64
assert labeler.qb2 == qb2

labeler = Labeler(raw=raw, code=code)
assert labeler.label == label

labeler = Labeler(qb64=qb64)
assert labeler.label == label

labeler = Labeler(qb2=qb2)
assert labeler.label == label

""" Done Test """

Expand Down

0 comments on commit 227f9b0

Please sign in to comment.