From 2c4fc575c3a89129c879c98fa1f2c2959880331c Mon Sep 17 00:00:00 2001 From: Ryan Melton Date: Sat, 3 Oct 2026 22:04:53 -0600 Subject: [PATCH] fix(topics): write python command and decom stored flag as lowercase CommandTopic, CommandDecomTopic and TelemetryDecomTopic wrote stored as "True"/"False" while Ruby writes "true"/"false". Readers are case-insensitive, but the stream contents now match between implementations. Co-Authored-By: Claude Opus 5.5 (1M context) --- openc3/python/openc3/topics/command_decom_topic.py | 2 +- openc3/python/openc3/topics/command_topic.py | 2 +- openc3/python/openc3/topics/telemetry_decom_topic.py | 2 +- openc3/python/test/topics/test_command_decom_topic.py | 7 +++++++ openc3/python/test/topics/test_command_topic.py | 7 +++++++ openc3/python/test/topics/test_telemetry_decom_topic.py | 5 +++++ 6 files changed, 22 insertions(+), 3 deletions(-) diff --git a/openc3/python/openc3/topics/command_decom_topic.py b/openc3/python/openc3/topics/command_decom_topic.py index e29a515447..5e6fbecba7 100644 --- a/openc3/python/openc3/topics/command_decom_topic.py +++ b/openc3/python/openc3/topics/command_decom_topic.py @@ -32,7 +32,7 @@ def write_packet(cls, packet, scope): "received_time": to_nsec_from_epoch(packet.received_time), "target_name": packet.target_name, "packet_name": packet.packet_name, - "stored": str(packet.stored), + "stored": str(packet.stored).lower(), # Match ruby behavior of "true"/"false" "received_count": packet.received_count, } # Read all RAW values at once - optimized by accessor diff --git a/openc3/python/openc3/topics/command_topic.py b/openc3/python/openc3/topics/command_topic.py index a76c07fa2e..e59fb8138e 100644 --- a/openc3/python/openc3/topics/command_topic.py +++ b/openc3/python/openc3/topics/command_topic.py @@ -32,7 +32,7 @@ def write_packet(cls, packet, scope): "target_name": packet.target_name, "packet_name": packet.packet_name, "received_count": packet.received_count, - "stored": str(packet.stored), + "stored": str(packet.stored).lower(), # Match ruby behavior of "true"/"false" "buffer": bytes(packet.buffer_no_copy()), } if packet.extra: diff --git a/openc3/python/openc3/topics/telemetry_decom_topic.py b/openc3/python/openc3/topics/telemetry_decom_topic.py index 8a5ab60f5c..46ab3febea 100644 --- a/openc3/python/openc3/topics/telemetry_decom_topic.py +++ b/openc3/python/openc3/topics/telemetry_decom_topic.py @@ -36,7 +36,7 @@ def write_packet(cls, packet, id=None, include_limits_states=True, scope=None): msg_hash = { "time": to_nsec_from_epoch(packet.packet_time), "received_time": to_nsec_from_epoch(packet.received_time), - "stored": str(packet.stored), + "stored": str(packet.stored).lower(), # Match ruby behavior of "true"/"false" "target_name": packet.target_name, "packet_name": packet.packet_name, "received_count": packet.received_count, diff --git a/openc3/python/test/topics/test_command_decom_topic.py b/openc3/python/test/topics/test_command_decom_topic.py index 3b29839675..79dcdf58be 100644 --- a/openc3/python/test/topics/test_command_decom_topic.py +++ b/openc3/python/test/topics/test_command_decom_topic.py @@ -80,6 +80,13 @@ def test_writes_to_correct_topic(self): self.assertEqual(msg_hash["packet_name"], "CMD") self.assertEqual(msg_hash["received_count"], 1) + def test_writes_stored_as_lowercase_like_ruby(self): + for stored, expected in [(True, "true"), (False, "false")]: + packet = self._make_packet() + packet.stored = stored + CommandDecomTopic.write_packet(packet, scope="DEFAULT") + self.assertEqual(self.captured["msg_hash"]["stored"], expected) + def test_logs_given_value_for_write_conversion_items(self): packet = self._make_packet() packet.given_values = {"VALUE": 5, "STATE": "TRUE"} diff --git a/openc3/python/test/topics/test_command_topic.py b/openc3/python/test/topics/test_command_topic.py index 2f027d7700..94bdd91b43 100644 --- a/openc3/python/test/topics/test_command_topic.py +++ b/openc3/python/test/topics/test_command_topic.py @@ -65,6 +65,13 @@ def test_writes_to_correct_topic(self): self.assertEqual(msg_hash["received_count"], 1) self.assertEqual(msg_hash["buffer"], b"\x01\x02\x03\x04") + def test_writes_stored_as_lowercase_like_ruby(self): + for stored, expected in [(True, "true"), (False, "false")]: + packet = self._make_packet() + packet.stored = stored + CommandTopic.write_packet(packet, scope="DEFAULT") + self.assertEqual(self.captured["msg_hash"]["stored"], expected) + def test_includes_extra_when_set(self): extra = {"foo": "bar", "count": 42} CommandTopic.write_packet(self._make_packet(extra=extra), scope="DEFAULT") diff --git a/openc3/python/test/topics/test_telemetry_decom_topic.py b/openc3/python/test/topics/test_telemetry_decom_topic.py index a01aa07865..6b802814b7 100644 --- a/openc3/python/test/topics/test_telemetry_decom_topic.py +++ b/openc3/python/test/topics/test_telemetry_decom_topic.py @@ -77,6 +77,11 @@ def test_writes_to_correct_decom_topic(self): self.assertEqual(msg_hash["received_count"], 5) self.assertIn("json_data", msg_hash) + def test_writes_stored_as_lowercase_like_ruby(self): + for stored, expected in [(True, "true"), (False, "false")]: + TelemetryDecomTopic.write_packet(self._make_packet(stored=stored), scope="DEFAULT") + self.assertEqual(self.captured["msg_hash"]["stored"], expected) + def test_includes_extra_when_set(self): extra = {"foo": "bar", "count": 42} TelemetryDecomTopic.write_packet(self._make_packet(extra=extra), scope="DEFAULT")