core, work in progress: basic actions, env notifications

This commit is contained in:
Helmut Merz 2026-10-26 11:54:31 +01:00
parent 334df9afbd
commit bc12966b70
4 changed files with 38 additions and 13 deletions

View file

@ -13,10 +13,10 @@ from scopes.core.message import Message
from scopes import util from scopes import util
from scopes.util import keywords as k, Symbol, Symbols from scopes.util import keywords as k, Symbol, Symbols
# keywords (domains, actions, categories, stages, data keys): # keywords (domains, actions, classes, stages, data keys):
k('csys env', k('csys ctl env',
'connect create created data default value', 'connect create created data default query set value',
'c00 e00 s00', 'c00 e00 s00 rcvr op',
'initial active retired', 'initial active retired',
'address pred succ') 'address pred succ')
@ -52,7 +52,7 @@ def synapse(rcvr: Mailbox, op: SynOp = lambda x: x) -> Syn:
env_dummy: Mailbox = asyncio.Queue() env_dummy: Mailbox = asyncio.Queue()
def notify() -> Handler: def notify() -> Handler:
async def handle(msg, scope) -> None: async def handle(msg: Message, scope: Scope) -> None:
await scope.environ.put(msg) await scope.environ.put(msg)
return handle return handle
@ -118,27 +118,33 @@ async def create_zero(env: Mailbox) -> Mailbox:
# predefined action handlers and Action sets # predefined action handlers and Action sets
def forward() -> Handler: def forward() -> Handler:
async def handle(msg, scope) -> None: async def handle(msg: Message, scope: Scope) -> None:
for syn in scope.syns: for syn in scope.syns:
await syn(msg) await syn(msg)
return handle return handle
def value_add() -> Handler: def value_add() -> Handler:
async def handle(msg, scope) -> tuple[Message, Scope]: async def handle(msg: Message, scope: Scope) -> tuple[Message, Scope]:
return msg, scope return msg, scope
return handle return handle
def create() -> Handler: def create() -> Handler:
async def handle(msg, scope) -> None: async def handle(msg: Message, scope: Scope) -> None:
new = neuron(clone_scope(scope, **msg.data)) new = neuron(clone_scope(scope, **msg.data))
await notify_created(msg, new, scope) await notify_created(msg, new, scope)
conn = msg.data.get(k.connect)
return handle
def connect() -> Handler:
async def handle(msg: Message, scope: Scope) -> None:
return None return None
return handle return handle
def basic_actions() -> Actions: def basic_actions() -> Actions:
acts: Actions = { acts: Actions = {
k.value: value_add(), k.value: value_add(),
k.create: create() k.create: create(),
k.connect: connect()
} }
return acts return acts
@ -147,7 +153,8 @@ def basic_actions() -> Actions:
def std_proc(actions: Actions | None = None, finalize: Handler = forward(), def std_proc(actions: Actions | None = None, finalize: Handler = forward(),
more: Actions = {}) -> Proc: more: Actions = {}) -> Proc:
if actions is None: if actions is None:
actions = basic_actions() | more actions = basic_actions()
actions.update(more)
return gen_proc(actions, finalize=finalize) return gen_proc(actions, finalize=finalize)
# helpers # helpers

View file

@ -7,8 +7,22 @@ from scopes.core import actor
from scopes.core.message import Message from scopes.core.message import Message
from scopes.util import keywords as k from scopes.util import keywords as k
def create(meta_env: core.Mailbox) -> core.Mailbox: def create_env(meta_env: core.Mailbox) -> core.Mailbox:
scope = core.create_scope(meta_env, (k.env, k.c00), scope = core.create_scope(meta_env, (k.env, k.c00),
program=core.gen_program({})) program=core.gen_program({}, default=env_proc()))
return core.neuron(scope) return core.neuron(scope)
def env_proc() -> core.Proc:
return core.gen_proc(env_actions(), default=None, finalize=core.notify())
def handle_created() -> core.Handler:
async def handle(msg: Message, scope: core.Scope) -> Message:
return msg
return handle
def env_actions() -> core.Actions:
return {
k.created: handle_created(),
}

View file

@ -67,7 +67,7 @@ async def meta_env(collector):
@pytest.mark.anyio @pytest.mark.anyio
async def test_core(meta_env, collector): async def test_core(meta_env, collector):
env = environ.create(meta_env) env = environ.create_env(meta_env)
zero = await core.create_zero(env) zero = await core.create_zero(env)
await env.put(Message(k.env, k.hello)) await env.put(Message(k.env, k.hello))
await zero.put(Message(k.csys, k.hello)) await zero.put(Message(k.csys, k.hello))

View file

@ -11,11 +11,15 @@ k('dummy other', 'cd', 'new', 'erp')
dom = Symbols('dom')('crm erp sys') dom = Symbols('dom')('crm erp sys')
def test_keywords(): def test_keywords():
assert k.dummy == 'dummy'
assert k.dummy is not 'dummy'
assert k.dummy is k.dummy assert k.dummy is k.dummy
assert k.dummy is not k.other assert k.dummy is not k.other
assert getattr(k, "abcd"[-2:]) is k.cd assert getattr(k, "abcd"[-2:]) is k.cd
assert k['dummy'] is k.dummy assert k['dummy'] is k.dummy
assert k['new'] is k['new'] assert k['new'] is k['new']
assert dom.erp == 'dom.erp'
assert dom.erp is not 'dom.erp'
assert repr(dom.erp) == '<dom.erp>' assert repr(dom.erp) == '<dom.erp>'
assert dom.erp != k.erp assert dom.erp != k.erp