Skip to content

Commit 227f9b0

Browse files
committed
Labeler finished with unit tests
1 parent 56535e3 commit 227f9b0

File tree

2 files changed

+204
-23
lines changed

2 files changed

+204
-23
lines changed

Diff for: src/keri/core/coring.py

+24-19
Original file line numberDiff line numberDiff line change
@@ -2999,7 +2999,6 @@ class Labeler(Matter):
29992999
(See Matter)
30003000
30013001
Hidden:
3002-
_label (str): base value without encoding
30033002
30043003
Methods:
30053004
@@ -3015,8 +3014,6 @@ def __init__(self, label='', raw=None, code=None, soft=None, **kwa):
30153014
label (str | bytes): base value before encoding
30163015
30173016
"""
3018-
self._label = None
3019-
30203017
if label:
30213018
if hasattr(label, "encode"): # make label bytes
30223019
label = label.encode("utf-8")
@@ -3025,41 +3022,49 @@ def __init__(self, label='', raw=None, code=None, soft=None, **kwa):
30253022
try:
30263023
code = Tagger._codify(tag=label)
30273024
soft = label
3025+
30283026
except InvalidSoftError as ex: # too big
3029-
if label[0] != b'A': # use Bexter code
3030-
code = MtrDex.StrB64_L0
3031-
raw = Bexter.rawify(label)
3032-
else: # use Texter code
3033-
code = MtrDex.Bytes_L0
3027+
if label[0] != ord(b'A'): # use Bexter code
3028+
code = LabelDex.StrB64_L0
3029+
raw = Bexter._rawify(label)
3030+
3031+
else: # use Texter code since ambiguity if starts with 'A'
3032+
code = LabelDex.Bytes_L0
30343033
raw = label
3034+
30353035
else:
30363036
if len(label) == 1:
3037-
code = MtrDex.Label1
3037+
code = LabelDex.Label1
3038+
30383039
elif len(label) == 2:
3039-
code = MtrDex.Label2
3040+
code = LabelDex.Label2
3041+
30403042
else:
3041-
code = MtrDex.Bytes_L0
3042-
raw = label
3043+
code = LabelDex.Bytes_L0
30433044

3044-
self._label = label.decode() # convert bytes to str
3045+
raw = label
30453046

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

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

3052-
# need way to extract label from raw and code
3052+
30533053

30543054
@property
30553055
def label(self):
3056-
"""Returns:
3056+
"""Extracts and returns label from .code and .soft or .code and .raw
3057+
3058+
Returns:
30573059
label (str): base value without encoding
3060+
"""
3061+
if self.code in TagDex: # tag
3062+
return self.soft # soft part of code
30583063

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

