Skip to main content

RemotiveTopology framework

0.21.0 - 2026-07-03

Bug fixes

  • Updated LICENSE text

  • (remotive-topology-lib) Skip e2e signals when initializing LIN cache

    Since LIN namespaces can force e2e signal values, initializing them might break the e2e functionality.

Features

  • release: Render commit bodies and decouple changelog publishing

    The dev changelog now renders each commit body beneath its subject. A dedicated workflow publishes the checked-in topology changelog to the docs site on push to main, so the release workflow only publishes the versioned API docs. README recommends the basecamp commit-msg hook.

0.20.0 - 2026-06-15

Breaking changes
  • LinNamespace no longer automatically populated the cache with all frames. You must now explicitly configure which frames to cache via cache_config.

Features

  • LinNamespace cache population is configured with cache_config

    • BREAKING: LinNamespace no longer automatically populated the cache with all frames. You must now explicitly configure which frames to cache via cache_config.

    Previously, LinNamespace automatically populated the LIN cache with all frames on open(), even frames not belonging to this ECU. This behavior is now controlled by the cache_config parameter, which fixes the problem and also allows more fine-grained control over the cache seeding.

0.19.3 - 2026-06-10

Bug fixes

  • docs: Tuck the theme toggle and version nav into the hamburger menu

    On small screens the fixed-position toggle and version nav overlapped pdoc's hamburger button. Render them in the nav footer (new module.html.jinja2) so on mobile they sit inside the opened hamburger menu; on desktop they still float top-right as before.

    Addresses the same overlap as remotiveplatform-docs ac8c76c.

  • Make it easier to import FMUBehavioralModel etc

0.19.2 - 2026-05-26

Features

  • New FMUBehavioralModel

0.19.0 - 2026-05-22

Features

  • Metrics package is no longer optional, all related packages are always included

    Keep the [metrics] for backward compat

  • Removed optional backwards compat, [metrics] not longer supported

0.18.0 - 2026-05-20

Features

  • topology: Add LinNamespace

    Encapsulates LIN-specific behavior that previously leaked into ECUMock: type validation on open, automatic broker-side cache priming with each signal's database start_value, header subscription, and set_schedule.

    ECUMock now dispatches on broker namespace type to the protocol-specific namespace class (CanNamespace/LinNamespace/SomeIPNamespace/ ScriptedNamespace), falling back to GenericNamespace for unknown types. The LIN init-cache loop is gone since LinNamespace.open() handles it.

    Example LIN ECUs (rl, rlcm, polestar_backlight) updated to use LinNamespace and inherit BehavioralModel directly.

    Also fix subtle bugs in someip tests surfacing when bumping broker version from 1.19 to 1.24 in integration tests.

0.17.0 - 2026-05-13

Breaking changes
  • topology: Register input handlers directly on namespaces

Bug fixes

  • topology: Restore subscription metrics on SubscriptionMonitor

    The frames-received counter and handler-duration histogram lived in NamespaceClient until the namespace refactor (61717812) deleted that class — the metrics went with it. SubscriptionMonitor is the new shared home for subscription plumbing, so move the instrumentation there. Both BehavioralModel input handlers and direct namespace subscriptions now emit the same metrics.

    Also:

    • plumb callback_label through Namespace._subscribe so input handlers surface their handler name (not the internal _wrapped closure) in the callback tag of handler.duration
    • bind handler.duration to second-scale buckets via a View; the OTel SDK ignores explicit_bucket_boundaries_advisory and falls back to ms-scale defaults, which collapses sub-5ms latencies into one bucket and makes histogram_quantile return the bucket midpoint
    • regression test asserts second-scale histogram buckets in the export
  • Install [metrics] extras in topology docker image

Features

  • topology: Register input handlers directly on namespaces

    • BREAKING: register input handlers directly on namespaces

    Users can now attach input handlers to a namespace without routing them through a BehavioralModel. Filters + callback go straight onto the namespace (via constructor or subscribe_input_handler), using the same FrameHandler pipeline as BM — so signal filters and named-value decoding behave identically on both paths. This makes standalone namespaces useful on their own and keeps one mental model for input handling.

    Under the hood, every namespace now owns a SubscriptionMonitor in the base class that runs each callback in its own task with centralized exception propagation. BehavioralModel wires its input_handlers through the same monitor instead of reimplementing subscription management, which let us delete NamespaceClient entirely.

    • add SubscriptionMonitor (namespaces/monitor.py) and move shared subscription plumbing onto the Namespace base class
    • add subscribe_input_handler / unsubscribe_input_handler and an input_handlers constructor param on GenericNamespace
    • define InputHandlerSpec alongside InputHandler in input_handlers.py so BM and namespaces share one definition
    • replace per-subclass open() overrides with a _validate(info) hook on the base, removing duplicate get_namespace() round-trips
    • delete NamespaceClient; BehavioralModel now owns namespace lifecycle directly (breaking for any external NamespaceClient users)
    • add unit tests for the new API and an integration test that asserts namespace- and BM-level input handlers coexist on the same namespace

