Skip to content

Commit 07c6a1c

Browse files
committed
pb stuff
1 parent f5ca830 commit 07c6a1c

File tree

13 files changed

+341
-56
lines changed

13 files changed

+341
-56
lines changed

.github/workflows/build.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ jobs:
4040
python: '3.11'
4141
invoke_lint: false
4242
invoke_test: false
43+
- name: Install test dependencies
44+
run: |
45+
pip install -r tests/integration/requirements.txt
4346
- name: Run integration tests
4447
run: |
4548
pytest tests/integration

pyproject.toml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,54 @@
1+
[build-system]
2+
requires = ["setuptools>=66.0"]
3+
build-backend = "setuptools.build_meta"
4+
5+
# ============================================================================
6+
# project info
7+
# ============================================================================
8+
9+
[project]
10+
name = "compas_eve"
11+
description = "COMPAS Event Extensions: adds event-based communication infrastructure to the COMPAS framework."
12+
keywords = ["events", "event-driven", "compas", "architecture", "distributed systems"]
13+
authors = [
14+
{ name = "Gonzalo Casas", email = "[email protected]" },
15+
{ name = "Chen Kasirer", email = "[email protected]" },
16+
]
17+
license = { file = "LICENSE" }
18+
readme = "README.md"
19+
requires-python = ">=3.9"
20+
dynamic = ['dependencies', 'optional-dependencies', 'version']
21+
classifiers = [
22+
"Development Status :: 4 - Beta",
23+
"Topic :: Scientific/Engineering",
24+
"Operating System :: Unix",
25+
"Operating System :: POSIX",
26+
"Operating System :: Microsoft :: Windows",
27+
"Programming Language :: Python",
28+
"Programming Language :: Python :: 3",
29+
"Programming Language :: Python :: 3.10",
30+
"Programming Language :: Python :: 3.11",
31+
"Programming Language :: Python :: 3.12",
32+
"Programming Language :: Python :: 3.13",
33+
"Programming Language :: Python :: 3.14",
34+
]
35+
36+
[project.entry-points.'compas_pb.plugins']
37+
serializers = 'compas_eve.codecs.conversions'
38+
39+
[project.urls]
40+
Homepage = "https://github.com/compas-dev/compas_eve"
41+
Documentation = "https://compas.dev/compas_eve"
42+
Repository = "https://github.com/compas-dev/compas_eve"
43+
Changelog = "https://github.com/compas-dev/compas_eve/blob/main/CHANGELOG.md"
44+
Issues = "https://github.com/compas-dev/compas_eve/issues"
45+
Forum = "https://forum.compas-framework.org/"
46+
47+
48+
# ============================================================================
49+
# setuptools config
50+
# ============================================================================
51+
152
[tool.black]
253
line-length = 120
354

requirements-dev.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ autopep8
33
black
44
bump2version >=1.0.1
55
check-manifest >=0.36
6-
compas_invocations
6+
compas_invocations2
7+
compas_pb >= 0.4.4
78
doc8
89
flake8
910
invoke >=0.14

src/compas_eve/codecs.py renamed to src/compas_eve/codecs/__init__.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,20 @@ def encode(self, message):
8888
"""
8989
# Extract data from the message
9090
try:
91-
data = message.data
91+
return json_dumps(message.data)
9292
except (KeyError, AttributeError):
9393
try:
94-
data = message.__data__
94+
return json_dumps(message)
9595
except (KeyError, AttributeError):
96-
data = dict(message)
97-
return json_dumps(data)
96+
return json_dumps(dict(message))
9897

9998
def decode(self, encoded_data, message_type):
100-
"""Decode JSON string to message object.
99+
"""Decode JSON message payloads to message object.
101100
102101
Parameters
103102
----------
104-
encoded_data : str
105-
JSON string to decode.
103+
encoded_data : bytes
104+
Message bytes to decode into a JSON string.
106105
message_type : type
107106
The message type class to use for parsing.
108107
@@ -111,8 +110,11 @@ def decode(self, encoded_data, message_type):
111110
:class:`Message`
112111
Decoded message object.
113112
"""
114-
data = json_loads(encoded_data)
115-
return message_type.parse(data)
113+
data = json_loads(encoded_data.decode())
114+
if hasattr(data, "__data__"):
115+
return data
116+
else:
117+
return message_type.parse(data)
116118

