Skip to content

Commit cb0545e

Browse files
authored
release: report 3.3.0, so the version the gate reads matches the tag (#516)
v3.3.0 is tagged, but src/__init__.py still says "3.2.0" -- and that string, not the git tag, is what the compatibility gate compares (store_manager.py: `from src import __version__ as core_version`). The effect is that every plugin flooring at 3.3.0 is refused on a device running 3.3.0. Checked against the real gate and the real manifest: core __version__ reported to the gate : 3.2.0 hockey floor : 3.3.0 verdict : REFUSE "supports LEDMatrix >=3.3.0, but this system is running 3.2.0" That is all eight sports scoreboards plus calendar 1.2.3, and it would read as a broken plugin store rather than a stale constant. The TRUSTWORTHY_FLOOR escape hatch does not cover this: it exempts cores reporting below 2.0.0 as "unknown rather than old", and 3.2.0 is above it, so the number is trusted and compared. This is the same slip as v3.1.0, which was tagged six weeks before its version string was bumped and shipped __version__ = "1.0.0" -- the reason that escape hatch exists at all. With the bump, the same gate call returns ALLOW for hockey at both the sports_card and sports_shared floors, and for calendar 1.2.3. CHANGELOG.md gains the 3.3.0 section. That file is what plugin authors read to decide which release to floor on, so it records the three new modules -- src/common/sports_card.py, sports_game_renderer.py and sports_shared.py -- against this version, along with the three traps in adopting the mixins. No test pinned the old literal; the ones that care monkeypatch __version__. 135 compatibility tests pass.
1 parent 300cdaa commit cb0545e

2 files changed

Lines changed: 76 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,81 @@ release that ships it.
1717
accepts both, but the store flags the old spelling as deprecated
1818
(`store_manager.py`) and only the new one is in `schema/manifest_schema.json`.
1919

20+
## 3.3.0
21+
22+
**The release the sports scoreboards floor on to delete their bundled copies.**
23+
3.2.0 shipped the unified sports library and made `ledmatrix_min_version`
24+
enforceable; this ships the last three shared modules and completes the store
25+
gate, so a scoreboard can now floor here and carry no fallback at all.
26+
27+
New modules a plugin may import via `src.*` and floor on 3.3.0 for:
28+
29+
- `src/common/sports_card.py` — settings, colour, font and date helpers for a
30+
scoreboard's `game_renderer.py`. Free functions taking `config`/`fonts`
31+
explicitly, so nothing about the caller's class is assumed.
32+
- `src/common/sports_game_renderer.py``SportsGameRendererMixin`: scroll/Vegas
33+
card geometry (centre gap, logo slot and cache key, layout offsets, the
34+
upcoming-card date and time layout). No `__init__` and no state, so adoption
35+
is one line on the class statement.
36+
- `src/common/sports_shared.py``SportsCoreSharedMixin`,
37+
`SportsLiveSharedMixin`, `SportsRecentSharedMixin`: the `sports.py` bodies
38+
byte-identical in all eight lineage-sharing scoreboards.
39+
40+
All three sit under `src/common/` rather than `src/base_classes/sports/`,
41+
deliberately: importing that package pulls `core.py``DisplayManager`
42+
`rgbmatrix`, and these are pure logic. Plugins importing them must not acquire a
43+
hardware dependency.
44+
45+
Three notes for anyone adopting `sports_shared`:
46+
47+
- `SportsRecentSharedMixin` defines `__init__`. Its bare `super()` binds to the
48+
mixin, so it reaches the host only when the mixin is listed **first** in the
49+
bases. Reversing that order silently skips the host constructor.
50+
- Methods that resolve the plugin's `config_schema.json` use `_plugin_dir()`,
51+
which walks the MRO rather than reading `__file__``__file__` is now
52+
`src/common/`. It walks because `SportsCore` is an ABC: a subclass built with
53+
`type(name, bases, ns)` reports `__module__` as `"abc"`.
54+
- `_get_timezone`, `_extract_game_details` and `_fetch_data` are byte-identical
55+
across the eight but stay in the plugins. The first binds a per-plugin
56+
timezone module whose contents differ; the other two are the abstract stubs
57+
that define the sport.
58+
59+
**The store's compatibility gate is now on every registry-managed route.** 3.2.0
60+
gated `install_plugin`. This release gates the git-pull update path and
61+
`install_from_url`, so a plugin whose floor the core cannot meet is refused
62+
after download with no partial directory left behind.
63+
64+
### Fixed
65+
66+
- **ESPN 403s.** `site.api` began rejecting the User-Agent strings this repo
67+
sent on 2026-08-04; every shared-data-source scoreboard returned
68+
`403 Forbidden`. Requests now send an identifying token with a project URL —
69+
browser-style strings and bare custom tokens are both refused.
70+
- **Low-memory boards becoming unreachable under load** while still answering
71+
pings and serving the web UI. Fetched payloads are released after delivery
72+
rather than pinned on the completed request for up to an hour, malloc arenas
73+
are capped, and log volume and SD writes are reduced. Available memory is now
74+
reported in Tools diagnostics.
75+
- **A failed logo download pinning a team to a grey box**: the placeholder was
76+
written under the real logo's filename, so later attempts found a file and
77+
reported success without retrying.
78+
- **A plugin enabled but never loaded is retried** rather than staying absent
79+
with `error = null`.
80+
- `ttl` now controls cache expiry; abandoned cache writes no longer leave temp
81+
files; one cache-cleanup thread per directory rather than per manager.
82+
- Odds are fetched for the games displayed, not the whole schedule window, and a
83+
stalled ESPN no longer stalls the whole plugin update.
84+
- Array-item secrets are no longer wiped or logged.
85+
- A restored backup matches the device it was taken from.
86+
- The web UI reports the real error instead of "unknown", rejects non-finite
87+
JSON numbers, and stops checkbox groups posting back hidden options.
88+
89+
### Added
90+
91+
- `display.hardware.orientation` for panels mounted upside down.
92+
- Vegas keeps live content in the ticker rather than being preempted by it.
93+
- Schemas can label enum dropdown options.
94+
2095
## 3.2.0
2196

2297
**The first release shipping the unified sports library.** This is the version

src/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
Core source package for the LED Matrix Display project.
55
"""
66

7-
__version__ = "3.2.0"
7+
__version__ = "3.3.0"
88

0 commit comments

Comments
 (0)