Skip to content

Commit 426ac04

Browse files
committed
cleanup code
1 parent 4e82ef4 commit 426ac04

File tree

17 files changed

+334
-317
lines changed

17 files changed

+334
-317
lines changed

pyproject.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@ requires = [
33
"setuptools>=42",
44
"wheel"
55
]
6-
build-backend = "setuptools.build_meta"
6+
build-backend = "setuptools.build_meta"
7+
[tool.pytest.ini_options]
8+
pythonpath = [
9+
"src"
10+
]

src/olink/client/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .sink import IObjectSink as IObjectSink
2+
from .node import ClientNode as ClientNode
3+
from .node import InvokeReplyArg as InvokeReplyArg
4+
from .registry import ClientRegistry as ClientRegistry
5+
from .registry import get_client_registry as get_client_registry
Lines changed: 6 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
from re import A
2-
from typing import Any, Callable, Optional, Protocol as ProtocolType
3-
from olink.core.types import Base, LogLevel, MsgType, Name
4-
from olink.core.node import BaseNode
5-
from olink.core.protocol import Protocol
61

2+
from typing import Any, Optional, Callable
3+
from olink.core import LogLevel, MsgType, BaseNode, Protocol
4+
from .registry import ClientRegistry, get_client_registry
5+
from .sink import IObjectSink
76

87
class InvokeReplyArg:
98
def __init__(self, name: str, value: Any):
@@ -16,108 +15,6 @@ def __init__(self, name: str, value: Any):
1615

1716
InvokeReplyFunc = Callable[[InvokeReplyArg], None]
1817