117119

118120
try:
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from compas_pb.core import _deserialize_any
2+
from compas_pb.core import _serializer_any
3+
from compas_pb.registry import pb_deserializer
4+
from compas_pb.registry import pb_serializer
5+
6+
from compas_eve.proto import message_pb2
7+
from compas_eve import Message
8+
9+
10+
@pb_serializer(Message)
11+
def message_to_pb(message: Message) -> message_pb2.Message:
12+
pb = message_pb2.Message()
13+
for k, v in message.data.items():
14+
pb.data[k].CopyFrom(_serializer_any(v))
15+
return pb
16+
17+
@pb_deserializer(message_pb2.Message)
18+
def message_from_pb(pb: message_pb2.Message) -> Message:
19+
message = Message()
20+
for k, v in pb.data.items():
21+
message[k] = _deserialize_any(v)
22+
return message

src/compas_eve/memory/__init__.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ def publish(self, topic, message):
5656
event_key = "event:{}".format(topic.name)
5757

5858
def _callback(**kwargs):
59-
self.emit(event_key, message)
59+
encoded_message = self.codec.encode(message)
60+
encoded_message_bytes = encoded_message if isinstance(encoded_message, bytes) else encoded_message.encode('utf-8')
61+
self.emit(event_key, encoded_message_bytes)
6062

6163
self.on_ready(_callback)
6264

@@ -81,10 +83,14 @@ def subscribe(self, topic, callback):
8183
event_key = "event:{}".format(topic.name)
8284
subscribe_id = "{}:{}".format(event_key, id(callback))
8385

86+
def _local_callback(msg):
87+
message_obj = self.codec.decode(msg, topic.message_type)
88+
callback(message_obj)
89+
8490
def _callback(**kwargs):
85-
self.on(event_key, callback)
91+
self.on(event_key, _local_callback)
8692

87-
self._local_callbacks[subscribe_id] = callback
93+
self._local_callbacks[subscribe_id] = _local_callback
8894

8995
self.on_ready(_callback)
9096

src/compas_eve/mqtt/mqtt_paho.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def subscribe(self, topic, callback):
106106
subscribe_id = "{}:{}".format(event_key, id(callback))
107107

108108
def _local_callback(msg):
109-
message_obj = self.codec.decode(msg.payload.decode(), topic.message_type)
109+
message_obj = self.codec.decode(msg.payload, topic.message_type)
110110
callback(message_obj)
111111

112112
def _subscribe_callback(**kwargs):

src/compas_eve/proto/message.proto

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
syntax = "proto3";
2+
3+
package compas_eve;
4+
5+
import "compas_pb/generated/message.proto";
6+
7+
message Message {
8+
map<string, compas_pb.data.AnyData> data = 1;
9+
}

src/compas_eve/proto/message_pb2.py

Lines changed: 41 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tasks.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
from __future__ import print_function
22

33
import os
4+
from pathlib import Path
45

5-
from compas_invocations import build
6-
from compas_invocations import docs
7-
from compas_invocations import style
8-
from compas_invocations import tests
6+
from compas_invocations2 import build
7+
from compas_invocations2 import docs
8+
from compas_invocations2 import style
9+
from compas_invocations2 import tests
910
from invoke import Collection
1011

12+
import compas_pb
13+
from compas_pb.invocations import generate_proto_classes
14+
1115
ns = Collection(
1216
docs.help,
1317
style.check,
@@ -21,6 +25,7 @@
2125
build.prepare_changelog,
2226
build.clean,
2327
build.release,
28+
generate_proto_classes,
2429
)
2530
ns.configure(
2631
{
@@ -30,5 +35,8 @@
3035
"source_dir": "src/compas_eve/ghpython/components",
3136
"target_dir": "src/compas_eve/ghpython/components/ghuser",
3237
},
38+
"proto_folder": Path("./src") / "compas_eve" / "proto",
39+
"proto_include_paths": [Path("./src") / "compas_eve" / "proto", compas_pb.PROTOBUF_DEFS],
40+
"proto_out_folder": Path("./src") / "compas_eve" / "proto",
3341
}
3442
)

0 commit comments

Comments
 (0)