Moves the 35 @deprecated markers from 3.7.0 (already shipped with them in place) to 3.8.0, and adds scripts/plugin_api_usage.py plus the generated docs/DEPRECATIONS_3.8.md: who still calls or overrides each deprecated method across core, the monorepo and third-party plugins. Removes nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 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-09-29, core 3.7.0
- Monorepo: ChuckBuilds/ledmatrix-plugins (main @ 4327c2e4), 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)
35 deprecated methods: 35 unused, 0 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 |
PluginManager.get_enabled_plugins |
3.8.0 | — | — | — | unused — safe to remove in 3.8.0 |
Unused — safe to remove (35)
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, PluginManager.get_enabled_plugins
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:1356 | internal (in DisplayManager.draw_rain) |
self.draw_cloud(x, y, size) |
DisplayManager.draw_cloud |
core | src/display_manager.py:1371 | 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:1515 | 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:76 | unrelated | def draw_weather_icon(image, icon_code, x, y, size): |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:1265 | unrelated | WeatherIcons.draw_weather_icon(img, icon_code, icon_x, icon_y, |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:1544 | unrelated | WeatherIcons.draw_weather_icon(img, forecast['icon'], icon_x, icon_y, icon_size) |
DisplayManager.draw_weather_icon |
ledmatrix-weather | manager.py:1635 | 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:217 | test call | assert fm.get_font_catalog() == fm.font_catalog |
Sources scanned
| Source | Group | Python files | Hits |
|---|---|---|---|
| core | core | 158 | 20 |
| core tests | core-tests | 316 | 14 |
| 7-segment-clock | monorepo | 3 | 0 |
| afl-scoreboard | monorepo | 34 | 0 |
| baseball-scoreboard | monorepo | 60 | 0 |
| basketball-scoreboard | monorepo | 48 | 0 |
| birdnet-go | monorepo | 2 | 0 |
| blackjack | monorepo | 7 | 0 |
| calendar | monorepo | 5 | 0 |
| 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 | 73 | 0 |
| geochron | monorepo | 10 | 0 |
| hello-world | monorepo | 2 | 0 |
| hockey-scoreboard | monorepo | 51 | 0 |
| incoming-packages | monorepo | 8 | 0 |
| jellyfin-now-playing | monorepo | 4 | 0 |
| lacrosse-scoreboard | monorepo | 39 | 0 |
| ledmatrix-elections | monorepo | 12 | 0 |
| ledmatrix-flights | monorepo | 45 | 0 |
| ledmatrix-leaderboard | monorepo | 9 | 0 |
| ledmatrix-music | monorepo | 11 | 0 |
| ledmatrix-stocks | monorepo | 7 | 0 |
| ledmatrix-weather | monorepo | 14 | 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 | 29 | 0 |
| odds-ticker | monorepo | 9 | 0 |
| of-the-day | monorepo | 14 | 0 |
| olympics | monorepo | 16 | 0 |
| on-air | monorepo | 2 | 0 |
| pomodoro-timer | monorepo | 3 | 0 |
| soccer-scoreboard | monorepo | 46 | 0 |
| static-image | monorepo | 3 | 0 |
| stock-news | monorepo | 3 | 0 |
| text-display | monorepo | 4 | 0 |
| tide-display | monorepo | 3 | 0 |
| ufc-scoreboard | monorepo | 34 | 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__).