Deletions, each re-verified with a fresh repo-wide grep (core, web,
scripts, docs, plugin monorepo) immediately before removal:
Modules with zero live importers:
- src/background_cache_mixin.py + src/generic_cache_mixin.py (134+150
LOC — referenced only by each other)
- src/font_test_manager.py (134 LOC)
- src/image_utils.py (22 LOC, self-documented deprecated)
- src/layout_manager.py (408 LOC — only its own test imported it) +
test/test_layout_manager.py
- src/common/basketball_plugin_example.py (328 LOC sample)
requirements.txt entries with zero importers in core (pre-plugin-era
manager deps): icalevents, geopy, timezonefinder, unidecode. Plus the
google-auth trio (google-auth-oauthlib, google-auth-httplib2,
google-api-python-client): their only importer is the calendar PLUGIN,
which declares all three in its own requirements.txt (verified in the
monorepo and on an installed copy) — the plugin dependency installer
owns them. Existing venvs are unaffected (removal doesn't uninstall);
fresh installs get them when calendar is installed.
Two stale references cleaned (a comment in test_pillow_compat.py, a
directory listing in HOW_TO_RUN_TESTS.md). Full suite green except the
two documented pre-existing failures (circuit_breaker mock drift, fixed
in #400; clock-simple 64x32 overflow, pre-dates this series); all core
entry modules verified importing cleanly under the emulator.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FqzC1nzTWL4kaqgMaQZFam
March Madness is now available in the ledmatrix-plugins monorepo store
(ChuckBuilds/ledmatrix-plugins/plugins/march-madness) and should be
installed via the Plugin Store like any other plugin.
Removing the bundled copy so new installs don't automatically include it.
Existing users keep their installed version until they choose to uninstall.
Co-authored-by: Chuck <chuck@example.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add March Madness plugin and tournament round logos
New dedicated March Madness plugin with scrolling tournament ticker:
- Fetches NCAA tournament data from ESPN scoreboard API
- Shows seeded matchups with team logos, live scores, and round separators
- Highlights upsets (higher seed beating lower seed) in gold
- Auto-enables during tournament window (March 10 - April 10)
- Configurable for NCAAM and NCAAW tournaments
- Vegas mode support via get_vegas_content()
Tournament round logo assets:
- MARCH_MADNESS.png, ROUND_64.png, ROUND_32.png
- SWEET_16.png, ELITE_8.png, FINAL_4.png, CHAMPIONSHIP.png
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(store): prevent bulk-update from stalling on bundled/in-repo plugins
Three related bugs caused the bulk plugin update to stall at 3/19:
1. Bundled plugins (e.g. starlark-apps, shipped with LEDMatrix rather
than the plugin registry) had no metadata file, so update_plugin()
returned False → API returned 500 → frontend queue halted.
Fix: check for .plugin_metadata.json with install_type=bundled and
return True immediately (these plugins update with LEDMatrix itself).
2. git config --get remote.origin.url (without --local) walked up the
directory tree and found the parent LEDMatrix repo's remote URL for
plugins that live inside plugin-repos/. This caused the store manager
to attempt a 60-second git clone of the wrong repo for every update.
Fix: use --local to scope the lookup to the plugin directory only.
3. hello-world manifest.json had a trailing comma causing JSON parse
errors on every plugin discovery cycle (fixed on devpi directly).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(march-madness): address PR #263 code review findings
- Replace self.is_enabled with BasePlugin.self.enabled in update(),
display(), and supports_dynamic_duration() so runtime toggles work
- Support quarter-based period labels for NCAAW (Q1..Q4 vs H1..H2),
detected via league key or status_detail content
- Use live refresh interval (60s) for cache max_age during live games
instead of hardcoded 300s
- Narrow broad except in _load_round_logos to (OSError, ValueError)
with a fallback except Exception using logger.exception for traces
- Remove unused `situation` local variable from _parse_event()
- Add numpy>=1.24.0 to requirements.txt (imported but was missing)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Chuck <chuck@example.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>