Skip to content

Commit cb0a535

Browse files
committed
api rework
1 parent 94b9baf commit cb0a535

File tree

10 files changed

+195
-137
lines changed

10 files changed

+195
-137
lines changed

.vscode/settings.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
{
2-
"python.testing.pytestEnabled": true,
3-
"python.testing.cwd": ".",
4-
"python.analysis.logLevel": "Information",
5-
"python.testing.nosetestsEnabled": false,
6-
"python.testing.unittestEnabled": false,
7-
}
2+
"python.testing.pytestEnabled": true
3+
}

examples/app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Counter(IObjectSink):
99
count = 0
1010
client = None
1111
def __init__(self):
12-
self.client = ClientNode.add_object_sink(self)
12+
self.client = ClientNode.register_sink(self)
1313
print('client', self.client)
1414

1515
def increment(self):

examples/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class CounterAdapter(IObjectSource):
2121
node: RemoteNode = None
2222
def __init__(self, impl):
2323
self.impl = impl
24-
RemoteNode.add_object_source(self)
24+
RemoteNode.register_source(self)
2525

2626
def olink_object_name(self):
2727
return 'demo.Counter'

src/olink/clientnode.py

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,23 @@ def __init__(self, name: str, value: Any):
1616

1717
class IObjectSink(ProtocolType):
1818
def olink_object_name() -> str:
19+
# return object name
1920
raise NotImplementedError()
2021

2122
def olink_on_signal(self, name: str, args: list[Any]) -> None:
23+
# called on signal message
2224
raise NotImplementedError()
2325

2426
def olink_on_property_changed(self, name: str, value: Any) -> None:
27+
# called on property changed message
2528
raise NotImplementedError()
2629

2730
def olink_on_init(self, name: str, props: object, node: "ClientNode"):
31+
# called on init message
2832
raise NotImplementedError()
2933

3034
def olink_on_release(self) -> None:
35+
# called when sink is released
3136
raise NotImplementedError()
3237

3338
class SinkToClientEntry:
@@ -39,72 +44,77 @@ def __init__(self, sink=None):
3944

4045

4146
class ClientRegistry(Base):
47+
# client side registry to link sinks to nodes
4248
entries: dict[str, SinkToClientEntry] = {}
43-
def attach_client_node(self, node: "ClientNode"):
44-
pass
4549

46-
def detach_client_node(self, node: "ClientNode"):
50+
def remove_node(self, node: "ClientNode"):
51+
# remove node from all sinks
4752
for entry in self.entries.values():
4853
if entry.node is node:
4954
entry.node = None
5055

51-
def link_client_node(self, name: str, node: "ClientNode"):
52-
self.entry(name).node = node
56+
def add_node_to_sink(self, name: str, node: "ClientNode"):
57+
# add not to named sink
58+
self._entry(name).node = node
5359

54-
def unlink_client_node(self, name: str, node: "ClientNode"):
60+
def remove_node_from_sink(self, name: str, node: "ClientNode"):
61+
# remove node from named sink
5562
resource = Name.resource_from_name(name)
5663
if resource in self.entries:
5764
if self.entries[resource].node is node:
5865
self.entries[resource].node = None
5966
else:
6067
self.emit_log(LogLevel.DEBUG, f"unlink node failed, not the same node: {resource}")
6168

62-
def add_object_sink(self, sink: IObjectSink) -> "ClientNode":
69+
def register_sink(self, sink: IObjectSink) -> "ClientNode":
70+
# register sink using object name
6371
name = sink.olink_object_name()
64-
entry = self.entry(name)
72+
entry = self._entry(name)
6573
entry.sink = sink
6674
return entry.node
6775

68-
def remove_object_sink(self, sink: IObjectSink):
76+
def unregister_sink(self, sink: IObjectSink):
77+
# unregister sink using object name
6978
name = sink.olink_object_name()
70-
self.remove_entry(name)
79+
self._remove_entry(name)
7180

