From 4ddc3a36206489bbb5e748d34f3c64171eff0bc6 Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:07:02 -0400 Subject: [PATCH] chore: prepare the 3.8.0 release (#709) * chore(deprecation): remove the 35 APIs deprecated for 3.8.0 The usage scan (docs/DEPRECATIONS_3.8.md, regenerated 2026-10-01 and committed here) finds no call or override of any of them in the 46 monorepo plugins or the 8 third-party plugins plugins.json lists; the only core callers were other deprecated methods removed alongside. - CacheManager: 13 methods, plus the private helpers only has_data_changed used (_has_*_changed, _is_market_open). - DisplayManager: 7 methods, plus WEATHER_COLORS and the private _draw_sun/_cloud/_rain/_snow/_storm helpers only the icon methods used. - FontManager: 14 methods, plus size_tokens, _save_overrides and _clear_plugin_font_cache. font_overrides and _load_overrides stay: resolve_font() still applies config/font_overrides.json. performance_stats stays: get_font() keeps it and tests read it. - PluginManager.get_enabled_plugins. test_deprecation.py pins only the two 3.9.0 markers now; the scanner tests run against a stand-in core instead of the real markers. The memory-tier tests read stats through log_memory_cache_stats() and the component, and the test of the removed _clear_plugin_font_cache goes. Docs drop the removed methods' reference entries; the Deprecated APIs table becomes "Removed in 3.8.0". CHANGELOG gains a Removed section. Co-Authored-By: Claude Opus 5.5 * chore(deprecation): drop the test harness's copies of the removed icon methods VisualTestDisplayManager still drew weather icons that DisplayManager no longer has, so a plugin's visual tests could pass on calls that raise AttributeError on the real display. Its draw_sun/draw_cloud/draw_rain/ draw_snow/draw_weather_icon/draw_text_with_icons, WEATHER_COLORS and the private helpers go, with the tests that exercised them. The CHANGELOG's Deprecations entries no longer say nothing is removed. Co-Authored-By: Claude Opus 5.5 * chore: prepare the 3.8.0 release Bumps src.__version__ to 3.8.0 and turns Unreleased into ## 3.8.0, with a summary and a New modules list (vegas_elements, testing.vegas, sports_vegas; display_watchdog, plugin_catalog, plugin_runtime) for plugins flooring on 3.8.0. Adds the CHANGELOG line #701's second commit lacked (blocks laid out off the render thread). Co-Authored-By: Claude Opus 5.5 * chore: 3.8.0 also ships what landed on main since the prep #703, #705, #706 and #693 merged after this branch was cut; their CHANGELOG entries now sit under 3.8.0. The summary and New modules list name them (sports consolidation stage 4's four modules, src/ipc, field_model), stage 4's section says to floor on 3.8.0, and src/common/README.md marks its four modules 3.8.0 instead of Unreleased. Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- CHANGELOG.md | 45 ++++++++++++++++++++++++++++++++++++++++---- src/__init__.py | 2 +- src/common/README.md | 8 ++++---- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index feb9bc3f..4bbdfece 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,37 @@ release that ships it. accepts both, but the store flags the old spelling as deprecated (`store_manager.py`) and only the new one is in `schema/manifest_schema.json`. -## Unreleased +## 3.8.0 + +Live Vegas elements: plugin content that keeps changing while it scrolls +(scores on the scoreboards' cards, the flight map's gliding aircraft, the +weather radar's loop), with live games kept in the ticker by default. Also +stable/beta update channels, the display control socket, the systemd +display watchdog, optional web login, ES-module web UI pages, sports +consolidation stage 4, and the removal of the 35 plugin APIs deprecated +since 3.5.0 (see Removed). + +### New modules + +A plugin may import these via `src.*` once it floors on 3.8.0 (and should +guard the import, since the loader's version check is advisory). + +- `src/plugin_system/vegas_elements.py` -- `VegasElement`, the unit a + plugin's `get_vegas_elements()` returns (also re-exported from + `base_plugin`). See "Live Vegas elements" below. +- `src/plugin_system/testing/vegas.py` -- the harness for those hooks: + `render_vegas_elements`, `check_vegas_elements`, `render_vegas_timeline`. +- `src/common/sports_vegas.py` -- what a scoreboard needs for live cards: + `game_key`, `game_fingerprint`, `dedupe_games`, `VegasCardCache`, + `StickyOdds`, `finished_games`. +- `src/common/sports_plugin_host.py`, `sports_live_scroll.py`, + `sports_display_rules.py` and `sports_font_path.py` -- sports + consolidation stage 4; see "New modules (sports consolidation stage 4)" + below. +- `src/display_watchdog.py`, `src/plugin_system/plugin_catalog.py`, + `src/plugin_system/plugin_runtime.py`, `src/plugin_system/field_model.py` + and the `src/ipc/` package -- new core modules (described below) that + plugins do not normally import. ### Web UI: ES modules and one form model (stage 1) @@ -509,6 +539,14 @@ read any of them: twice. Assigning `cached_image` still stores exactly what was assigned. New `ScrollHelper.has_strip()` says whether there is a strip without building its image; the frame path and Vegas use it. +- The frame after a Vegas strip extension is no longer late on a Pi 4. The + render thread also laid out every plugin block of the new group (joining + its rows, measuring the separation between each pair) and pasted the + blocks into one image, about 37ms on hdpi against ~3.75ms of slack. The + thread that fetches the group now does that as each plugin arrives, and + the extension only writes the prepared pixels into the strip + (`ScrollHelper.append_content` takes RGB arrays): 3.2ms. In a 4 x 8 minute + A/B soak, extension frames went from 10 of 10 late to 3 of 10. ### Tooling @@ -616,12 +654,11 @@ plugin that still calls one gets an `AttributeError`; ### New modules (sports consolidation stage 4) -A plugin may import these via `src.*` once it floors on the release that -ships them (the first release cut from this section). All four hold code the +A plugin may import these via `src.*` once it floors on 3.8.0. All four hold code the scoreboard plugins carry as identical copies (checked at ledmatrix-plugins `56c4f15`), moved without behaviour change under the plugins' own names; each docstring lists what the host class must provide. Nothing in core uses -them yet. The plugins delete their copies when they floor on that release. +them yet. The plugins delete their copies when they floor on 3.8.0. - `src/common/sports_plugin_host.py` — `SportsPluginHostMixin`, ten helpers of the scoreboard plugin class (`manager.py`) identical in all nine: diff --git a/src/__init__.py b/src/__init__.py index 7236d44f..b181d528 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -4,5 +4,5 @@ LEDMatrix Display System Core source package for the LED Matrix Display project. """ -__version__ = "3.7.0" +__version__ = "3.8.0" diff --git a/src/common/README.md b/src/common/README.md index 5b11188c..b707b685 100644 --- a/src/common/README.md +++ b/src/common/README.md @@ -40,13 +40,13 @@ Rules for the package: | [`sports_card`](#sports_card) | Scoreboard card settings, colours, fonts, dates | Yes (scoreboards) | 3.3.0 | | [`sports_card_wrappers`](#sports_card_wrappers) | The game renderer's `sports_card` delegations | Yes (scoreboards) | 3.7.0 | | [`sports_celebration`](#sports_celebration) | Draw a scoreboard's score/win celebration | Yes (scoreboards) | 3.7.0 | -| [`sports_display_rules`](#sports_display_rules) | Which games a scoreboard shows, for how long, and its scorebug date line | Yes (scoreboards) | Unreleased | +| [`sports_display_rules`](#sports_display_rules) | Which games a scoreboard shows, for how long, and its scorebug date line | Yes (scoreboards) | 3.8.0 | | [`sports_fetch`](#sports_fetch) | Scoreboard season fetch, lookback and live-odds decisions | Yes (scoreboards) | 3.7.0 | -| [`sports_font_path`](#sports_font_path) | Find a scoreboard's bundled font whatever the cwd | Yes (scoreboards) | Unreleased | +| [`sports_font_path`](#sports_font_path) | Find a scoreboard's bundled font whatever the cwd | Yes (scoreboards) | 3.8.0 | | [`sports_game_renderer`](#sports_game_renderer) | Scoreboard scroll/Vegas card geometry | Yes (scoreboards) | 3.3.0 | | [`sports_helpers`](#sports_helpers) | Small helpers every scoreboard `sports.py` copies | Yes (scoreboards) | 3.5.0 | -| [`sports_live_scroll`](#sports_live_scroll) | Rebuild a live scroll strip mid-cycle without moving it | Yes (scoreboards) | Unreleased | -| [`sports_plugin_host`](#sports_plugin_host) | Helpers of a scoreboard's plugin class (`manager.py`) | Yes (scoreboards) | Unreleased | +| [`sports_live_scroll`](#sports_live_scroll) | Rebuild a live scroll strip mid-cycle without moving it | Yes (scoreboards) | 3.8.0 | +| [`sports_plugin_host`](#sports_plugin_host) | Helpers of a scoreboard's plugin class (`manager.py`) | Yes (scoreboards) | 3.8.0 | | [`sports_scroll`](#sports_scroll) | Scoreboard scroll-display orchestration | Yes (scoreboards) | 3.2.0 | | [`sports_shared`](#sports_shared) | Sport-independent `sports.py` methods | Yes (scoreboards) | 3.3.0 | | [`sports_vegas`](#sports_vegas) | Live Vegas cards: keys, card cache, sticky odds, finished games | Yes (scoreboards) | 3.8.0 |