Skip to content

Commit b3dd43b

Browse files
committed
refactor change tags in counting to Codens simplified. Removed tag init parameter
now code init parameter is polymorphic so can take code or code name (coden) started migrating coring.Counter to counting.Counter with gvrsn=Vrsn_1_0
1 parent 3c6e973 commit b3dd43b

File tree

9 files changed

+370
-313
lines changed

9 files changed

+370
-313
lines changed

src/keri/app/agenting.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from . import httping, forwarding
1818
from .. import help
1919
from .. import kering
20+
from .. import core
2021
from ..core import eventing, parsing, coring, serdering, indexing
2122
from ..core.coring import CtrDex
2223
from ..db import dbing
@@ -104,7 +105,7 @@ def receipt(self, pre, sn=None, auths=None):
104105
del rct[:rserder.size]
105106

106107
# pull off the count code
107-
coring.Counter(qb64b=rct, strip=True)
108+
core.Counter(qb64b=rct, strip=True, gvrsn=kering.Vrsn_1_0)
108109
rcts[wit] = rct
109110
else:
110111
print(f"invalid response {rep.status} from witnesses {wit}")
@@ -124,7 +125,8 @@ def receipt(self, pre, sn=None, auths=None):
124125
sn=sn,
125126
said=ser.said)
126127
msg.extend(rserder.raw)
127-
msg.extend(coring.Counter(code=CtrDex.NonTransReceiptCouples, count=len(wigs)).qb64b)
128+
msg.extend(core.Counter(core.Codens.NonTransReceiptCouples,
129+
count=len(wigs), gvrsn=kering.Vrsn_1_0).qb64b)
128130
for wig in wigs:
129131
msg.extend(wig)
130132

src/keri/core/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
from .coring import Tholder
1616
from .indexing import Indexer, Siger, IdrDex, IdxSigDex
1717
from .signing import Signer, Salter, Cipher, Encrypter, Decrypter
18-
from .counting import Counter
18+
from .counting import Counter, Codens