72-
def get_object_sink(self, name: str) -> Optional[IObjectSink]:
73-
return self.entry(name).sink
81+
def get_sink(self, name: str) -> Optional[IObjectSink]:
82+
# get sink using name
83+
return self._entry(name).sink
7484

75-
def get_client_node(self, name: str) -> Optional["ClientNode"]:
76-
return self.entry(name).node
85+
def get_node(self, name: str) -> Optional["ClientNode"]:
86+
# get node using name
87+
return self._entry(name).node
7788

78-
def entry(self, name: str) -> SinkToClientEntry:
89+
def _entry(self, name: str) -> SinkToClientEntry:
90+
# get an entry by name
7991
resource = Name.resource_from_name(name)
8092
if not resource in self.entries:
8193
self.emit_log(LogLevel.DEBUG, f"add new resource: {resource}")
8294
self.entries[resource] = SinkToClientEntry()
8395
return self.entries[resource]
8496

85-
def remove_entry(self, name: str) -> None:
97+
def _remove_entry(self, name: str) -> None:
98+
# remove an entry by name
8699
resource = Name.resource_from_name(name)
87100
del self.entries[resource]
88101

89102

90-
91-
103+
# global client registry
92104
_registry = ClientRegistry()
93105

106+
def get_client_registry() -> ClientRegistry:
107+
return _registry
94108

95109
class ClientNode(BaseNode):
96110
invokes_pending: dict[int, InvokeReplyFunc] = {}
97111
requestId = 0
98112

99-
def __init__(self):
100-
super().__init__()
101-
self.registry().attach_client_node(self)
102-
103113
def registry(self) -> ClientRegistry:
104-
return _registry
114+
return get_client_registry()
105115

106116
def detach(self) -> None:
107-
self.registry().detach_client_node(self)
117+
self.registry().remove_node(self)
108118