19-
20-
class IObjectSink(ProtocolType):
21-
# interface for object sinks
22-
def olink_object_name() -> str:
23-
# return object name
24-
raise NotImplementedError()
25-
26-
def olink_on_signal(self, name: str, args: list[Any]) -> None:
27-
# called on signal message
28-
raise NotImplementedError()
29-
30-
def olink_on_property_changed(self, name: str, value: Any) -> None:
31-
# called on property changed message
32-
raise NotImplementedError()
33-
34-
def olink_on_init(self, name: str, props: object, node: "ClientNode"):
35-
# called on init message
36-
raise NotImplementedError()
37-
38-
def olink_on_release(self) -> None:
39-
# called when sink is released
40-
raise NotImplementedError()
41-
42-
43-
class SinkToClientEntry:
44-
# entry in the client registry
45-
sink: IObjectSink = None
46-
node: "ClientNode" = None
47-
48-
def __init__(self, sink=None):
49-
self.sink = sink
50-
self.node = None
51-
52-
53-
class ClientRegistry(Base):
54-
# client side registry to link sinks to nodes
55-
entries: dict[str, SinkToClientEntry] = {}
56-
57-
def remove_node(self, node: "ClientNode"):
58-
# remove node from all sinks
59-
for entry in self.entries.values():
60-
if entry.node is node:
61-
entry.node = None
62-
63-
def add_node_to_sink(self, name: str, node: "ClientNode"):
64-
# add not to named sink
65-
self._entry(name).node = node
66-
67-
def remove_node_from_sink(self, name: str, node: "ClientNode"):
68-
# remove node from named sink
69-
resource = Name.resource_from_name(name)
70-
if resource in self.entries:
71-
if self.entries[resource].node is node:
72-
self.entries[resource].node = None
73-
else:
74-
self.emit_log(
75-
LogLevel.DEBUG, f"unlink node failed, not the same node: {resource}"
76-
)
77-
78-
def register_sink(self, sink: IObjectSink) -> "ClientNode":
79-
# register sink using object name
80-
name = sink.olink_object_name()
81-
entry = self._entry(name)
82-
entry.sink = sink
83-
return entry.node
84-
85-
def unregister_sink(self, sink: IObjectSink):
86-
# unregister sink using object name
87-
name = sink.olink_object_name()
88-
self._remove_entry(name)
89-
90-
def get_sink(self, name: str) -> Optional[IObjectSink]:
91-
# get sink using name
92-
return self._entry(name).sink
93-
94-
def get_node(self, name: str) -> Optional["ClientNode"]:
95-
# get node using name
96-
return self._entry(name).node
97-
98-
def _entry(self, name: str) -> SinkToClientEntry:
99-
# get an entry by name
100-
resource = Name.resource_from_name(name)
101-
if not resource in self.entries:
102-
self.emit_log(LogLevel.DEBUG, f"add new resource: {resource}")
103-
self.entries[resource] = SinkToClientEntry()
104-
return self.entries[resource]
105-
106-
def _remove_entry(self, name: str) -> None:
107-
# remove an entry by name
108-
resource = Name.resource_from_name(name)
109-
del self.entries[resource]
110-
111-
112-
# global client registry
113-
_registry = ClientRegistry()
114-
115-
116-
def get_client_registry() -> ClientRegistry:
117-
# get global client registry
118-
return _registry
119-
120-
12118
class ClientNode(BaseNode):
12219
# client side node
12320
invokes_pending: dict[int, InvokeReplyFunc] = {}
@@ -143,7 +40,7 @@ def invoke_remote(
14340
self.emit_write(Protocol.invoke_message(request_id, name, args))
14441

14542
def set_remote_property(self, name: str, value: Any) -> None:
146-
# send remote propertymessage
43+
# send remote property message
14744
self.emit_log(LogLevel.DEBUG, f"ClientNode.set_remote_property: {name} {value}")
14845
self.emit_write(Protocol.set_property_message(name, value))
14946

@@ -177,7 +74,7 @@ def link_remote(self, name: str):
17774
self.emit_write(Protocol.link_message(name))
17875

17976
def unlink_remote(self, name: str):
180-
# unlink this node froom sink and send an unlink message
77+
# unlink this node from sink and send an unlink message
18178
self.emit_log(LogLevel.DEBUG, f"ClientNode.unlink_remote: {name}")
18279
self.emit_write(Protocol.unlink_message(name))
18380
self.registry().remove_node_from_sink(name, self)

src/olink/client/registry.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from typing import Optional
2+
from olink.core import LogLevel, Base, Name
3+
from .sink import IObjectSink
4+
5+
6+
class SinkToClientEntry:
7+
# entry in the client registry
8+
sink: IObjectSink = None
9+
node: "ClientNode" = None
10+
11+
def __init__(self, sink=None):
12+
self.sink = sink
13+
self.node = None
14+
15+
16+
class ClientRegistry(Base):
17+
# client side registry to link sinks to nodes
18+
entries: dict[str, SinkToClientEntry] = {}
19+
20+
def remove_node(self, node: "ClientNode"):
21+
# remove node from all sinks
22+
for entry in self.entries.values():
23+
if entry.node is node:
24+
entry.node = None
25+
26+
def add_node_to_sink(self, name: str, node: "ClientNode"):
27+
# add not to named sink
28+
self._entry(name).node = node
29+
30+
def remove_node_from_sink(self, name: str, node: "ClientNode"):
31+
# remove node from named sink
32+
resource = Name.resource_from_name(name)
33+
if resource in self.entries:
34+
if self.entries[resource].node is node:
35+
self.entries[resource].node = None
36+
else:
37+
self.emit_log(
38+
LogLevel.DEBUG, f"unlink node failed, not the same node: {resource}"
39+
)
40+
41+
def register_sink(self, sink: IObjectSink) -> "ClientNode":
42+
# register sink using object name
43+
name = sink.olink_object_name()
44+
entry = self._entry(name)
45+
entry.sink = sink
46+
return entry.node
47+
48+
def unregister_sink(self, sink: IObjectSink):
49+
# unregister sink using object name
50+
name = sink.olink_object_name()
51+
self._remove_entry(name)
52+
53+
def get_sink(self, name: str) -> Optional[IObjectSink]:
54+
# get sink using name
55+
return self._entry(name).sink
56+
57+
def get_node(self, name: str) -> Optional["ClientNode"]:
58+
# get node using name
59+
return self._entry(name).node
60+
61+
def _entry(self, name: str) -> SinkToClientEntry:
62+
# get an entry by name
63+
resource = Name.resource_from_name(name)
64+
if not resource in self.entries:
65+
self.emit_log(LogLevel.DEBUG, f"add new resource: {resource}")
66+
self.entries[resource] = SinkToClientEntry()
67+
return self.entries[resource]
68+
69+
def _remove_entry(self, name: str) -> None:
70+
# remove an entry by name
71+
resource = Name.resource_from_name(name)
72+
del self.entries[resource]
73+
74+
75+
# global client registry
76+
_registry = ClientRegistry()
77+
78+
79+
def get_client_registry() -> ClientRegistry:
80+
# get global client registry
81+
return _registry
82+
83+

src/olink/client/sink.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import Any, Protocol as ProtocolType
2+
3+
class IObjectSink(ProtocolType):
4+
# interface for object sinks
5+
def olink_object_name() -> str:
6+
# return object name
7+
raise NotImplementedError()
8+
9+
def olink_on_signal(self, name: str, args: list[Any]) -> None:
10+
# called on signal message
11+
raise NotImplementedError()
12+
13+
def olink_on_property_changed(self, name: str, value: Any) -> None:
14+
# called on property changed message
15+
raise NotImplementedError()
16+
17+
def olink_on_init(self, name: str, props: object, node: "ClientNode"):
18+
# called on init message
19+
raise NotImplementedError()
20+
21+
def olink_on_release(self) -> None:
22+
# called when sink is released
23+
raise NotImplementedError()

src/olink/core/protocol.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from typing import Any
2-
from typing import Protocol as ProtocolType
1+
from typing import Any, Protocol as ProtocolType
32
from .types import Base, LogLevel, MsgType
43

54

src/olink/mocks/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .mocksink import MockSink as MockSink
2+
from .mocksource import MockSource as MockSource

src/olink/mocks/mocksink.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from olink.core.types import Name
21
from typing import Any, Optional
3-
from olink.clientnode import ClientNode, IObjectSink, InvokeReplyArg
2+
from olink.core import Name
3+
from olink.client import ClientNode, IObjectSink, InvokeReplyArg
44

55

66
class MockSink(IObjectSink):

src/olink/mocks/mocksource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from olink.core.types import Name
21
from typing import Any
3-
from olink.remotenode import IObjectSource, RemoteNode
2+
from olink.core import Name
3+
from olink.remote import IObjectSource, RemoteNode
44

55

66
class MockSource(IObjectSource):

src/olink/remote/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from .source import IObjectSource as IObjectSource
2+
from .registry import RemoteRegistry as RemoteRegistry
3+
from .registry import get_remote_registry as get_remote_registry
4+
from .node import RemoteNode as RemoteNode

0 commit comments

Comments
 (0)