src/keri/core/counting.py

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
Provides versioning support for Counter classes and codes
66
"""
7+
import copy
78

89
from dataclasses import dataclass, astuple, asdict
910
from collections import namedtuple
@@ -147,18 +148,15 @@ def __iter__(self):
147148

148149
CtrDex_2_0 = CounterCodex_2_0()
149150

150-
# keys and values as strings of keys
151-
Codict1 = asdict(CtrDex_1_0)
152-
Tagage_1_0 = namedtuple("Tagage_1_0", list(Codict1), defaults=list(Codict1))
153-
Tags_1_0 = Tagage_1_0() # uses defaults
154-
155-
Codict2 = asdict(CtrDex_2_0)
156-
Tagage_2_0 = namedtuple("Tagage_2_0", list(Codict2), defaults=list(Codict2))
157-
Tags_2_0 = Tagage_2_0() # uses defaults
158-
159-
CodictAll = Codict2 | Codict1
160-
AllTagage = namedtuple("AllTagage", list(CodictAll), defaults=list(CodictAll))
161-
AllTags = AllTagage() # uses defaults
151+
# CodeNames is tuple of codes names given by attributes of union of codices
152+
CodeNames = tuple(asdict(CtrDex_2_0) | asdict(CtrDex_1_0))
153+
# Codens is namedtuple of CodeNames where its names are the code names
154+
# Codens enables using the attributes of the named tuple to specify a code by
155+
# name (indirection) so that changes in the code itself do not break the
156+
# creation of a counter. Enables specifying a counter by the code name not the
157+
# code itself. The code may change between versions but the code name does not.
158+
Codenage = namedtuple("Codenage", CodeNames, defaults=CodeNames)
159+
Codens = Codenage()
162160

163161

164162
@dataclass(frozen=True)
@@ -200,8 +198,9 @@ class Counter:
200198
Includes the following attributes and properties:
201199
202200
Class Attributes:
203-
Codes (dict): of codexes keyed by version
204-
Tags (dict): of tagages keyed by version
201+
Codes (dict): nested of codexes keyed by major and minor version
202+
Names (dict): nested of map of code names to codes keyed by
203+
major and minor version
205204
Hards (dict): of hard code sizes keyed by text domain selector
206205
Bards (dict): of hard code sizes keyed by binary domain selector
207206
Sizes (dict): of size tables keyed by version. Size table is dict
@@ -310,7 +309,15 @@ class Counter:
310309
},
311310
}
312311

313-
Tags = {Vrsn_1_0: Tags_1_0, Vrsn_2_0: Tags_2_0}
312+
313+
# invert dataclass codenames: codes to dict codes: codenames
314+
Names = copy.deepcopy(Codes) # make deep nested copy so can invert nested values
315+
for minor in Names.values():
316+
for key in minor:
317+
minor[key] = {val: key for key, val in asdict(minor[key]).items()}
318+
319+
320+
314321

315322
# Hards table maps from bytes Base64 first two code chars to int of
316323
# hard size, hs,(stable) of code. The soft size, ss, (unstable) for Counter
@@ -415,17 +422,16 @@ class Counter:
415422
}
416423

417424

418-
def __init__(self, tag=None, *, code = None, count=None, countB64=None,
425+
def __init__(self, code=None, *, count=None, countB64=None,
419426
qb64b=None, qb64=None, qb2=None, strip=False, gvrsn=Vrsn_2_0):
420427
"""
421428
Validate as fully qualified
422429
Parameters:
423-
tag (str | None): label of stable (hard) part of derivation code
424-
to lookup in codex so it can depend on version.
425-
takes precedence over code.
426-
code (str | None): stable (hard) part of derivation code
427-
if tag provided lookup code from tag
428-
else if tag is None and code provided use code.
430+
code (str | None): either stable (hard) part of derivation code or
431+
code name. When code name then look up code from
432+
._codes. This allows versioning to change code
433+
but keep stable code name.
434+
429435
count (int | None): count of framed material in quadlets/triplets
430436
for composition. Count does not include code.
431437
When both count and countB64 are None then count
@@ -466,14 +472,15 @@ def __init__(self, tag=None, *, code = None, count=None, countB64=None,
466472
self._version = gvrsn # provided version may be earlier than supported version
467473

468474

469-
if tag:
470-
if not hasattr(self._codes, tag):
471-
raise kering.InvalidCodeError(f"Unsupported {tag=}.")
472-
code = self._codes[tag]
473-
474-
if code is not None: # code (hard) provided
475+
if code: # code (hard) provided
476+
# assumes ._sizes ._codes coherent
475477
if code not in self._sizes or len(code) < 2:
476-
raise kering.InvalidCodeError(f"Unsupported {code=}.")
478+
try:
479+
code = self._codes[code] # code is code name so look up code
480+
if code not in self._sizes or len(code) < 2:
481+
raise kering.InvalidCodeError(f"Unsupported {code=}.")
482+
except Exception as ex:
483+
raise kering.InvalidCodeError(f"Unsupported {code=}.") from ex
477484

478485
hs, ss, fs, ls = self._sizes[code] # get sizes for code
479486
cs = hs + ss # both hard + soft code size
@@ -520,8 +527,7 @@ def __init__(self, tag=None, *, code = None, count=None, countB64=None,
520527
"(code and count) or qb64b or "
521528
"qb64 or qb2.")
522529

523-
codenames = { val: key for key, val in asdict(self.codes).items()} # map codes to code names
524-
self._tag = codenames[self.code]
530+
self._name = self.Names[gvrsn.major][latest][self.code]
525531

526532
@property
527533
def version(self):
@@ -547,13 +553,13 @@ def codes(self):
547553
"""
548554
return self._codes
549555

550-
@property
551-
def tags(self):
552-
"""
553-
Returns tags for current .version
554-
Makes .tags read only
555-
"""
556-
return self.Tags[self.version] # use own version
556+
#@property
557+
#def tags(self):
558+
#"""
559+
#Returns tags for current .version
560+
#Makes .tags read only
561+
#"""
562+
#return self.Tags[self.version] # use own version
557563

558564
@property
559565
def sizes(self):
@@ -574,25 +580,17 @@ def code(self):
574580
"""
575581
return self._code
576582

577-
@property
578-
def tag(self):
579-
"""
580-
Returns:
581-
tag (str): code name for self.code
582-
583-
Getter for ._tag. Makes .tag read only
584-
"""
585-
return self._tag
586-
587583
@property
588584
def name(self):
589585
"""
590586
Returns:
591-
name (str): code name for self.code alias of .tag. Match interface
587+
name (str): code name for self.code. Match interface
592588
for annotation for primitives like Matter
593589
590+
Getter for ._name. Makes .name read only
591+
594592
"""
595-
return self.tag
593+
return self._name
596594

597595

598596
@property

src/keri/core/serdering.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from .coring import (Matter, Saider, Verfer, Diger, Number, Tholder, Tagger,
3939
Ilker, Traitor, Verser, )
4040

41-
from .counting import GenDex, AllTags, Counter, SealDex_2_0
41+
from .counting import GenDex, Counter, Codens, SealDex_2_0
4242

4343
from .structing import Sealer, SClanDom
4444

@@ -1298,7 +1298,7 @@ def _dumps(self, sad=None, proto=None, vrsn=None):
12981298
for e in v: # list
12991299
frame.extend(e.encode("utf-8"))
13001300

1301-
val = bytearray(Counter(tag=AllTags.GenericListGroup,
1301+
val = bytearray(Counter(Codens.GenericListGroup,
13021302
count=len(frame) // 4).qb64b)
13031303
val.extend(frame)
13041304

@@ -1307,7 +1307,7 @@ def _dumps(self, sad=None, proto=None, vrsn=None):
13071307
for e in v: # list
13081308
frame.extend(Traitor(trait=e).qb64b)
13091309

1310-
val = bytearray(Counter(tag=AllTags.GenericListGroup,
1310+
val = bytearray(Counter(Codens.GenericListGroup,
13111311
count=len(frame) // 4).qb64b)
13121312
val.extend(frame)
13131313

@@ -1342,7 +1342,7 @@ def _dumps(self, sad=None, proto=None, vrsn=None):
13421342
#generic seal no count type (v, Mapping):
13431343
#for l, e in v.items():
13441344
#pass
1345-
#val = bytearray(Counter(tag=AllTags.GenericMapGroup,
1345+
#val = bytearray(Counter(tag=""GenericMapGroup"",
13461346
# count=len(frame) // 4).qb64b)
13471347
#val.extend(mapframe)
13481348

@@ -1352,7 +1352,7 @@ def _dumps(self, sad=None, proto=None, vrsn=None):
13521352
gframe = bytearray()
13531353
gcode = None
13541354

1355-
val = bytearray(Counter(tag=AllTags.GenericListGroup,
1355+
val = bytearray(Counter(Codens.GenericListGroup,
13561356
count=len(frame) // 4).qb64b)
13571357
val.extend(frame)
13581358

@@ -1378,7 +1378,7 @@ def _dumps(self, sad=None, proto=None, vrsn=None):
13781378
# prepend count code for message
13791379
if fixed:
13801380

1381-
raw = bytearray(Counter(tag=AllTags.FixedMessageBodyGroup,
1381+
raw = bytearray(Counter(Codens.FixedMessageBodyGroup,
13821382
count=len(bdy) // 4).qb64b)
13831383
raw.extend(bdy)
13841384
else:

src/keri/db/basing.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,55 +1556,55 @@ def cloneEvtMsg(self, pre, fn, dig):
15561556
# add indexed signatures to attachments
15571557
if not (sigs := self.getSigs(key=dgkey)):
15581558
raise kering.MissingEntryError("Missing sigs for dig={}.".format(dig))
1559-
atc.extend(coring.Counter(code=coring.CtrDex.ControllerIdxSigs,
1560-
count=len(sigs)).qb64b)
1559+
atc.extend(core.Counter(code=core.Codens.ControllerIdxSigs,
1560+
count=len(sigs), gvrsn=kering.Vrsn_1_0).qb64b)
15611561
for sig in sigs:
15621562
atc.extend(sig)
15631563

15641564
# add indexed witness signatures to attachments
15651565
if wigs := self.getWigs(key=dgkey):
1566-
atc.extend(coring.Counter(code=coring.CtrDex.WitnessIdxSigs,
1567-
count=len(wigs)).qb64b)
1566+
atc.extend(core.Counter(code=core.Codens.WitnessIdxSigs,
1567+
count=len(wigs), gvrsn=kering.Vrsn_1_0).qb64b)
15681568
for wig in wigs:
15691569
atc.extend(wig)
15701570

15711571
# add authorizer (delegator/issuer) source seal event couple to attachments
15721572
couple = self.getAes(dgkey)
15731573
if couple is not None:
1574-
atc.extend(coring.Counter(code=coring.CtrDex.SealSourceCouples,
1575-
count=1).qb64b)
1574+
atc.extend(core.Counter(code=core.Codens.SealSourceCouples,
1575+
count=1, gvrsn=kering.Vrsn_1_0).qb64b)
15761576
atc.extend(couple)
15771577

15781578
# add trans endorsement quadruples to attachments not controller
15791579
# may have been originally key event attachments or receipted endorsements
15801580
if quads := self.getVrcs(key=dgkey):
1581-
atc.extend(coring.Counter(code=coring.CtrDex.TransReceiptQuadruples,
1582-
count=len(quads)).qb64b)
1581+
atc.extend(core.Counter(code=core.Codens.TransReceiptQuadruples,
1582+
count=len(quads), gvrsn=kering.Vrsn_1_0).qb64b)
15831583
for quad in quads:
15841584
atc.extend(quad)
15851585

15861586
# add nontrans endorsement couples to attachments not witnesses
15871587
# may have been originally key event attachments or receipted endorsements
15881588
if coups := self.getRcts(key=dgkey):
1589-
atc.extend(coring.Counter(code=coring.CtrDex.NonTransReceiptCouples,
1590-
count=len(coups)).qb64b)
1589+
atc.extend(core.Counter(code=core.Codens.NonTransReceiptCouples,
1590+
count=len(coups), gvrsn=kering.Vrsn_1_0).qb64b)
15911591
for coup in coups:
15921592
atc.extend(coup)
15931593

15941594
# add first seen replay couple to attachments
15951595
if not (dts := self.getDts(key=dgkey)):
15961596
raise kering.MissingEntryError("Missing datetime for dig={}.".format(dig))
1597-
atc.extend(coring.Counter(code=coring.CtrDex.FirstSeenReplayCouples,
1598-
count=1).qb64b)
1597+
atc.extend(core.Counter(code=core.Codens.FirstSeenReplayCouples,
1598+
count=1, gvrsn=kering.Vrsn_1_0).qb64b)
15991599
atc.extend(core.Number(num=fn, code=core.NumDex.Huge).qb64b) # may not need to be Huge
16001600
atc.extend(coring.Dater(dts=bytes(dts)).qb64b)
16011601

16021602
# prepend pipelining counter to attachments
16031603
if len(atc) % 4:
16041604
raise ValueError("Invalid attachments size={}, nonintegral"
16051605
" quadlets.".format(len(atc)))
1606-
pcnt = coring.Counter(code=coring.CtrDex.AttachmentGroup,
1607-
count=(len(atc) // 4)).qb64b
1606+
pcnt = core.Counter(code=core.Codens.AttachmentGroup,
1607+
count=(len(atc) // 4), gvrsn=kering.Vrsn_1_0).qb64b
16081608
msg.extend(pcnt)
16091609
msg.extend(atc)
16101610
return msg

src/keri/vdr/credentialing.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .. import kering, help
1313
from ..app import agenting
1414
from ..app.habbing import GroupHab
15+
from .. import kering, core
1516
from ..core import parsing, coring, scheming, serdering
1617
from ..core.coring import Seqner, MtrDex
1718
from ..core.eventing import TraitDex
@@ -931,7 +932,8 @@ def sendCredential(hby, hab, reger, postman, creder, recp):
931932
postman.send(serder=source, attachment=atc)
932933

933934
serder, prefixer, seqner, saider = reger.cloneCred(creder.said)
934-
atc = bytearray(coring.Counter(coring.CtrDex.SealSourceTriples, count=1).qb64b)
935+
atc = bytearray(core.Counter(core.Codens.SealSourceTriples,
936+
count=1, gvrsn=kering.Vrsn_1_0).qb64b)
935937
atc.extend(prefixer.qb64b)
936938
atc.extend(seqner.qb64b)
937939
atc.extend(saider.qb64b)

tests/app/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from contextlib import contextmanager
66

77
from keri.app import habbing
8+
from keri import kering, core
89
from keri.core import coring, eventing, parsing
910
from keri.db import dbing
1011

@@ -54,8 +55,8 @@ def openMultiSig(prefix="test", salt=b'0123456789abcdef', temp=True, **kwa):
5455
sigs.extend(bytes(hab3.db.getSigs(dgkey)[0]))
5556

5657
evt = bytearray(eraw)
57-
evt.extend(coring.Counter(code=coring.CtrDex.ControllerIdxSigs,
58-
count=3).qb64b) # attach cnt
58+
evt.extend(core.Counter(code=core.Codens.ControllerIdxSigs,
59+
count=3, gvrsn=kering.Vrsn_1_0).qb64b) # attach cnt
5960
evt.extend(sigs)
6061

6162
parsing.Parser().parse(ims=bytearray(evt), kvy=kev3, local=True)

tests/app/test_agenting.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77

88
from hio.base import doing, tyming
99

10-
from keri import kering
11-
12-
from keri import core
13-
10+
from keri import kering, core
1411
from keri.core import coring, serdering
1512
from keri.core.coring import Counter, CtrDex, Seqner
1613
from keri.help import nowIso8601
@@ -158,7 +155,8 @@ def testDo(self, tymth, tock=0.0):
158155
serder = eventing.issue(vcdig=regser.pre,
159156
regk="EbA1o_bItVC9i6YB3hr2C3I_Gtqvz02vCmavJNoBA3Jg")
160157
msg = bytearray(serder.raw)
161-
msg.extend(Counter(CtrDex.SealSourceCouples, count=1).qb64b)
158+
msg.extend(core.Counter(core.Codens.SealSourceCouples, count=1,
159+
gvrsn=kering.Vrsn_1_0).qb64b)
162160
msg.extend(Seqner(sn=self.palHab.kever.sn).qb64b)
163161
msg.extend(self.palHab.kever.serder.saidb)
164162

0 commit comments

Comments
 (0)