0.16.0 - 2026-04-29

Features

  • Accept (SignalName, SignalValue) tuples in publish() and TransactionContext

    GenericNamespace.publish() now accepts tuples alongside WriteSignal, consistent with the existing pattern in Restbus.update_signals() and TransactionContext.update(). TransactionContext.updates field type widened to match what .update() already accepted.

  • Intrumenting python libs with open-telemetry and prometheus

    Intial metrics that we can build upon. Grafana dashboard in signal-broker gets copied during generate.

0.15.0 - 2026-04-23

Breaking changes
  • topology: Subscriptions no longer deliver every frame by default. Callbacks that relied on firing on unchanged frames (e.g. for cycle-time heartbeats) must opt back in by passing on_change=False.

Bug fixes

  • Subscribe_frames() now respects constructor decode_named_values

Documentation

  • topology: Cover on_change default and E2eSignalsFilter usage

  • Include input handlers in docs

    • Snippet was never included

Features

  • topology: Add input_filters to BehavioralModel

    BehavioralModel accepts a cross-cutting input_filters sequence that is appended to every input handler via a new InputHandler.extend_filters hook. Useful for cross-cutting concerns like excluding E2E signals: input_filters=[E2eSignalsFilter(exclude=True)].

    Re-export E2eSignalsFilter, FrameSignalFilter.

  • topology: Default BehavioralModel to use on changed

    • BREAKING: subscriptions no longer deliver every frame by default. Callbacks that relied on firing on unchanged frames (e.g. for cycle-time heartbeats) must opt back in by passing on_change=False.

    BehavioralModel and NamespaceClient accept an on_change option, defaulting to true (OnChangeMode.MERGED) so subscriptions only deliver frames whose subscribed signals actually changed.

0.14.0 - 2026-04-14

Bug fixes

  • Tester images now correctly installs dev version of lib

    Also removes duplicate filters implementation to use filters from broker lib instead. The current filters module is kept as a proxy module for backwards compability.

Features

  • testing: Replace SignalValueAccumulator with Capture-based test helpers

    Introduces a composable testing API for asserting async signal sequences:

    • Capture[T] — generic async iterator consumer with stateful cursor and retry-based waiting; replaces the old SignalValueAccumulator pattern
    • capture_frames() / wait_for_frame() / wait_for_frames() / wait_for_signal_value() / wait_for_signal_values() in frames.py
    • capture_events() / wait_for_event() / wait_for_event_parameter_values() in some_ip.py for SOME/IP event assertions
    • Refactors retry into a standalone generic utility (removes hamcrest dependency from the retry path)
    • Deletes SignalValueAccumulator, async_utils, and the old await_at_most accumulator pattern

    All integration and example tests updated to use the new API.

0.13.1 - 2026-04-01

Documentation

  • Improved docs

0.12.0 - 2026-01-27

Features

  • Default initial_empty to True in subscribe calls

    In a flow when the user wants to

    1. Subscribe to a signal
    2. Do something
    3. Verify that the signal was received The subscribe needs to be blocking until the broker has done what it should do, e.g. in some/ip do a subscribe call

Refactor

  • Filters now works with built-ins

    remotivelabs.topology.namespaces.filters now works with python built-in functions like filter().

0.10.0 - 2025-10-15

Bug fixes

  • Clean up scripted namespace

    Remove some parts that were copied from generic namespace but are not relevant for scripted.

  • Update scripted namespace documentation

Features

  • topology: Add support for scripted namespace in namespace client

0.9.4 - 2025-10-09

Bug fixes

  • Simple NamespaceClient
  • BehavioralModel error when missing virt

0.9.3 - 2025-08-28

Bug fixes

  • Fix dependencies that could be considered circular

0.9.2 - 2025-08-27

Bug fixes

  • remotivelabs-topology: Bump broker version

    • fix accidental breaking change
  • Handle empty event

  • Import statements

    • import from leafe inside own module

Documentation

  • Added examples to documentation

Features

  • Add BCM reboot to lighting and steering
  • BehavioralModel args only parses known args

0.9.1 - 2025-06-10

Documentation

  • Moved docs from docs.remotivelabs to examples

0.9.0 - 2025-06-09

Documentation

  • Added snippets to package and docs to init.py

    • So that it is possible to generate docs from the wheel