|
|
|
@@ -11,11 +11,12 @@ Link Child And Verify Tree
|
|
|
|
|
... from datetime import datetime, UTC
|
|
|
|
|
... from sqlalchemy import create_engine, event
|
|
|
|
|
... from sqlalchemy.orm import sessionmaker
|
|
|
|
|
... from sqlalchemy.pool import StaticPool
|
|
|
|
|
... from cleveragents.infrastructure.database.models import Base
|
|
|
|
|
... from cleveragents.infrastructure.database.repositories import ResourceTypeRepository, ResourceRepository
|
|
|
|
|
... from cleveragents.domain.models.core.resource_type import ResourceTypeSpec, ResourceKind, SandboxStrategy
|
|
|
|
|
... from cleveragents.domain.models.core.resource import Resource, PhysVirt, ResourceCapabilities
|
|
|
|
|
... engine = create_engine("sqlite:///:memory:")
|
|
|
|
|
... engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={"check_same_thread": False})
|
|
|
|
|
... @event.listens_for(engine, "connect")
|
|
|
|
|
... def _fk(conn, _): conn.cursor().execute("PRAGMA foreign_keys=ON")
|
|
|
|
|
... Base.metadata.create_all(engine)
|
|
|
|
@@ -47,11 +48,12 @@ Cycle Detection Rejects A To B To A
|
|
|
|
|
... from datetime import datetime, UTC
|
|
|
|
|
... from sqlalchemy import create_engine, event
|
|
|
|
|
... from sqlalchemy.orm import sessionmaker
|
|
|
|
|
... from sqlalchemy.pool import StaticPool
|
|
|
|
|
... from cleveragents.infrastructure.database.models import Base
|
|
|
|
|
... from cleveragents.infrastructure.database.repositories import ResourceTypeRepository, ResourceRepository, CycleDetectedError
|
|
|
|
|
... from cleveragents.domain.models.core.resource_type import ResourceTypeSpec, ResourceKind, SandboxStrategy
|
|
|
|
|
... from cleveragents.domain.models.core.resource import Resource, PhysVirt, ResourceCapabilities
|
|
|
|
|
... engine = create_engine("sqlite:///:memory:")
|
|
|
|
|
... engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={"check_same_thread": False})
|
|
|
|
|
... @event.listens_for(engine, "connect")
|
|
|
|
|
... def _fk(conn, _): conn.cursor().execute("PRAGMA foreign_keys=ON")
|
|
|
|
|
... Base.metadata.create_all(engine)
|
|
|
|
@@ -59,10 +61,12 @@ Cycle Detection Rejects A To B To A
|
|
|
|
|
... shared_session = factory()
|
|
|
|
|
... rt_repo = ResourceTypeRepository(lambda: shared_session)
|
|
|
|
|
... res_repo = ResourceRepository(lambda: shared_session)
|
|
|
|
|
... spec = ResourceTypeSpec(name="robot/cycle-type", description="Cycle", resource_kind=ResourceKind.PHYSICAL, sandbox_strategy=SandboxStrategy.NONE, user_addable=True, cli_args=[], parent_types=[], child_types=["robot/cycle-type"], auto_discovery=None, equivalence=None, handler=None, capabilities={"read": True, "write": True, "sandbox": True, "checkpoint": False}, built_in=False)
|
|
|
|
|
... rt_repo.create(spec)
|
|
|
|
|
... a = Resource(resource_id="01HDAGCYC000000000000000A1", name=None, resource_type_name="robot/cycle-type", classification=PhysVirt.PHYSICAL, properties={}, location=None, capabilities=ResourceCapabilities(), created_at=datetime.now(tz=UTC), updated_at=datetime.now(tz=UTC))
|
|
|
|
|
... b = Resource(resource_id="01HDAGCYC000000000000000B1", name=None, resource_type_name="robot/cycle-type", classification=PhysVirt.PHYSICAL, properties={}, location=None, capabilities=ResourceCapabilities(), created_at=datetime.now(tz=UTC), updated_at=datetime.now(tz=UTC))
|
|
|
|
|
... spec_a = ResourceTypeSpec(name="robot/cycle-a", description="Cycle A", resource_kind=ResourceKind.PHYSICAL, sandbox_strategy=SandboxStrategy.NONE, user_addable=True, cli_args=[], parent_types=[], child_types=["robot/cycle-b"], auto_discovery=None, equivalence=None, handler=None, capabilities={"read": True, "write": True, "sandbox": True, "checkpoint": False}, built_in=False)
|
|
|
|
|
... spec_b = ResourceTypeSpec(name="robot/cycle-b", description="Cycle B", resource_kind=ResourceKind.PHYSICAL, sandbox_strategy=SandboxStrategy.NONE, user_addable=True, cli_args=[], parent_types=[], child_types=["robot/cycle-a"], auto_discovery=None, equivalence=None, handler=None, capabilities={"read": True, "write": True, "sandbox": True, "checkpoint": False}, built_in=False)
|
|
|
|
|
... rt_repo.create(spec_a)
|
|
|
|
|
... rt_repo.create(spec_b)
|
|
|
|
|
... a = Resource(resource_id="01HDAGCYC000000000000000A1", name=None, resource_type_name="robot/cycle-a", classification=PhysVirt.PHYSICAL, properties={}, location=None, capabilities=ResourceCapabilities(), created_at=datetime.now(tz=UTC), updated_at=datetime.now(tz=UTC))
|
|
|
|
|
... b = Resource(resource_id="01HDAGCYC000000000000000B1", name=None, resource_type_name="robot/cycle-b", classification=PhysVirt.PHYSICAL, properties={}, location=None, capabilities=ResourceCapabilities(), created_at=datetime.now(tz=UTC), updated_at=datetime.now(tz=UTC))
|
|
|
|
|
... res_repo.create(a)
|
|
|
|
|
... res_repo.create(b)
|
|
|
|
|
... res_repo.link_child("01HDAGCYC000000000000000A1", "01HDAGCYC000000000000000B1")
|
|
|
|
@@ -84,11 +88,12 @@ Auto Discover Children
|
|
|
|
|
... from datetime import datetime, UTC
|
|
|
|
|
... from sqlalchemy import create_engine, event
|
|
|
|
|
... from sqlalchemy.orm import sessionmaker
|
|
|
|
|
... from sqlalchemy.pool import StaticPool
|
|
|
|
|
... from cleveragents.infrastructure.database.models import Base
|
|
|
|
|
... from cleveragents.infrastructure.database.repositories import ResourceTypeRepository, ResourceRepository
|
|
|
|
|
... from cleveragents.domain.models.core.resource_type import ResourceTypeSpec, ResourceKind, SandboxStrategy
|
|
|
|
|
... from cleveragents.domain.models.core.resource import Resource, PhysVirt, ResourceCapabilities
|
|
|
|
|
... engine = create_engine("sqlite:///:memory:")
|
|
|
|
|
... engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={"check_same_thread": False})
|
|
|
|
|
... @event.listens_for(engine, "connect")
|
|
|
|
|
... def _fk(conn, _): conn.cursor().execute("PRAGMA foreign_keys=ON")
|
|
|
|
|
... Base.metadata.create_all(engine)
|
|
|
|
|
✅ This change is correct. StaticPool with
connect_args={"check_same_thread": False}is the proper pattern for SQLite in-memory databases in test environments. The distinct resource types (robot/cycle-a/robot/cycle-b) with cross-referencingchild_typesproperly exercise cross-type cycle detection.Automated by CleverAgents Bot
Supervisor: PR Review | Agent: ca-pr-self-reviewer