Skip to content

Commit 7edec90

Browse files
committed
attempt to refactor config system. separate subsystem ConfigLoader handles reading and writing to YAML, config components now separated by full/partial node, generating on missing logic moved to model validators, added support for non factories to dependency injection framework -- detects non callables, and Pydantic BaseModels and treats them as is
1 parent ab4eb0c commit 7edec90

File tree

24 files changed

+266
-249
lines changed

24 files changed

+266
-249
lines changed

examples/coordinator.py

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import logging
22
from rich.logging import RichHandler
3-
from pydantic import Field
43
from rid_lib.types import KoiNetNode, KoiNetEdge
5-
from koi_net.config import NodeConfig, KoiNetConfig, ServerConfig
6-
from koi_net.core import NodeAssembler
7-
from koi_net.protocol.node import NodeProfile, NodeProvides, NodeType
4+
from koi_net.config.full_node import (
5+
FullNodeConfig,
6+
ServerConfig,
7+
KoiNetConfig,
8+
NodeProfile,
9+
NodeProvides
10+
)
11+
from koi_net.core import FullNode
812
from koi_net.context import HandlerContext
913
from koi_net.processor.handler import HandlerType, KnowledgeHandler
1014
from koi_net.processor.knowledge_object import KnowledgeObject
@@ -22,22 +26,17 @@
2226
logger = logging.getLogger(__name__)
2327

2428

