* 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 <noreply@anthropic.com> * 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 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
15 KiB
Deprecated plugin APIs: usage scan
Generated by scripts/plugin_api_usage.py — do not edit by hand; re-run it (see How to re-run).
- Scanned: 2026-10-01, core 3.7.0
- Monorepo: ChuckBuilds/ledmatrix-plugins (main @ 4de1d134), 46 plugins
- Third-party plugins: 8 with their own repo in
plugins.json(f1-live, gif-player, pga-tour-leaderboard, plex-marquee, ledmatrix-dresden-departures, tidbyt-baseball-scoreboard, sleeper-fantasy, ledmatrix-nascar)
37 deprecated methods: 36 unused, 1 still used, 0 need review.
Counted per plugin: a call is <receiver>.method on an object named like the owner (cache_manager, display_manager, font_manager, plugin_manager), or on self/super() in a subclass; an override is def method in a subclass of the owner. Review hits are .method on a receiver whose type the scan cannot tell. Internal hits sit inside another deprecated core method and go with it. Unrelated hits are a different class's own method with the same name (a name collision), and never block removal; neither do hits in test files.
| Method | Removal | Core | Plugins (calls / overrides) | Name collisions & tests | Verdict |
|---|---|---|---|---|---|
CacheManager.has_data_changed |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.update_cache |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.setup_persistent_cache |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.get_sport_live_interval |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.get_sport_key_from_cache_key |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.get_background_cached_data |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.is_background_data_available |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.record_cache_hit |
3.8.0 | core (1 internal) | — | — | unused — safe to remove in 3.8.0 |
CacheManager.record_cache_miss |
3.8.0 | core (1 internal) | — | — | unused — safe to remove in 3.8.0 |
CacheManager.record_fetch_time |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.get_cache_metrics |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.log_cache_metrics |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
CacheManager.get_memory_cache_stats |
3.8.0 | core tests (3 test calls) | — | — | unused — safe to remove in 3.8.0 |
DisplayManager.draw_sun |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
DisplayManager.draw_cloud |
3.8.0 | core (2 internals) | — | ledmatrix-weather (1 unrelated) | unused — safe to remove in 3.8.0 |
DisplayManager.draw_rain |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
DisplayManager.draw_snow |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
DisplayManager.draw_weather_icon |
3.8.0 | core (1 internal) | — | ledmatrix-weather (5 unrelateds) | unused — safe to remove in 3.8.0 |
DisplayManager.draw_text_with_icons |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
DisplayManager.get_scrolling_stats |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_manager_fonts |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_detected_fonts |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.unregister_plugin_fonts |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_plugin_fonts |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.set_override |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.remove_override |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_overrides |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_available_fonts |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_size_tokens |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_performance_stats |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.get_font_catalog |
3.8.0 | core tests (1 test call) | — | — | unused — safe to remove in 3.8.0 |
FontManager.add_font |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.remove_font |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
FontManager.validate_font |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
BasePlugin.get_supported_vegas_modes |
3.9.0 | core tests (2 test reviews) | blackjack (1 call, 1 override); calendar (1 override); olympics (1 override) | — | still used by blackjack, calendar, olympics — keep or migrate first |
BasePlugin.get_vegas_segment_width |
3.9.0 | core tests (1 test review) | — | — | unused — safe to remove in 3.9.0 |
PluginManager.get_enabled_plugins |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
Unused — safe to remove (36)
CacheManager.has_data_changed, CacheManager.update_cache, CacheManager.setup_persistent_cache, CacheManager.get_sport_live_interval, CacheManager.get_sport_key_from_cache_key, CacheManager.get_background_cached_data, CacheManager.is_background_data_available, CacheManager.record_cache_hit, CacheManager.record_cache_miss, CacheManager.record_fetch_time, CacheManager.get_cache_metrics, CacheManager.log_cache_metrics, CacheManager.get_memory_cache_stats, DisplayManager.draw_sun, DisplayManager.draw_cloud, DisplayManager.draw_rain, DisplayManager.draw_snow, DisplayManager.draw_weather_icon, DisplayManager.draw_text_with_icons, DisplayManager.get_scrolling_stats, FontManager.get_manager_fonts, FontManager.get_detected_fonts, FontManager.unregister_plugin_fonts, FontManager.get_plugin_fonts, FontManager.set_override, FontManager.remove_override, FontManager.get_overrides, FontManager.get_available_fonts, FontManager.get_size_tokens, FontManager.get_performance_stats, FontManager.get_font_catalog, FontManager.add_font, FontManager.remove_font, FontManager.validate_font, BasePlugin.get_vegas_segment_width, PluginManager.get_enabled_plugins
Still used — keep or migrate first (1)
BasePlugin.get_supported_vegas_modes
Every hit
File paths are relative to the plugin's directory (core: the repo root).
| Method | Where | File:line | Kind | Code |
|---|---|---|---|---|
CacheManager.get_sport_live_interval |
core | src/cache/cache_strategy.py:28 | unrelated | def get_sport_live_interval(self, sport_key: str) -> int: |
CacheManager.get_sport_live_interval |
core | src/cache/cache_strategy.py:60 | unrelated | live_interval = self.get_sport_live_interval(sport_key) |
CacheManager.get_sport_live_interval |
core | src/cache_manager.py:785 | unrelated | return self._strategy_component.get_sport_live_interval(sport_key) |
CacheManager.get_sport_key_from_cache_key |
core | src/cache/cache_strategy.py:214 | unrelated | def get_sport_key_from_cache_key(self, key: str) -> Optional[str]: |
CacheManager.get_sport_key_from_cache_key |
core | src/cache_manager.py:806 | unrelated | return self._strategy_component.get_sport_key_from_cache_key(key) |
CacheManager.get_sport_key_from_cache_key |
core | src/cache_manager.py:816 | unrelated | sport_key = self._strategy_component.get_sport_key_from_cache_key(key) |
CacheManager.record_cache_hit |
core | src/cache_manager.py:869 | internal (in CacheManager.get_background_cached_data) |
self.record_cache_hit('background') |
CacheManager.record_cache_miss |
core | src/cache_manager.py:876 | internal (in CacheManager.get_background_cached_data) |
self.record_cache_miss('background') |
CacheManager.record_fetch_time |
core | src/cache/cache_metrics.py:67 | unrelated | def record_fetch_time(self, duration: float) -> None: |
CacheManager.record_fetch_time |
core | src/cache_manager.py:922 | unrelated | self._metrics_component.record_fetch_time(duration) |
CacheManager.get_memory_cache_stats |
core tests | test/test_cache_manager_memory_tier.py:43 | test call | stats = cm.get_memory_cache_stats() |
CacheManager.get_memory_cache_stats |
core tests | test/test_cache_manager_memory_tier.py:63 | test call | assert cm.get_memory_cache_stats()["last_cleanup"] >= before |
CacheManager.get_memory_cache_stats |
core tests | test/test_cache_manager_memory_tier.py:68 | test call | stats = cm.get_memory_cache_stats() |
DisplayManager.draw_sun |
core | src/plugin_system/testing/visual_display_manager.py:417 | unrelated | def draw_sun(self, x: int, y: int, size: int = 16): |
DisplayManager.draw_cloud |
core | src/display_manager.py:1359 | internal (in DisplayManager.draw_rain) |
self.draw_cloud(x, y, size) |
DisplayManager.draw_cloud |
core | src/display_manager.py:1374 | internal (in DisplayManager.draw_snow) |
self.draw_cloud(x, y, size) |
DisplayManager.draw_cloud |
core | src/plugin_system/testing/visual_display_manager.py:421 | unrelated | def draw_cloud(self, x: int, y: int, size: int = 16, color: Tuple[int, int, int] = (200, 200, 200)): |
DisplayManager.draw_cloud |
ledmatrix-weather | weather_icons.py:184 | unrelated | def draw_cloud(draw: ImageDraw, x: int, y: int, size: int = 16, color: tuple = (200, 200, 200)): |
DisplayManager.draw_rain |
core | src/plugin_system/testing/visual_display_manager.py:425 | unrelated | def draw_rain(self, x: int, y: int, size: int = 16): |
DisplayManager.draw_snow |
core | src/plugin_system/testing/visual_display_manager.py:429 | unrelated | def draw_snow(self, x: int, y: int, size: int = 16): |
DisplayManager.draw_weather_icon |
core | src/display_manager.py:1518 | internal (in DisplayManager.draw_text_with_icons) |
self.draw_weather_icon(icon_type, icon_x, icon_y) |
DisplayManager.draw_weather_icon |
core | src/plugin_system/testing/visual_display_manager.py:510 | unrelated | def draw_weather_icon(self, condition: str, x: int, y: int, size: int = 16) -> None: |
DisplayManager.draw_weather_icon |
core | src/plugin_system/testing/visual_display_manager.py:533 | unrelated | self.draw_weather_icon(icon_type, icon_x, icon_y) |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:84 | unrelated | def draw_weather_icon(image, icon_code, x, y, size): |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:1280 | unrelated | WeatherIcons.draw_weather_icon(img, icon_code, icon_x, icon_y, |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:1559 | unrelated | WeatherIcons.draw_weather_icon(img, forecast['icon'], icon_x, icon_y, icon_size) |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:1650 | unrelated | WeatherIcons.draw_weather_icon(img, forecast['icon'], icon_x, icon_y, icon_size) |
DisplayManager.draw_weather_icon |
ledmatrix-weather | weather_icons.py:168 | unrelated | def draw_weather_icon(image: Image.Image, icon_code: str, x: int, y: int, size: int = DEFAULT_SIZE): |
DisplayManager.draw_text_with_icons |
core | src/plugin_system/testing/visual_display_manager.py:526 | unrelated | def draw_text_with_icons(self, text: str, icons: List[tuple] = None, |
FontManager.get_font_catalog |
core tests | test/test_deprecation.py:229 | test call | assert fm.get_font_catalog() == fm.font_catalog |
BasePlugin.get_supported_vegas_modes |
core tests | test/test_vegas_participation.py:356 | test review | assert plugin.get_supported_vegas_modes() == [ |
BasePlugin.get_supported_vegas_modes |
core tests | test/test_vegas_participation.py:358 | test review | assert plugin.get_supported_vegas_modes() |
BasePlugin.get_supported_vegas_modes |
blackjack | manager.py:732 | override | def get_supported_vegas_modes(self): |
BasePlugin.get_supported_vegas_modes |
blackjack | manager.py:695 | call | if mode in self.get_supported_vegas_modes(): |
BasePlugin.get_supported_vegas_modes |
calendar | manager.py:875 | override | def get_supported_vegas_modes(self) -> List[VegasDisplayMode]: |
BasePlugin.get_supported_vegas_modes |
olympics | manager.py:624 | override | def get_supported_vegas_modes(self) -> List[VegasDisplayMode]: |
BasePlugin.get_vegas_segment_width |
core tests | test/test_vegas_participation.py:359 | test review | assert plugin.get_vegas_segment_width() == 2 |
Sources scanned
| Source | Group | Python files | Hits |
|---|---|---|---|
| core | core | 172 | 20 |
| core tests | core-tests | 347 | 17 |
| 7-segment-clock | monorepo | 3 | 0 |
| afl-scoreboard | monorepo | 35 | 0 |
| baseball-scoreboard | monorepo | 61 | 0 |
| basketball-scoreboard | monorepo | 49 | 0 |
| birdnet-go | monorepo | 2 | 0 |
| blackjack | monorepo | 7 | 2 |
| calendar | monorepo | 5 | 1 |
| christmas-countdown | monorepo | 3 | 0 |
| clock-simple | monorepo | 2 | 0 |
| countdown | monorepo | 5 | 0 |
| cricket-scoreboard | monorepo | 8 | 0 |
| f1-scoreboard | monorepo | 15 | 0 |
| fantasy-blitz | monorepo | 13 | 0 |
| football-scoreboard | monorepo | 74 | 0 |
| geochron | monorepo | 10 | 0 |
| hello-world | monorepo | 2 | 0 |
| hockey-scoreboard | monorepo | 52 | 0 |
| incoming-packages | monorepo | 8 | 0 |
| jellyfin-now-playing | monorepo | 4 | 0 |
| lacrosse-scoreboard | monorepo | 40 | 0 |
| ledmatrix-elections | monorepo | 12 | 0 |
| ledmatrix-flights | monorepo | 48 | 0 |
| ledmatrix-leaderboard | monorepo | 9 | 0 |
| ledmatrix-music | monorepo | 11 | 0 |
| ledmatrix-stocks | monorepo | 7 | 0 |
| ledmatrix-weather | monorepo | 15 | 6 |
| march-madness | monorepo | 4 | 0 |
| masters-tournament | monorepo | 10 | 0 |
| mqtt-notifications | monorepo | 4 | 0 |
| news | monorepo | 6 | 0 |
| nfl-draft | monorepo | 3 | 0 |
| nfl-stat-leaders | monorepo | 8 | 0 |
| nrl-scoreboard | monorepo | 30 | 0 |
| odds-ticker | monorepo | 9 | 0 |
| of-the-day | monorepo | 14 | 0 |
| olympics | monorepo | 16 | 1 |
| on-air | monorepo | 2 | 0 |
| pomodoro-timer | monorepo | 3 | 0 |
| soccer-scoreboard | monorepo | 47 | 0 |
| static-image | monorepo | 3 | 0 |
| stock-news | monorepo | 3 | 0 |
| text-display | monorepo | 4 | 0 |
| tide-display | monorepo | 3 | 0 |
| ufc-scoreboard | monorepo | 38 | 0 |
| web-ui-info | monorepo | 2 | 0 |
| youtube-stats | monorepo | 5 | 0 |
| f1-live | third-party | 10 | 0 |
| gif-player | third-party | 1 | 0 |
| pga-tour-leaderboard | third-party | 2 | 0 |
| plex-marquee | third-party | 1 | 0 |
| ledmatrix-dresden-departures | third-party | 1 | 0 |
| tidbyt-baseball-scoreboard | third-party | 2 | 0 |
| sleeper-fantasy | third-party | 1 | 0 |
| ledmatrix-nascar | third-party | 1 | 0 |
How to re-run
# Clones the monorepo and each third-party plugin (depth 1) into a temp cache:
python3 scripts/plugin_api_usage.py --output docs/DEPRECATIONS_3.8.md
# Or scan a local monorepo checkout (read only) instead of cloning it:
python3 scripts/plugin_api_usage.py --monorepo ../ledmatrix-plugins
Before removing a method in its release, re-run the scan against the current monorepo and registry: a plugin added since this file was generated may have started calling it. Remove only methods the fresh scan reports unused; move the rest to a later release (the test in test/test_deprecation.py fails while a marker names a release at or below src.__version__).