stinger-ipc 0.0.1__py3-none-any.whl → 0.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stinger_ipc-0.0.1.dist-info → stinger_ipc-0.0.2.dist-info}/METADATA +3 -3
- stinger_ipc-0.0.2.dist-info/RECORD +48 -0
- stinger_ipc-0.0.2.dist-info/entry_points.txt +4 -0
- stingeripc/args.py +6 -5
- stingeripc/asyncapi.py +249 -167
- stingeripc/components.py +301 -136
- stingeripc/connection.py +2 -1
- stingeripc/exceptions.py +1 -2
- stingeripc/interface.py +8 -4
- stingeripc/lang_symb.py +68 -0
- stingeripc/templates/cpp/CMakeLists.txt.jinja2 +26 -0
- stingeripc/templates/cpp/examples/client_main.cpp.jinja2 +47 -0
- stingeripc/templates/cpp/examples/server_main.cpp.jinja2 +35 -0
- stingeripc/templates/cpp/include/broker.hpp.jinja2 +132 -0
- stingeripc/templates/cpp/include/client.hpp.jinja2 +53 -0
- stingeripc/templates/cpp/include/enums.hpp.jinja2 +17 -0
- stingeripc/templates/cpp/include/ibrokerconnection.hpp.jinja2 +42 -0
- stingeripc/templates/cpp/include/return_types.hpp.jinja2 +14 -0
- stingeripc/templates/cpp/include/server.hpp.jinja2 +44 -0
- stingeripc/templates/cpp/include/structs.hpp.jinja2 +13 -0
- stingeripc/templates/cpp/src/broker.cpp.jinja2 +243 -0
- stingeripc/templates/cpp/src/client.cpp.jinja2 +202 -0
- stingeripc/templates/cpp/src/server.cpp.jinja2 +170 -0
- stingeripc/templates/markdown/index.md.jinja2 +142 -0
- stingeripc/templates/python/__init__.py.jinja2 +1 -0
- stingeripc/templates/python/client.py.jinja2 +309 -0
- stingeripc/templates/python/connection.py.jinja2 +164 -0
- stingeripc/templates/python/interface_types.py.jinja2 +48 -0
- stingeripc/templates/python/method_codes.py.jinja2 +30 -0
- stingeripc/templates/python/pyproject.toml.jinja2 +9 -0
- stingeripc/templates/python/server.py.jinja2 +214 -0
- stingeripc/templates/rust/Cargo.toml.jinja2 +4 -0
- stingeripc/templates/rust/client/Cargo.toml.jinja2 +25 -0
- stingeripc/templates/rust/client/examples/client.rs.jinja2 +53 -0
- stingeripc/templates/rust/client/src/lib.rs.jinja2 +247 -0
- stingeripc/templates/rust/connection/Cargo.toml.jinja2 +21 -0
- stingeripc/templates/rust/connection/examples/pub_and_recv.rs.jinja2 +44 -0
- stingeripc/templates/rust/connection/src/handler.rs.jinja2 +0 -0
- stingeripc/templates/rust/connection/src/lib.rs.jinja2 +262 -0
- stingeripc/templates/rust/connection/src/payloads.rs.jinja2 +131 -0
- stingeripc/templates/rust/server/Cargo.toml.jinja2 +19 -0
- stingeripc/templates/rust/server/examples/server.rs.jinja2 +83 -0
- stingeripc/templates/rust/server/src/lib.rs.jinja2 +272 -0
- stingeripc/topic.py +11 -8
- stinger_ipc-0.0.1.dist-info/RECORD +0 -13
- {stinger_ipc-0.0.1.dist-info → stinger_ipc-0.0.2.dist-info}/WHEEL +0 -0
- {stinger_ipc-0.0.1.dist-info → stinger_ipc-0.0.2.dist-info}/licenses/LICENSE +0 -0
- {stinger_ipc-0.0.1.dist-info → stinger_ipc-0.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,272 @@
|
|
1
|
+
/*
|
2
|
+
DO NOT MODIFY THIS FILE{# <-- Ignore this because you are editing the template file. #}. It is automatically generated and changes will be over-written
|
3
|
+
on the next generation.
|
4
|
+
|
5
|
+
This is the Server for the {{stinger.name}} interface.
|
6
|
+
*/
|
7
|
+
|
8
|
+
extern crate paho_mqtt as mqtt;
|
9
|
+
use connection::{MessagePublisher, Connection, ReceivedMessage};
|
10
|
+
|
11
|
+
#[allow(unused_imports)]
|
12
|
+
use connection::payloads::{*, MethodResultCode};
|
13
|
+
|
14
|
+
use std::sync::{Arc, Mutex};
|
15
|
+
use tokio::sync::{mpsc};
|
16
|
+
use tokio::join;
|
17
|
+
use tokio::task::JoinError;
|
18
|
+
use serde::{Serialize, Deserialize};
|
19
|
+
use serde_json;
|
20
|
+
|
21
|
+
/// This struct is used to store all the MQTTv5 subscription ids
|
22
|
+
/// for the subscriptions the client will make.
|
23
|
+
#[derive(Clone, Debug)]
|
24
|
+
struct {{stinger.name | UpperCamelCase }}ServerSubscriptionIds {
|
25
|
+
{%for method_name, method in stinger.methods.items()-%}
|
26
|
+
{{method_name | snake_case}}_method_req: i32,
|
27
|
+
{%endfor%}
|
28
|
+
{%for prop_name, prop in stinger.properties.items()-%}{%if not prop.read_only %}
|
29
|
+
{{prop_name | snake_case}}_property_update: i32,
|
30
|
+
{%endif%}{%endfor%}
|
31
|
+
}
|
32
|
+
|
33
|
+
#[derive(Clone)]
|
34
|
+
struct {{stinger.name | UpperCamelCase }}ServerMethodHandlers {
|
35
|
+
{%for method_name, method in stinger.methods.items()-%}
|
36
|
+
/// Pointer to a function to handle the {{method_name}} method request.
|
37
|
+
method_handler_for_{{method_name|snake_case}}: Arc<Mutex<Box<dyn Fn({%for arg in method.arg_list%}{{arg.rust_type}}{%if not loop.last%}, {%endif%}{%endfor%})->Result<{{method.return_value_rust_type}}, MethodResultCode> + Send>>>,
|
38
|
+
{%endfor%}
|
39
|
+
}
|
40
|
+
|
41
|
+
#[derive(Clone)]
|
42
|
+
struct {{stinger.name | UpperCamelCase}}Properties {
|
43
|
+
{%for prop_name, prop in stinger.properties.items()-%}
|
44
|
+
{{prop_name | snake_case}}_topic: Arc<String>,
|
45
|
+
{%-if prop.arg_list | length > 1%}
|
46
|
+
{{prop_name | snake_case}}: Arc<Mutex<Option<{{prop.rust_type}}>>>,
|
47
|
+
{%-else%}
|
48
|
+
{{prop_name | snake_case}}: Arc<Mutex<Option<{{prop.arg_list[0].rust_type}}>>>,
|
49
|
+
{%endif%}
|
50
|
+
{%-endfor%}
|
51
|
+
}
|
52
|
+
|
53
|
+
pub struct {{stinger.name | UpperCamelCase}}Server {
|
54
|
+
/// Temporarily holds the receiver for the MPSC channel. The Receiver will be moved
|
55
|
+
/// to a process loop when it is needed. MQTT messages will be received with this.
|
56
|
+
msg_streamer_rx: Option<mpsc::Receiver<ReceivedMessage>>,
|
57
|
+
|
58
|
+
/// The Sender side of MQTT messages that are received from the broker. This tx
|
59
|
+
/// side is cloned for each subscription made.
|
60
|
+
msg_streamer_tx: mpsc::Sender<ReceivedMessage>,
|
61
|
+
|
62
|
+
/// Through this MessagePublisher object, we can publish messages to MQTT.
|
63
|
+
msg_publisher: MessagePublisher,
|
64
|
+
|
65
|
+
/// Struct contains all the handlers for the various methods.
|
66
|
+
method_handlers: {{stinger.name | UpperCamelCase }}ServerMethodHandlers,
|
67
|
+
{%if stinger.properties|length > 0%}
|
68
|
+
/// Struct contains all the properties.
|
69
|
+
properties: {{stinger.name | UpperCamelCase}}Properties,
|
70
|
+
{%endif%}
|
71
|
+
/// Subscription IDs for all the subscriptions this makes.
|
72
|
+
subscription_ids: {{stinger.name | UpperCamelCase }}ServerSubscriptionIds,
|
73
|
+
|
74
|
+
/// Copy of MQTT Client ID
|
75
|
+
client_id: String,
|
76
|
+
}
|
77
|
+
|
78
|
+
impl {{stinger.name | UpperCamelCase}}Server {
|
79
|
+
pub async fn new(connection: &mut Connection) -> Self {
|
80
|
+
let _ = connection.connect().await.expect("Could not connect to MQTT broker");
|
81
|
+
|
82
|
+
//let interface_info = String::from(r#"{{stinger.interface_info.1 | tojson}}"#);
|
83
|
+
//connection.publish("{{stinger.interface_info.0}}".to_string(), interface_info, 1).await;
|
84
|
+
|
85
|
+
// Create a channel for messages to get from the Connection object to this {{stinger.name | UpperCamelCase }}Client object.
|
86
|
+
// The Connection object uses a clone of the tx side of the channel.
|
87
|
+
let (message_received_tx, message_received_rx) = mpsc::channel(64);
|
88
|
+
|
89
|
+
let publisher = connection.get_publisher();
|
90
|
+
|
91
|
+
// Create method handler struct
|
92
|
+
{%for method_name, method in stinger.methods.items()-%}
|
93
|
+
let subscription_id_{{method_name | snake_case}}_method_req = connection.subscribe("{{method.topic}}", message_received_tx.clone()).await;
|
94
|
+
let subscription_id_{{method_name | snake_case}}_method_req = subscription_id_{{method_name | snake_case}}_method_req.unwrap_or_else(|_| -1);
|
95
|
+
{%endfor%}
|
96
|
+
|
97
|
+
{%for prop_name, prop in stinger.properties.items()-%}{%if not prop.read_only %}
|
98
|
+
let subscription_id_{{prop_name | snake_case}}_property_update = connection.subscribe("{{prop.update_topic}}", message_received_tx.clone()).await;
|
99
|
+
let subscription_id_{{prop_name | snake_case}}_property_update = subscription_id_{{prop_name | snake_case}}_property_update.unwrap_or_else(|_| -1);
|
100
|
+
{%endif%}{%endfor%}
|
101
|
+
|
102
|
+
// Create structure for method handlers.
|
103
|
+
let method_handlers = {{stinger.name | UpperCamelCase }}ServerMethodHandlers {
|
104
|
+
{%-for method_name, method in stinger.methods.items()-%}
|
105
|
+
method_handler_for_{{method_name|snake_case}}: Arc::new(Mutex::new(Box::new( |{%for arg in method.arg_list-%}_{{loop.index}}{%if not loop.last%}, {%endif%}{%endfor%}| { Err(MethodResultCode::ServerError) } ))),
|
106
|
+
{%endfor%}
|
107
|
+
};
|
108
|
+
|
109
|
+
// Create structure for subscription ids.
|
110
|
+
let sub_ids = {{stinger.name | UpperCamelCase }}ServerSubscriptionIds {
|
111
|
+
{%for method_name, method in stinger.methods.items()-%}
|
112
|
+
{{method_name | snake_case}}_method_req: subscription_id_{{method_name | snake_case}}_method_req,
|
113
|
+
{%endfor%}
|
114
|
+
{%for prop_name, prop in stinger.properties.items()-%}{%if not prop.read_only %}
|
115
|
+
{{prop_name | snake_case}}_property_update: subscription_id_{{prop_name | snake_case}}_property_update,
|
116
|
+
{%endif%}{%endfor%}
|
117
|
+
};
|
118
|
+
|
119
|
+
{%if stinger.properties|length > 0%}
|
120
|
+
let property_values = {{stinger.name | UpperCamelCase}}Properties {
|
121
|
+
{%-for prop_name, prop in stinger.properties.items()%}
|
122
|
+
{{prop_name | snake_case}}_topic: Arc::new(String::from("{{prop.value_topic}}")),
|
123
|
+
{%if prop.arg_list | length > 1 -%}
|
124
|
+
{{prop_name | snake_case}}: Arc::new(Mutex::new(None)),
|
125
|
+
{%else%}
|
126
|
+
{{prop_name | snake_case}}: Arc::new(Mutex::new(None)),
|
127
|
+
{%-endif%}
|
128
|
+
{%-endfor%}
|
129
|
+
};
|
130
|
+
{%endif%}
|
131
|
+
|
132
|
+
{{stinger.name | UpperCamelCase}}Server {
|
133
|
+
|
134
|
+
msg_streamer_rx: Some(message_received_rx),
|
135
|
+
msg_streamer_tx: message_received_tx,
|
136
|
+
msg_publisher: publisher,
|
137
|
+
method_handlers: method_handlers,{%if stinger.properties|length > 0%}
|
138
|
+
properties: property_values,{%endif%}
|
139
|
+
subscription_ids: sub_ids,
|
140
|
+
client_id: connection.client_id.to_string(),
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
{%for sig_name, sig in stinger.signals.items()-%}
|
145
|
+
pub async fn emit_{{sig_name|snake_case}}(&mut self, {%for arg in sig.arg_list%}{{arg.name|snake_case}}: {{arg.rust_type}}{%if not loop.last%}, {%endif%}{%endfor%}) {
|
146
|
+
let data = connection::payloads::{{sig_name|UpperCamelCase}}SignalPayload {
|
147
|
+
{%for arg in sig.arg_list%}
|
148
|
+
{{arg.name}}: {{arg.name|snake_case}},
|
149
|
+
{%endfor%}
|
150
|
+
};
|
151
|
+
self.msg_publisher.publish_structure("{{sig.topic}}".to_string(), &data).await;
|
152
|
+
}
|
153
|
+
{%endfor%}
|
154
|
+
|
155
|
+
{%for method_name, method in stinger.methods.items()-%}
|
156
|
+
pub fn set_method_handler_for_{{method_name|snake_case}}(&mut self, cb: impl Fn({%for arg in method.arg_list%}{{arg.rust_type}}{%if not loop.last%}, {%endif%}{%endfor%})->Result<{{method.return_value_rust_type}}, MethodResultCode> + 'static + Send) {
|
157
|
+
self.method_handlers.method_handler_for_{{method_name|snake_case}} = Arc::new(Mutex::new(Box::new(cb)));
|
158
|
+
}
|
159
|
+
{%endfor%}
|
160
|
+
|
161
|
+
|
162
|
+
{%for method_name, method in stinger.methods.items()-%}
|
163
|
+
async fn handle_{{method_name|snake_case}}_request(publisher: &mut MessagePublisher, handlers: &mut {{stinger.name | UpperCamelCase }}ServerMethodHandlers, msg: mqtt::Message) {
|
164
|
+
let props = msg.properties();
|
165
|
+
let opt_corr_id_bin: Option<Vec<u8>> = props.get_binary(mqtt::PropertyCode::CorrelationData);
|
166
|
+
let opt_resp_topic = props.get_string(mqtt::PropertyCode::ResponseTopic);
|
167
|
+
let payload_str = msg.payload_str();
|
168
|
+
let payload = serde_json::from_str::<{{method_name | UpperCamelCase}}RequestObject>(&payload_str).unwrap();
|
169
|
+
|
170
|
+
// call the method handler
|
171
|
+
let rv: {{method.return_value_rust_type}} = {
|
172
|
+
let func_guard = handlers.method_handler_for_{{method_name|snake_case}}.lock().unwrap();
|
173
|
+
(*func_guard)({%for arg in method.arg_list%}payload.{{arg.name}}{%if not loop.last%}, {%endif%}{%endfor%}).unwrap()
|
174
|
+
};
|
175
|
+
{%-if method.return_value_type == "primitive" -%}
|
176
|
+
let rv = {{method_name | UpperCamelCase}}ReturnValue {
|
177
|
+
{{method.return_value_property_name}}: rv,
|
178
|
+
};
|
179
|
+
{%endif%}
|
180
|
+
if let Some(resp_topic) = opt_resp_topic {
|
181
|
+
publisher.publish_response_structure(resp_topic, &rv, opt_corr_id_bin).await.expect("Failed to publish response structure");
|
182
|
+
} else {
|
183
|
+
eprintln!("No response topic found in message properties.");
|
184
|
+
}
|
185
|
+
}
|
186
|
+
{%endfor%}
|
187
|
+
|
188
|
+
{%-for prop_name, prop in stinger.properties.items()%}
|
189
|
+
async fn publish_{{prop_name}}_value(mut publisher: MessagePublisher, topic: String, data: {{prop.rust_type}})
|
190
|
+
{
|
191
|
+
{%-if prop.arg_list | length == 1%}
|
192
|
+
let new_data = {{prop_name | UpperCamelCase}}Property {
|
193
|
+
{{prop.arg_list[0].name}}: data,
|
194
|
+
};
|
195
|
+
let _pub_result = publisher.publish_retained_structure(topic, &new_data).await;
|
196
|
+
{%else%}
|
197
|
+
let _pub_result = publisher.publish_retained_structure(topic, &data).await;
|
198
|
+
{%endif%}
|
199
|
+
}
|
200
|
+
{%if not prop.read_only %}
|
201
|
+
async fn update_{{prop_name}}_value(publisher: &mut MessagePublisher, topic: Arc<String>, data: Arc<Mutex<Option<{{prop.rust_type}}>>>, msg: mqtt::Message)
|
202
|
+
{
|
203
|
+
let payload_str = msg.payload_str();
|
204
|
+
let new_data: {{prop_name | UpperCamelCase}}Property = serde_json::from_str(&payload_str).unwrap();
|
205
|
+
let mut locked_data = data.lock().unwrap();
|
206
|
+
{%-if prop.arg_list | length == 1%}
|
207
|
+
*locked_data = Some(new_data.{{prop.arg_list[0].name}});
|
208
|
+
{%-else%}
|
209
|
+
*locked_data = Some(new_data.clone());
|
210
|
+
{%endif%}
|
211
|
+
let publisher2 = publisher.clone();
|
212
|
+
let topic2: String = topic.as_ref().clone();
|
213
|
+
{%-if prop.arg_list | length == 1%}
|
214
|
+
let data2 = new_data.{{prop.arg_list[0].name}};
|
215
|
+
{%-else%}
|
216
|
+
let data2 = new_data;
|
217
|
+
{%endif%}
|
218
|
+
let _ = tokio::spawn(async move {
|
219
|
+
{{stinger.name | UpperCamelCase}}Server::publish_{{prop_name}}_value(publisher2, topic2, data2).await;
|
220
|
+
});
|
221
|
+
}
|
222
|
+
{%endif%}{# not read only property #}
|
223
|
+
pub async fn set_{{prop_name}}(&mut self, data: {{prop.rust_type}}) {
|
224
|
+
println!("Setting {{prop_name}} of type {{prop.rust_type}}");
|
225
|
+
let prop = self.properties.{{prop_name}}.clone();
|
226
|
+
{
|
227
|
+
let mut locked_data = prop.lock().unwrap();
|
228
|
+
*locked_data = Some(data.clone());
|
229
|
+
}
|
230
|
+
|
231
|
+
let publisher2 = self.msg_publisher.clone();
|
232
|
+
let topic2 = self.properties.{{prop_name}}_topic.as_ref().clone();
|
233
|
+
let _ = tokio::spawn(async move {
|
234
|
+
println!("Will publish property {{prop_name}} of type {{prop.rust_type}} to {}", topic2);
|
235
|
+
{{stinger.name | UpperCamelCase}}Server::publish_{{prop_name}}_value(publisher2, topic2, data).await;
|
236
|
+
});
|
237
|
+
}
|
238
|
+
{%endfor%}
|
239
|
+
|
240
|
+
/// Starts the tasks that process messages received.
|
241
|
+
/// In the task, it loops over messages received from the rx side of the message_receiver channel.
|
242
|
+
/// Based on the subscription id of the received message, it will call a function to handle the
|
243
|
+
/// received message.
|
244
|
+
pub async fn receive_loop(&mut self) -> Result<(), JoinError> {
|
245
|
+
|
246
|
+
// Take ownership of the RX channel that receives MQTT messages. This will be moved into the loop_task.
|
247
|
+
let mut message_receiver = self.msg_streamer_rx.take().expect("msg_streamer_rx should be Some");
|
248
|
+
let mut method_handlers = self.method_handlers.clone();
|
249
|
+
let sub_ids = self.subscription_ids.clone();
|
250
|
+
let mut publisher = self.msg_publisher.clone();
|
251
|
+
{%-if stinger.properties | length > 0 %}
|
252
|
+
let properties = self.properties.clone();
|
253
|
+
{%endif%}
|
254
|
+
let _loop_task = tokio::spawn(async move {
|
255
|
+
while let Some(msg) = message_receiver.recv().await {
|
256
|
+
{%-for method_name, method in stinger.methods.items()%}
|
257
|
+
{%if not loop.first%}else {%endif%}if msg.subscription_id == sub_ids.{{method_name | snake_case}}_method_req {
|
258
|
+
{{stinger.name | UpperCamelCase}}Server::handle_{{method_name|snake_case}}_request(&mut publisher, &mut method_handlers, msg.message).await;
|
259
|
+
}
|
260
|
+
{%-endfor%}{# methods #}
|
261
|
+
{%-for prop_name, prop in stinger.properties.items()%}{%if not prop.read_only %}
|
262
|
+
{%if not loop.first or (stinger.methods | length > 0) %}else {%endif%}if msg.subscription_id == sub_ids.{{prop_name | snake_case}}_property_update {
|
263
|
+
{{stinger.name | UpperCamelCase}}Server::update_{{prop_name | snake_case}}_value(&mut publisher, properties.{{prop_name | snake_case}}_topic.clone(), properties.{{prop_name | snake_case}}.clone(), msg.message).await;
|
264
|
+
}
|
265
|
+
{%-endif%}{%endfor%}{# properties #}
|
266
|
+
}
|
267
|
+
});
|
268
|
+
|
269
|
+
println!("Started client receive task");
|
270
|
+
Ok(())
|
271
|
+
}
|
272
|
+
}
|
stingeripc/topic.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
from typing import Optional
|
2
|
-
|
2
|
+
from jacobsjinjatoo import stringmanip
|
3
3
|
|
4
4
|
class TopicCreatorBase:
|
5
5
|
def __init__(self, root: Optional[str] = None):
|
@@ -20,35 +20,38 @@ class SignalTopicCreator(TopicCreatorBase):
|
|
20
20
|
super().__init__(root)
|
21
21
|
|
22
22
|
def signal_topic(self, signal_name: str) -> str:
|
23
|
-
return self.slash("signal", signal_name)
|
23
|
+
return self.slash("signal", stringmanip.lower_camel_case(signal_name))
|
24
|
+
|
24
25
|
|
25
26
|
class MethodTopicCreator(TopicCreatorBase):
|
26
27
|
def __init__(self, root: str):
|
27
28
|
super().__init__(root)
|
28
29
|
|
29
30
|
def method_topic(self, method_name: str) -> str:
|
30
|
-
return self.slash("method", method_name)
|
31
|
+
return self.slash("method", stringmanip.lower_camel_case(method_name))
|
31
32
|
|
32
33
|
def method_response_topic(self, method_name: str, client_id: str) -> str:
|
33
34
|
method_topic = self.method_topic(method_name)
|
34
35
|
return f"client/{client_id}/{method_topic}/response"
|
35
36
|
|
37
|
+
|
36
38
|
class PropertyTopicCreator(TopicCreatorBase):
|
37
39
|
def __init__(self, root: str):
|
38
40
|
super().__init__(root)
|
39
41
|
|
40
42
|
def property_value_topic(self, property_name: str) -> str:
|
41
|
-
return self.slash("property", property_name)
|
42
|
-
|
43
|
+
return self.slash("property", stringmanip.lower_camel_case(property_name), "value")
|
44
|
+
|
43
45
|
def property_update_topic(self, property_name: str) -> str:
|
44
|
-
return self.slash("property", property_name, "
|
46
|
+
return self.slash("property", stringmanip.lower_camel_case(property_name), "setValue")
|
47
|
+
|
45
48
|
|
46
49
|
class InterfaceTopicCreator(TopicCreatorBase):
|
47
50
|
"""Helper class for creating MQTT topics for various stinger elements."""
|
48
51
|
|
49
52
|
def __init__(self, interface_name: str, root: Optional[str] = None):
|
50
53
|
super().__init__(root)
|
51
|
-
self._interface_name = interface_name
|
54
|
+
self._interface_name = stringmanip.lower_camel_case(interface_name)
|
52
55
|
|
53
56
|
@property
|
54
57
|
def _topic_prefix(self) -> str:
|
@@ -64,4 +67,4 @@ class InterfaceTopicCreator(TopicCreatorBase):
|
|
64
67
|
return MethodTopicCreator(self._topic_prefix)
|
65
68
|
|
66
69
|
def property_topic_creator(self) -> PropertyTopicCreator:
|
67
|
-
return PropertyTopicCreator(self._topic_prefix)
|
70
|
+
return PropertyTopicCreator(self._topic_prefix)
|
@@ -1,13 +0,0 @@
|
|
1
|
-
stinger_ipc-0.0.1.dist-info/licenses/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
|
2
|
-
stingeripc/__init__.py,sha256=PTr5WfMfB-GL4vp3-XMU8IwGv3Q5RXQ24H7JuEo3hdk,133
|
3
|
-
stingeripc/args.py,sha256=gpGJjtxz3a6TUCkH2mldllWgO1-PJBrmg8TlJT8bacM,3952
|
4
|
-
stingeripc/asyncapi.py,sha256=ebXTlodDBKD0jrUd5b8A0ob7kK3hI98KO6fPDbbFcU8,19229
|
5
|
-
stingeripc/components.py,sha256=ubiZyUySB3MDd122haXIa5diMh-pEKECA6az8ju1y_o,34143
|
6
|
-
stingeripc/connection.py,sha256=B6_Iij1Tue-dv_uDaQKtFVT4yLMUs1PGOj7_ioHwbkI,180
|
7
|
-
stingeripc/exceptions.py,sha256=ucD3HsV10bIFSm2p5vlx__bYDk9eNBhokw5fcv8tsu4,51
|
8
|
-
stingeripc/interface.py,sha256=Q3WtE2hNSQaPt5WEpn51cNDffjMFD6j2_0x2MbLXVS0,1522
|
9
|
-
stingeripc/topic.py,sha256=p6xMm1LL-9Cf86Sdf1jDhMf-5gN2HyKMHPcsrosQ-_M,2209
|
10
|
-
stinger_ipc-0.0.1.dist-info/METADATA,sha256=MIqGf_1TrzxD88VcNU7_mlxvhT2D8QrYam7GcwU9zZ8,5993
|
11
|
-
stinger_ipc-0.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
12
|
-
stinger_ipc-0.0.1.dist-info/top_level.txt,sha256=mSNwAf83_1qiTP_vu7XEPBrZu-fDusT1FFyQZzCrRcU,11
|
13
|
-
stinger_ipc-0.0.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|