25-
class CoordinatorConfig(NodeConfig):
26-
server: ServerConfig = Field(default_factory=lambda:
27-
ServerConfig(port=8080)
28-
)
29-
koi_net: KoiNetConfig = Field(default_factory = lambda:
30-
KoiNetConfig(
31-
node_name="coordinator",
32-
node_profile=NodeProfile(
33-
node_type=NodeType.FULL,
34-
provides=NodeProvides(
35-
event=[KoiNetNode, KoiNetEdge],
36-
state=[KoiNetNode, KoiNetEdge]
37-
)
38-
),
39-
rid_types_of_interest=[KoiNetNode, KoiNetEdge]
40-
)
29+
class CoordinatorConfig(FullNodeConfig):
30+
server: ServerConfig = ServerConfig(port=8080)
31+
koi_net: KoiNetConfig = KoiNetConfig(
32+
node_name="coordinator",
33+
node_profile=NodeProfile(
34+
provides=NodeProvides(
35+
event=[KoiNetNode, KoiNetEdge],
36+
state=[KoiNetNode, KoiNetEdge]
37+
)
38+
),
39+
rid_types_of_interest=[KoiNetNode, KoiNetEdge]
4140
)
4241

4342
@KnowledgeHandler.create(
@@ -70,14 +69,10 @@ def handshake_handler(ctx: HandlerContext, kobj: KnowledgeObject):
7069
ctx.kobj_queue.put_kobj(rid=edge_bundle.rid, event_type=EventType.FORGET)
7170
ctx.kobj_queue.put_kobj(bundle=edge_bundle)
7271

73-
class CoordinatorNodeAssembler(NodeAssembler):
72+
class CoordinatorNode(FullNode):
7473
config = CoordinatorConfig
75-
knowledge_handlers = [
76-
*NodeAssembler.knowledge_handlers,
77-
handshake_handler
78-
]
79-
74+
knowledge_handlers = FullNode.knowledge_handlers + [handshake_handler]
8075

8176
if __name__ == "__main__":
82-
node = CoordinatorNodeAssembler.create()
83-
node.server.run()
77+
node = CoordinatorNode()
78+
node.entrypoint.run()

examples/partial.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import logging
2-
from pydantic import Field
32
from rich.logging import RichHandler
4-
from koi_net.core import NodeAssembler
5-
from koi_net.protocol.node import NodeProfile, NodeType
6-
from koi_net.config import NodeConfig, KoiNetConfig
3+
from koi_net.config.partial_node import PartialNodeConfig, KoiNetConfig, NodeProfile
4+
from koi_net.core import PartialNode
5+
76

87
logging.basicConfig(
98
level=logging.INFO,
@@ -16,20 +15,16 @@
1615
logger = logging.getLogger(__name__)
1716

1817

19-
class PartialNodeConfig(NodeConfig):
20-
koi_net: KoiNetConfig = Field(default_factory = lambda:
21-
KoiNetConfig(
22-
node_name="partial",
23-
node_profile=NodeProfile(
24-
node_type=NodeType.PARTIAL
25-
)
26-
)
18+
class MyPartialNodeConfig(PartialNodeConfig):
19+
koi_net: KoiNetConfig = KoiNetConfig(
20+
node_name="partial",
21+
node_profile=NodeProfile()
2722
)
2823

29-
class PartialNodeAssembler(NodeAssembler):
30-
config = PartialNodeConfig
24+
class MyPartialNode(PartialNode):
25+
config_cls = MyPartialNodeConfig
3126

3227

3328
if __name__ == "__main__":
34-
node = PartialNodeAssembler.create()
35-
node.poller.run()
29+
node = MyPartialNode()
30+
# node.entrypoint.run()

src/koi_net/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
from . import logger
2-
from . import sentry

src/koi_net/assembler.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Protocol
33
from dataclasses import make_dataclass
44

5+
from pydantic import BaseModel
56
import structlog
67

78
from .interfaces.entrypoint import EntryPoint
@@ -41,13 +42,25 @@ def __new__(self) -> NodeContainer:
4142
@classmethod
4243
def _build(cls) -> NodeContainer:
4344
components = {}
44-
for comp_name in cls._build_order:
45-
comp_factory = getattr(cls, comp_name, None)
45+
for comp_name in cls._build_order:
46+
comp = getattr(cls, comp_name, None)
4647

47-
if comp_factory is None:
48+
if comp is None:
4849
raise Exception(f"Couldn't find factory for component '{comp_name}'")
4950

50-
sig = inspect.signature(comp_factory)
51+
print(comp_name)
52+
53+
if not callable(comp):
54+
print(f"Treating {comp_name} as a literal")
55+
components[comp_name] = comp
56+
continue
57+
58+
if issubclass(comp, BaseModel):
59+
print(f"Treating {comp_name} as a pydantic model")
60+
components[comp_name] = comp
61+
continue
62+
63+
sig = inspect.signature(comp)
5164

5265
required_comps = []
5366
for name, param in sig.parameters.items():
@@ -58,7 +71,7 @@ def _build(cls) -> NodeContainer:
5871
else:
5972
s = f"{comp_name} -> {', '.join([name for name, _type in required_comps])}"
6073

61-
print(s.replace("graph", "_graph"), end=";\n")
74+
# print(s.replace("graph", "_graph"), end=";\n")
6275

6376
dependencies = {}
6477
for req_comp_name, req_comp_type in required_comps:
@@ -67,7 +80,7 @@ def _build(cls) -> NodeContainer:
6780

6881
dependencies[req_comp_name] = components[req_comp_name]
6982

70-
components[comp_name] = comp_factory(**dependencies)
83+
components[comp_name] = comp(**dependencies)
7184

7285
NodeContainer = make_dataclass(
7386
cls_name="NodeContainer",

src/koi_net/cli/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from pydantic import BaseModel, Field, PrivateAttr
1+
from pydantic import BaseModel, PrivateAttr
22
from ruamel.yaml import YAML
33

44

55
class KoiNetworkConfig(BaseModel):
6-
nodes: dict[str, str] = Field(default_factory=dict)
6+
nodes: dict[str, str] = {}
77
_file_path: str = PrivateAttr(default="koi-net-config.yaml")
88

99
@classmethod

src/koi_net/config.py

Lines changed: 0 additions & 161 deletions
This file was deleted.

0 commit comments

Comments
 (0)