From c1bff58ad3146b7b4a4440601366a3e985b9984a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 17 Oct 2026 22:36:06 +0200 Subject: [PATCH] core, work in progress: scope creation, environment setup --- scopes/core/core.py | 13 ++++++++++--- scopes/core/environ.py | 14 ++++++++++++++ tests/test_core.py | 21 +++++++++++++++++---- 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 scopes/core/environ.py diff --git a/scopes/core/core.py b/scopes/core/core.py index 248a71a..825e537 100644 --- a/scopes/core/core.py +++ b/scopes/core/core.py @@ -1,6 +1,6 @@ # scopes.core.core -"""The scopes.core package""" +"""A concurrent cybernetic communication system""" from __future__ import annotations # no check of type annotations at runtime import asyncio @@ -11,6 +11,8 @@ from typing import Any from scopes.core.message import Message from scopes.util import keywords as k, Symbol +type Mailbox = asyncio.Queue +type Categ = tuple[Symbol, Symbol] type Proc = Callable[[Scope, Message], AsyncGenerator[Scope]] type Program = Callable[[Scope], Proc] type Syn = Callable[[Message], Message] @@ -22,13 +24,18 @@ async def proc_dummy(scope: Scope, msg: Message) -> AsyncGenerator[Scope]: class Scope: value: Any = 0 - categ: tuple[Symbol, Symbol] = (k.csys, k.c00) + categ: Categ = (k.csys, k.c00) stage: Symbol = k.initial proc: Proc = proc_dummy program: Program = lambda x: proc_dummy syns: list[Syn] = field(default_factory=list) - environ: asyncio.Queue = field(default_factory=asyncio.Queue) + environ: Mailbox = field(default_factory=asyncio.Queue) def set_proc(self) -> Scope: self.proc = self.program(self) return self + +def create_scope(env: Mailbox, cat=(k.csys, k.c00), **kw): + scope = Scope(environ=env, categ=cat, **kw) + return scope.set_proc() + diff --git a/scopes/core/environ.py b/scopes/core/environ.py new file mode 100644 index 0000000..33c6222 --- /dev/null +++ b/scopes/core/environ.py @@ -0,0 +1,14 @@ +# scopes.core.environ + +"""Defining an environment for the communication system""" + +from scopes import core +from scopes.core import actor +from scopes.util import keywords as k + +async def proc_env(scope, msg): + await scope.environ.put(msg) + +def create(meta_env): + return core.create_scope(meta_env, (k.env, k.c00), program=lambda x: proc_env) + diff --git a/tests/test_core.py b/tests/test_core.py index 37fbc58..913ff2a 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6,7 +6,7 @@ import asyncio import pytest from scopes import core -from scopes.core import actor, message +from scopes.core import actor, environ, message from scopes.util import keywords as k collector = [] @@ -26,6 +26,7 @@ async def handle_alt(msg): case k.show: show('switched') case _: await asyncio.sleep(0.01); show(msg) + @pytest.mark.anyio async def test_actor(): async with asyncio.TaskGroup() as group: @@ -53,7 +54,19 @@ def test_message(): assert msg.categ() == (k.test, k.person) -def test_core(): - sc = core.Scope() - assert sc.value == 0 +@pytest.fixture +def coll(): + return [] + +@pytest.fixture +async def meta_env(coll): + async def collect(msg): + coll.append(msg) + return actor.create(collect) + +@pytest.mark.anyio +async def test_core(meta_env, coll): + env_scope = environ.create(meta_env) + assert env_scope.value == 0 + await asyncio.sleep(0.01)