From ba47d8b5c7e935507f4563dc0eea6b7acb09d9c7 Mon Sep 17 00:00:00 2001 From: Donald Clark Jackson Date: Thu, 20 Aug 2026 19:31:26 -0700 Subject: [PATCH] release: 0.23.0 (seven builder defects and gaps, one bump) Bumps __version__ to 0.23.0, promotes Unreleased to [0.23.0], adds the tag link definition. Seven issues, all filed by a consumer converting a multi-device adapter onto DeviceTreeBuilder, each with a runnable reproduction. Batched into one release rather than a patch now and a minor later, because every version bump costs a Yocto image rebuild downstream. Fixed, all silent in production: #72 conditionally_settable was inert. The property came out not-settable, which looked right, but the entity_setter was registered only when settable was true, so a later set_settable(True) opened a /set topic with no translator and the property accepted commands and discarded them. The only route the API offered for runtime settability, and it did not work. #77 A value the model already held never reached the wire. Reachable only since 0.22.0: before the reuse fix, twin and model started equally empty. initial_value now seeds rather than overwrites. #73 remove() raised when the model had already dropped the group, leaving the device gone from the broker and a corpse in the builder. #75 remove() left deferred descendants, so resolve_deferred() rebuilt a torn-down device. #76 add() recorded bookkeeping after materializing, stranding a live device on a raise or a re-entrant call. Added and changed: #78 remove_capabilities(), the inverse of extend(). #74 bookkeeping keyed on the resolved device id rather than DeviceSpec object identity, so a producer can re-derive its spec set freely instead of holding a process-lifetime map it was never told to keep. Minor rather than patch: #78 adds a method and #74 changes a documented contract. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 3 +++ src/ebus_sdk/__init__.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0282526..8db0838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to `ebus-sdk` are recorded here. Format follows [Keep a Chan ## [Unreleased] +## [0.23.0] — 2026-08-20 + ### Added - `DeviceTreeBuilder.remove_capabilities()`: the inverse of `extend()`. A capability that becomes relevant at runtime can stop being relevant, and without this its node stayed advertised in `$description` with retained topics behind it. `Device.delete_node()` already clears those and re-announces, so what this closes is the bookkeeping: reaching around the builder to call it left `model_keys` and `created_groups` describing properties that no longer existed, and a later `remove()` working from that stale record. Idempotent like `extend()`, and named for capabilities rather than nodes because that is the declarative vocabulary. ([#78](https://github.com/electrification-bus/python-sdk/issues/78)) @@ -391,6 +393,7 @@ The 0.2.0 release introduces first-class parent/child device trees on both the d Initial public release on PyPI. It predates this repo's tagging convention (the earliest tag is `v0.1.4`), so there is no `v0.1.2` tag to read; the published artifact on PyPI is the record of the surface that shipped. [Unreleased]: https://github.com/electrification-bus/python-sdk/compare/v0.20.1...HEAD +[0.23.0]: https://github.com/electrification-bus/python-sdk/releases/tag/v0.23.0 [0.22.0]: https://github.com/electrification-bus/python-sdk/releases/tag/v0.22.0 [0.21.0]: https://github.com/electrification-bus/python-sdk/releases/tag/v0.21.0 [0.20.1]: https://github.com/electrification-bus/python-sdk/releases/tag/v0.20.1 diff --git a/src/ebus_sdk/__init__.py b/src/ebus_sdk/__init__.py index 5060911..f81c17d 100644 --- a/src/ebus_sdk/__init__.py +++ b/src/ebus_sdk/__init__.py @@ -83,7 +83,7 @@ # Structural types for a caller-supplied MQTT client from ebus_sdk.transport import MqttControllerTransport, MqttDeviceTransport, MqttTransport -__version__ = "0.22.0" +__version__ = "0.23.0" __all__ = [ # Homie classes