build(agent): molt-c#9d26e0 iteration
This commit is contained in:
parent
5b811e2552
commit
9f8ba0ee90
|
|
@ -5,6 +5,9 @@ This repository implements a minimal, Python-based MVP of GridVerse: a modular,
|
||||||
- Core concepts: Objects, Morphisms, Functors
|
- Core concepts: Objects, Morphisms, Functors
|
||||||
- Lightweight Registry for contracts and adapters
|
- Lightweight Registry for contracts and adapters
|
||||||
- Starter DER adapter and a small adapter marketplace scaffold
|
- Starter DER adapter and a small adapter marketplace scaffold
|
||||||
|
- Marketplace and Registry: lightweight in-process components for adapter discovery and contract validation.
|
||||||
|
- AdapterMarketplace (gridverse_open_low_code_platform_for_cro.marketplace) registers and lists adapters.
|
||||||
|
- ContractRegistry (gridverse_open_low_code_platform_for_cro.registry) validates and stores contract schemas.
|
||||||
- End-to-end tests and packaging skeleton
|
- End-to-end tests and packaging skeleton
|
||||||
|
|
||||||
How to run
|
How to run
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Dict, List
|
||||||
|
|
||||||
|
from .adapter import Adapter
|
||||||
|
|
||||||
|
|
||||||
|
class AdapterMarketplace:
|
||||||
|
"""Minimal in-process marketplace for adapters.
|
||||||
|
|
||||||
|
This lightweight scaffold allows registering adapters and querying them
|
||||||
|
by id. It is intentionally tiny to serve as a stepping stone toward a
|
||||||
|
fuller registry/marketplace without affecting the core MVP surface.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self._adapters: Dict[str, Adapter] = {}
|
||||||
|
|
||||||
|
def register_adapter(self, adapter: Adapter) -> None:
|
||||||
|
if not isinstance(adapter, Adapter): # type: ignore[unreachable]
|
||||||
|
raise TypeError("adapter must be an instance of Adapter")
|
||||||
|
self._adapters[adapter.adapter_id] = adapter
|
||||||
|
|
||||||
|
def list_adapters(self) -> List[str]:
|
||||||
|
return list(self._adapters.keys())
|
||||||
|
|
||||||
|
def get_adapter(self, adapter_id: str) -> Adapter:
|
||||||
|
return self._adapters[adapter_id]
|
||||||
|
|
@ -13,3 +13,22 @@ class Marketplace:
|
||||||
|
|
||||||
def get_entry(self, adapter_id: str) -> Dict[str, Any]:
|
def get_entry(self, adapter_id: str) -> Dict[str, Any]:
|
||||||
return self.entries[adapter_id]
|
return self.entries[adapter_id]
|
||||||
|
|
||||||
|
|
||||||
|
class AdapterMarketplace:
|
||||||
|
"""Lightweight in-process adapter marketplace compatible with tests."""
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self._adapters: Dict[str, Any] = {}
|
||||||
|
|
||||||
|
def register_adapter(self, adapter) -> None:
|
||||||
|
# Accept any object that provides an 'adapter_id' attribute
|
||||||
|
if not hasattr(adapter, "adapter_id"):
|
||||||
|
raise TypeError("adapter must expose an 'adapter_id' attribute")
|
||||||
|
self._adapters[adapter.adapter_id] = adapter
|
||||||
|
|
||||||
|
def list_adapters(self) -> List[str]: # type: ignore[override]
|
||||||
|
from typing import List # local import to avoid top-level import in small file
|
||||||
|
return list(self._adapters.keys())
|
||||||
|
|
||||||
|
def get_adapter(self, adapter_id: str): # type: ignore[return-type]
|
||||||
|
return self._adapters[adapter_id]
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
from gridverse_open_low_code_platform_for_cro.marketplace import AdapterMarketplace
|
||||||
|
from gridverse_open_low_code_platform_for_cro.adapters.starter_der_adapter import StarterDERAdapter
|
||||||
|
|
||||||
|
|
||||||
|
def test_marketplace_register_and_list_and_get():
|
||||||
|
marketplace = AdapterMarketplace()
|
||||||
|
adapter = StarterDERAdapter()
|
||||||
|
marketplace.register_adapter(adapter)
|
||||||
|
assert marketplace.list_adapters() == [adapter.adapter_id]
|
||||||
|
retrieved = marketplace.get_adapter(adapter.adapter_id)
|
||||||
|
assert isinstance(retrieved, StarterDERAdapter)
|
||||||
Loading…
Reference in New Issue