3061-
"""
3062-
return self._label
3067+
return self.raw.decode() # everything else is just raw as str
30633068

30643069

30653070

Diff for: tests/core/test_coring.py

+180-4
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@
3333
from keri.kering import Protocols, Protocolage, Ilkage, Ilks, TraitDex
3434

3535
from keri.help import helping
36-
from keri.help.helping import (sceil, intToB64, intToB64b, b64ToInt, codeB64ToB2, codeB2ToB64,
36+
from keri.help.helping import (sceil, intToB64, intToB64b, b64ToInt,
37+
codeB64ToB2, codeB2ToB64,
3738
B64_CHARS, Reb64, nabSextets)
3839

3940
from keri import core
4041
from keri.core import coring
4142
from keri.core.coring import (Saids, Sadder, Tholder, Seqner, NumDex, Number,
4243
Dater, Bexter, Texter,
43-
TagDex, Tagger, Ilker, Traitor, Labeler,
44+
TagDex, Tagger, Ilker, Traitor, Labeler, LabelDex,
4445
Verser, Versage, )
4546
from keri.core.coring import Kindage, Kinds
4647
from keri.core.coring import (Sizage, MtrDex, Matter)
@@ -4274,11 +4275,186 @@ def test_labeler():
42744275
"""
42754276
Test Labeler subclass of Matter
42764277
"""
4277-
4278-
42794278
with pytest.raises(EmptyMaterialError):
42804279
labeler = Labeler() # defaults
42814280

4281+
# test taggable label
4282+
label = 'z'
4283+
raw = b''
4284+
code = LabelDex.Tag1
4285+
qb64 = '0J_z'
4286+
qb2 = decodeB64(qb64)
4287+
4288+
labeler = Labeler(label=label)
4289+
assert labeler.label == label
4290+
assert labeler.code == code
4291+
assert labeler.soft == label
4292+
assert labeler.raw == raw
4293+
assert labeler.qb64 == qb64
4294+
assert labeler.qb2 == qb2
4295+
4296+
labeler = Labeler(raw=raw, code=code, soft=label)
4297+
assert labeler.label == label
4298+
4299+
labeler = Labeler(qb64=qb64)
4300+
assert labeler.label == label
4301+
4302+
labeler = Labeler(qb2=qb2)
4303+
assert labeler.label == label
4304+
4305+
4306+
# Test all sizes taggable labels
4307+
labels = ('A', 'AB', 'ABC', 'ABCD', 'ABCDE', 'ABCDEF', 'ABCDEFG', 'ABCDEFGH',
4308+
'ABCDEFGHI', 'ABCDEFGHIJ')
4309+
4310+
raw = b''
4311+
for i, label in enumerate(labels):
4312+
code = astuple(LabelDex)[i]
4313+
xs = Matter._xtraSize(code)
4314+
qb64 = code + ('_' * xs) + label
4315+
qb2 = decodeB64(qb64)
4316+
4317+
labeler = Labeler(label=label)
4318+
assert labeler.label == label
4319+
assert labeler.code == code
4320+
assert labeler.soft == label
4321+
assert labeler.raw == raw
4322+
assert labeler.qb64 == qb64
4323+
assert labeler.qb2 == qb2
4324+
4325+
labeler = Labeler(raw=raw, code=code, soft=label)
4326+
assert labeler.label == label
4327+
4328+
labeler = Labeler(qb64=qb64)
4329+
assert labeler.label == label
4330+
4331+
labeler = Labeler(qb2=qb2)
4332+
assert labeler.label == label
4333+
4334+
4335+
# test bextable labels
4336+
label = 'zyxwvutsrqponm'
4337+
code = LabelDex.StrB64_L1
4338+
qb64 = '5AAEAAzyxwvutsrqponm'
4339+
qb2 = decodeB64(qb64)
4340+
raw = qb2[4:] # skip 3 for code and 1 for lead pad
4341+
4342+
labeler = Labeler(label=label)
4343+
assert labeler.label == label
4344+
assert labeler.code == code
4345+
rs = (len(label) + len(label) % 4) // 4
4346+
assert labeler.soft == intToB64(rs, 2) == 'AE'
4347+
assert labeler.raw == raw
4348+
assert labeler.qb64 == qb64
4349+
assert labeler.qb2 == qb2
4350+
4351+
labeler = Labeler(raw=raw, code=code, soft=label)
4352+
assert labeler.label == label
4353+
4354+
labeler = Labeler(qb64=qb64)
4355+
assert labeler.label == label
4356+
4357+
labeler = Labeler(qb2=qb2)
4358+
assert labeler.label == label
4359+
4360+
# test textable labels
4361+
# fixed size short
4362+
label = '@'
4363+
code = LabelDex.Label1
4364+
raw = label.encode()
4365+
qb64 = 'VABA'
4366+
qb2 = decodeB64(qb64) # b'T\x00@'
4367+
4368+
labeler = Labeler(label=label)
4369+
assert labeler.label == label
4370+
assert labeler.code == code
4371+
assert labeler.soft == ''
4372+
assert labeler.raw == raw
4373+
assert labeler.qb64 == qb64
4374+
assert labeler.qb2 == qb2
4375+
4376+
labeler = Labeler(raw=raw, code=code)
4377+
assert labeler.label == label
4378+
4379+
labeler = Labeler(qb64=qb64)
4380+
assert labeler.label == label
4381+
4382+
labeler = Labeler(qb2=qb2)
4383+
assert labeler.label == label
4384+
4385+
label = '!$'
4386+
code = LabelDex.Label2
4387+
raw = label.encode()
4388+
qb64 = 'WCEk'
4389+
qb2 = decodeB64(qb64) # b'X!$'
4390+
4391+
labeler = Labeler(label=label)
4392+
assert labeler.label == label
4393+
assert labeler.code == code
4394+
assert labeler.soft == ''
4395+
assert labeler.raw == raw
4396+
assert labeler.qb64 == qb64
4397+
assert labeler.qb2 == qb2
4398+
4399+
labeler = Labeler(raw=raw, code=code)
4400+
assert labeler.label == label
4401+
4402+
labeler = Labeler(qb64=qb64)
4403+
assert labeler.label == label
4404+
4405+
labeler = Labeler(qb2=qb2)
4406+
assert labeler.label == label
4407+
4408+
4409+
# variable sized
4410+
label = '#yxwvutsrqponm'
4411+
code = LabelDex.Bytes_L1
4412+
raw = label.encode()
4413+
qb64 = '5BAFACN5eHd2dXRzcnFwb25t'
4414+
qb2 = decodeB64(qb64)
4415+
4416+
4417+
labeler = Labeler(label=label)
4418+
assert labeler.label == label
4419+
assert labeler.code == code
4420+
assert labeler.soft == 'AF'
4421+
assert labeler.raw == raw
4422+
assert labeler.qb64 == qb64
4423+
assert labeler.qb2 == qb2
4424+
4425+
labeler = Labeler(raw=raw, code=code)
4426+
assert labeler.label == label
4427+
4428+
labeler = Labeler(qb64=qb64)
4429+
assert labeler.label == label
4430+
4431+
labeler = Labeler(qb2=qb2)
4432+
assert labeler.label == label
4433+
4434+
# test base64 that starts with 'A' get encoded as textable, is not bextable
4435+
label = 'Ayxwvutsrqponm'
4436+
code = LabelDex.Bytes_L1
4437+
raw = label.encode()
4438+
qb64 = '5BAFAEF5eHd2dXRzcnFwb25t'
4439+
qb2 = decodeB64(qb64)
4440+
4441+
4442+
labeler = Labeler(label=label)
4443+
assert labeler.label == label
4444+
assert labeler.code == code
4445+
assert labeler.soft == 'AF'
4446+
assert labeler.raw == raw
4447+
assert labeler.qb64 == qb64
4448+
assert labeler.qb2 == qb2
4449+
4450+
labeler = Labeler(raw=raw, code=code)
4451+
assert labeler.label == label
4452+
4453+
labeler = Labeler(qb64=qb64)
4454+
assert labeler.label == label
4455+
4456+
labeler = Labeler(qb2=qb2)
4457+
assert labeler.label == label
42824458

42834459
""" Done Test """
42844460

0 commit comments

Comments
 (0)