diff --git a/scopes/core/message.py b/scopes/core/message.py index 9e79e53..e04a808 100644 --- a/scopes/core/message.py +++ b/scopes/core/message.py @@ -6,10 +6,15 @@ from scopes import shape class Message(shape.Record): - headFields = ['domain', 'action', 'class', 'item'] + headFields = ('domain', 'action', 'class', 'item') + headFieldsAsKeywords = {'domain', 'action', 'class'} customer = None - def __repr__(self): - return f'<{self.__class__.__name__}: {self.headValues}, {self.data}>' + def addr(self): + hv = self.headValues + return hv[0], hv[2], hv[3] + + def categ(self): + return self.domain, self.head['class'] diff --git a/scopes/shape.py b/scopes/shape.py index 2dc790e..5e198ac 100644 --- a/scopes/shape.py +++ b/scopes/shape.py @@ -2,21 +2,20 @@ """really abstract basic data shape definitions""" +from scopes.util import keywords as k + class Record: - headFields = [] # to be defined by subclass + headFields = () # to be defined by subclass + headFieldsAsKeywords = set() + defaultHeadValue = '' def __init__(self, *headValues, data=None, **kw): - self.head = {} + self.head = dict((k, self.defaultHeadValue) for k in self.headFields) for k, v in kw.items(): - if k in self.headFields: - self.head[k] = kw.pop(k) + self.set(k, v) for ix, hv in enumerate(headValues): - self.head[self.headFields[ix]] = hv - for k in self.headFields: - if self.head.get(k) is None: - self.head[k] = '' - setattr(self, k, self.head[k]) + self.set(self.headFields[ix], hv) self.data = data or {} @property @@ -26,7 +25,9 @@ class Record: def set(self, attr, value): if attr in self.headFields: if value is None: - value = '' + value = self.defaultHeadValue + elif attr in self.headFieldsAsKeywords: + value = k(value) self.head[attr] = value setattr(self, attr, value) else: @@ -41,7 +42,7 @@ class Record: self.data.update(data) def __repr__(self): - return '<%s: %s>' % (self.__class__.__name__, self.asDict()) + return f'<{self.__class__.__name__}: {self.headValues}, {self.data}>' def asDict(self): return dict(head=self.head, data=self.data) diff --git a/scopes/util.py b/scopes/util.py index e28a69a..94a41c9 100644 --- a/scopes/util.py +++ b/scopes/util.py @@ -19,6 +19,9 @@ class Symbols: setattr(self, k, sym) return sym + def __call__(self, k): + return getattr(self, k) + keywords = Symbols() diff --git a/tests/test_api.py b/tests/test_api.py index 619ef28..ab0f0ec 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -8,7 +8,6 @@ import os, sys import config from scopes.storage import tracking -import transaction import pytest from fastapi.testclient import TestClient @@ -26,7 +25,7 @@ def storage(): tr01 = tracking.Track('t01', 'john') tr01.update(dict(activity='testing')) trid01 = tracks.save(tr01) - transaction.commit() + storage.commit() return storage def async_client(): diff --git a/tests/test_message.py b/tests/test_message.py index 21cc86f..fb6b7cf 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -4,5 +4,13 @@ import pytest -from scopes.core.message import Message +from scopes.util import keywords as k + +def test_message(): + from scopes.core.message import Message + msg = Message(k.test, k.data, 'person', '4711', + data=dict(firstName='Bob', lastName='Miller')) + assert msg.head['class'] is k.person + assert msg.addr() == (k.test, k.person, '4711') + assert msg.categ() == (k.test, k.person) diff --git a/tests/test_util.py b/tests/test_util.py index 85599dc..d862b4c 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -10,4 +10,6 @@ def test_keywords(): assert k.dummy is k.dummy assert k.dummy is not k.other assert getattr(k, "abcd"[-2:]) is k.cd + assert k('dummy') is k.dummy + assert k('new') is k('new')