Files
LEDMatrix/docs/DEPRECATIONS_3.8.md
T
ChuckandClaude Opus 5.5 2601cb4cbb chore(deprecation): remove the 35 APIs deprecated for 3.8.0 (#708)
* 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>
2026-10-01 10:45:28 -04:00

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