109119
def next_request_id(self) -> int:
110120
self.requestId += 1
@@ -118,49 +128,60 @@ def invoke_remote(self, name: str, args: list[Any], func: Optional[InvokeReplyFu
118128
self.emit_write(Protocol.invoke_message(request_id, name, args))
119129

120130
def set_remote_property(self, name: str, value: Any) -> None:
131+
# send remote propertymessage
121132
self.emit_log(LogLevel.DEBUG, f"ClientNode.set_remote_property: {name} {value}")
122133
self.emit_write(Protocol.set_property_message(name, value))
123134

124135
def link_node(self, name: str):
125-
self.registry().link_client_node(name, self)
136+
# register this node to sink
137+
self.registry().add_node_to_sink(name, self)
126138

127139
def unlink_node(self, name: str) -> None:
128-
self.registry().unlink_client_node(name, self)
140+
# unregister this node from sink
141+
self.registry().remove_node_from_sink(name, self)
129142

130143
@staticmethod
131-
def add_object_sink(sink: IObjectSink) -> Optional["ClientNode"]:
132-
return _registry.add_object_sink(sink)
144+
def register_sink(sink: IObjectSink) -> Optional["ClientNode"]:
145+
# register sink to registry
146+
return get_client_registry().register_sink(sink)
133147

134148
@staticmethod
135-
def remove_object_sink(sink: IObjectSink) -> None:
136-
return _registry.remove_object_sink(sink)
149+
def unregister_sink(sink: IObjectSink) -> None:
150+
# unregister sink from registry
151+
return get_client_registry().unregister_sink(sink)
137152

138-
def get_object_sink(self, name: str) -> Optional[IObjectSink]:
139-
return self.registry().get_object_sink(name)
153+
@staticmethod
154+
def get_sink(name: str) -> Optional[IObjectSink]:
155+
return get_client_registry().get_sink(name)
140156

141-
def link_remote(self, name: str):
157+
def link_remote(self, name: str):
158+
# register this node from sink and send a link message
142159
self.emit_log(LogLevel.DEBUG, f"ClientNode.linkRemote: {name}")
143-
self.registry().link_client_node(name, self)
160+
self.registry().add_node_to_sink(name, self)
144161
self.emit_write(Protocol.link_message(name))
145162

146163
def unlink_remote(self, name: str):
164+
# unlink this node froom sink and send an unlink message
147165
self.emit_log(LogLevel.DEBUG, f"ClientNode.unlink_remote: {name}")
148166
self.emit_write(Protocol.unlink_message(name))
149-
self.registry().unlink_client_node(name, self)
167+
self.registry().remove_node_from_sink(name, self)
150168

151169
def handle_init(self, name: str, props: object):
170+
# handle init message from source
152171
self.emit_log(LogLevel.DEBUG, f"ClientNode.handle_init: {name}")
153-
sink = self.get_object_sink(name)
172+
sink = self.get_sink(name)
154173
if sink:
155174
sink.olink_on_init(name, props, self)
156175

157176
def handle_property_change(self, name: str, value: Any) -> None:
177+
# handle property change message from source
158178
self.emit_log(LogLevel.DEBUG, f"ClientNode.handle_property_change: {name}")
159-
sink =self.get_object_sink(name)
179+
sink =self.get_sink(name)
160180
if sink:
161181
sink.olink_on_property_changed(name, value)
162182

163183
def handle_invoke_reply(self, id: int, name: str, value: Any) -> None:
184+
# handle invoke reply message from source
164185
self.emit_log(LogLevel.DEBUG, f"ClientNode.handle_invoke_reply: {id} {name} {value}")
165186
if id in self.invokes_pending:
166187
func = self.invokes_pending[id]
@@ -172,12 +193,14 @@ def handle_invoke_reply(self, id: int, name: str, value: Any) -> None:
172193
self.emit_log(LogLevel.DEBUG, f"no pending invoke: {id} {name}")
173194

174195
def handle_signal(self, name: str, args: list[Any]) -> None:
196+
# handle signal message from source
175197
self.emit_log(LogLevel.DEBUG, f"ClientNode.handle_signal: {name} {args}")
176-
sink = self.get_object_sink(name)
198+
sink = self.get_sink(name)
177199
if sink:
178200
sink.olink_on_signal(name, args)
179201

180202
def handle_error(self, msgType: MsgType, id: int, error: str):
203+
# handle error message from source
181204
self.emit_log(LogLevel.DEBUG, f"ClientNode.handle_error: {msgType} {id} {error}")
182205

183206

src/olink/mocks/mocksink.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class MockSink(IObjectSink):
99
properties: dict[str, Any] = {}
1010
def __init__(self, name: str):
1111
self.name = name
12-
self.node = ClientNode.add_object_sink(self)
12+
self.node = ClientNode.register_sink(self)
1313

1414
def invoke(self, name: str, args: list[Any]):
1515
if self.node:

src/olink/mocks/mocksource.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,12 @@ class MockSource(IObjectSource):
1010

1111
def __init__(self, name: str):
1212
self.name = name
13-
RemoteNode.add_object_source(self)
1413

1514
def set_property(self, name: str, value: Any):
16-
if self.node:
17-
self.node.notify_property_change(name, value)
15+
RemoteNode.notify_property_change(name, value)
1816

1917
def notify_signal(self, name: str, args: list[Any]):
20-
if self.node:
21-
self.node.notify_signal(name, args)
18+
RemoteNode.notify_signal(name, args)
2219

2320
def olink_object_name(self) -> str:
2421
return self.name
@@ -33,14 +30,12 @@ def olink_set_property(self, name: str, value: Any):
3330
if not path in self.properties:
3431
# assign new value
3532
self.properties[path] = value
36-
if self.node:
37-
self.node.notify_property_change(name, value)
33+
RemoteNode.notify_property_change(name, value)
3834
else:
3935
# update existing value
4036
if not self.properties[path] == value:
4137
self.properties[path] = value
42-
if self.node:
43-
self.node.notify_property_change(name, value)
38+
RemoteNode.notify_property_change(name, value)
4439

4540
def olink_linked(self, name: str, node: RemoteNode):
4641
self.events.append({'type': 'linked', 'name': name})

0 commit comments

Comments
 (0)