Files
LEDMatrix/docs/DEPRECATIONS_3.8.md
T
ChuckandClaude Opus 5.5 c8a0ddcf7b chore(deprecation): retarget the 35 deprecations to 3.8.0 and add a usage scan (#681)
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>
2026-09-30 09:11:36 -04:00

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__).