Whole-tree audit. Every symbol was checked against core, the plugin monorepo and all eight third-party plugins in plugins.json first. - Deprecate (removal 3.10.0) plugin-facing methods nothing calls: LogoDownloader bulk download, ConfigManager backup/secret wrappers, APIHelper extras, BackgroundDataService poll API, PluginManager / PluginStateManager info readers, and a few CacheManager, FontManager, BaseOddsManager, DynamicTeamResolver methods and PluginTestCase. plugin_api_usage.py learns their receiver names; DEPRECATIONS doc regenerated. - Remove core-internal dead code: CacheMetrics, Vegas status/stats plumbing, sync "new cycle" message (followers ignore unknown types), unused operation types, test-only PluginCatalog readers, IPC to_dict and ping, _parse_form_value, CacheStrategyProtocol, ErrorAggregator callbacks, duplicate web response helpers. - Web UI: drop never-mounted json-file-manager.js, the example widget, utils/error_handler.js, four uncalled PluginAPI methods, and 29 escapeHtml shims (call window.LEDEscape directly). Public globals, BaseWidget and widget names unchanged. - Remove six one-off scripts (owner decision) and the unused markupsafe and pytest-mock pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 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-05, core 3.8.2
- Monorepo: ChuckBuilds/ledmatrix-plugins (main @ 662fb86f), 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)
45 deprecated methods: 31 unused, 3 still used, 11 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 |
|---|---|---|---|---|---|
BackgroundDataService.get_result |
3.10.0 | core tests (15 test reviews) | — | — | unused — safe to remove in 3.10.0 |
BackgroundDataService.is_request_complete |
3.10.0 | core tests (11 test reviews) | — | — | unused — safe to remove in 3.10.0 |
BackgroundDataService.get_request_status |
3.10.0 | core tests (2 test reviews) | — | — | unused — safe to remove in 3.10.0 |
BaseOddsManager.get_odds_for_games |
3.10.0 | core tests (3 test reviews) | — | — | unused — safe to remove in 3.10.0 |
BaseOddsManager.format_odds_summary |
3.10.0 | core tests (5 test reviews) | — | — | unused — safe to remove in 3.10.0 |
CacheManager.load_cache |
3.10.0 | core tests (1 test review) | — | — | unused — safe to remove in 3.10.0 |
CacheManager.generate_sport_cache_key |
3.10.0 | core tests (2 test calls, 1 test review) | — | — | unused — safe to remove in 3.10.0 |
APIHelper.fetch_espn_scoreboard |
3.10.0 | core tests (1 test call, 4 test reviews) | — | football-scoreboard (1 test review); hockey-scoreboard (1 test review); ufc-scoreboard (3 test reviews) | unused — safe to remove in 3.10.0 |
APIHelper.fetch_espn_standings |
3.10.0 | core tests (1 test review) | — | — | unused — safe to remove in 3.10.0 |
APIHelper.fetch_espn_rankings |
3.10.0 | core tests (1 test review) | — | — | unused — safe to remove in 3.10.0 |
APIHelper.set_cache |
3.10.0 | core tests (1 test call, 1 test review) | — | — | unused — safe to remove in 3.10.0 |
APIHelper.get_cache |
3.10.0 | core tests (1 test call) | — | — | unused — safe to remove in 3.10.0 |
APIHelper.set_rate_limit |
3.10.0 | core tests (10 test calls, 3 test reviews) | — | — | unused — safe to remove in 3.10.0 |
APIHelper.get_request_stats |
3.10.0 | — | — | — | unused — safe to remove in 3.10.0 |
ConfigManager.rollback_config |
3.10.0 | core (1 internal); core tests (1 test review) | — | — | unused — safe to remove in 3.10.0 |
ConfigManager.list_backups |
3.10.0 | core (1 internal); core tests (1 test review) | — | — | unused — safe to remove in 3.10.0 |
ConfigManager.validate_config_file |
3.10.0 | core (1 internal) | — | — | unused — safe to remove in 3.10.0 |
ConfigManager.get_secret |
3.10.0 | core tests (5 test calls, 1 test review) | — | — | unused — safe to remove in 3.10.0 |
ConfigManager.cleanup_orphaned_plugin_configs |
3.10.0 | core tests (2 test calls, 1 test review) | — | — | unused — safe to remove in 3.10.0 |
ConfigManager.validate_all_plugin_configs |
3.10.0 | core tests (1 test call, 1 test review) | — | — | unused — safe to remove in 3.10.0 |
DynamicTeamResolver.get_available_dynamic_teams |
3.10.0 | — | — | — | unused — safe to remove in 3.10.0 |
DynamicTeamResolver.is_dynamic_team |
3.10.0 | — | — | — | unused — safe to remove in 3.10.0 |
FontManager.get_native_bdf_size |
3.10.0 | core tests (3 test calls) | — | — | unused — safe to remove in 3.10.0 |
FontManager.measure_text |
3.10.0 | core tests (5 test calls) | — | — | unused — safe to remove in 3.10.0 |
LogoDownloader.fetch_teams_data |
3.10.0 | core (2 internals) | — | — | still used by core — keep or migrate first |
LogoDownloader.extract_teams_from_data |
3.10.0 | core (2 internals) | — | — | still used by core — keep or migrate first |
LogoDownloader.download_missing_logos_for_league |
3.10.0 | core (1 call, 1 internal); core tests (2 test calls) | — | — | still used by core — keep or migrate first |
LogoDownloader.download_all_ncaa_football_logos |
3.10.0 | core tests (2 test calls) | — | — | unused — safe to remove in 3.10.0 |
LogoDownloader.download_all_missing_logos |
3.10.0 | — | — | — | unused — safe to remove in 3.10.0 |
LogoDownloader.convert_image_to_rgba |
3.10.0 | core (1 internal) | — | — | unused — safe to remove in 3.10.0 |
LogoDownloader.convert_all_logos_to_rgba |
3.10.0 | — | — | — | unused — safe to remove in 3.10.0 |
BasePlugin.get_supported_vegas_modes |
3.9.0 | core tests (2 test reviews) | — | — | unused — safe to remove in 3.9.0 |
BasePlugin.get_vegas_segment_width |
3.9.0 | core tests (1 test review) | — | — | unused — safe to remove in 3.9.0 |
PluginManager.get_all_plugins |
3.10.0 | — | football-scoreboard (1 review) | football-scoreboard (2 test reviews); hockey-scoreboard (1 test review) | needs review: possible use in football-scoreboard |
PluginManager.get_plugin_info |
3.10.0 | core (12 reviews, 1 internal); core tests (6 test calls, 9 test reviews) | — | — | needs review: possible use in core |
PluginManager.get_all_plugin_info |
3.10.0 | core (3 reviews); core tests (2 test calls, 11 test reviews) | — | — | needs review: possible use in core |
PluginManager.get_plugin_display_modes |
3.10.0 | core (4 reviews); core tests (3 test calls, 5 test reviews) | — | — | needs review: possible use in core |
PluginManager.find_plugin_for_mode |
3.10.0 | core (2 reviews) | — | — | needs review: possible use in core |
PluginStateManager.is_loaded |
3.10.0 | core (1 internal) | — | — | needs review: possible use in core |
PluginStateManager.is_running |
3.10.0 | core (1 internal) | — | — | needs review: possible use in core |
PluginStateManager.is_error |
3.10.0 | core (1 internal) | — | — | needs review: possible use in core |
PluginStateManager.get_error_info |
3.10.0 | core (1 internal); core tests (4 test calls) | — | — | needs review: possible use in core |
PluginStateManager.get_last_update |
3.10.0 | core (1 internal) | — | — | needs review: possible use in core |
PluginStateManager.get_state_info |
3.10.0 | core (1 internal); core tests (7 test reviews) | — | — | needs review: possible use in core |
PluginTestCase.setUp |
3.10.0 | — | — | basketball-scoreboard (2 test unrelateds); cricket-scoreboard (1 test unrelated); hockey-scoreboard (1 test unrelated); nrl-scoreboard (1 test unrelated) | unused — safe to remove in 3.10.0 |
Unused — safe to remove (31)
BackgroundDataService.get_result, BackgroundDataService.is_request_complete, BackgroundDataService.get_request_status, BaseOddsManager.get_odds_for_games, BaseOddsManager.format_odds_summary, CacheManager.load_cache, CacheManager.generate_sport_cache_key, APIHelper.fetch_espn_scoreboard, APIHelper.fetch_espn_standings, APIHelper.fetch_espn_rankings, APIHelper.set_cache, APIHelper.get_cache, APIHelper.set_rate_limit, APIHelper.get_request_stats, ConfigManager.rollback_config, ConfigManager.list_backups, ConfigManager.validate_config_file, ConfigManager.get_secret, ConfigManager.cleanup_orphaned_plugin_configs, ConfigManager.validate_all_plugin_configs, DynamicTeamResolver.get_available_dynamic_teams, DynamicTeamResolver.is_dynamic_team, FontManager.get_native_bdf_size, FontManager.measure_text, LogoDownloader.download_all_ncaa_football_logos, LogoDownloader.download_all_missing_logos, LogoDownloader.convert_image_to_rgba, LogoDownloader.convert_all_logos_to_rgba, BasePlugin.get_supported_vegas_modes, BasePlugin.get_vegas_segment_width, PluginTestCase.setUp
Still used — keep or migrate first (3)
LogoDownloader.fetch_teams_data, LogoDownloader.extract_teams_from_data, LogoDownloader.download_missing_logos_for_league
Needs review (11)
PluginManager.get_all_plugins, PluginManager.get_plugin_info, PluginManager.get_all_plugin_info, PluginManager.get_plugin_display_modes, PluginManager.find_plugin_for_mode, PluginStateManager.is_loaded, PluginStateManager.is_running, PluginStateManager.is_error, PluginStateManager.get_error_info, PluginStateManager.get_last_update, PluginStateManager.get_state_info
Every hit
File paths are relative to the plugin's directory (core: the repo root).
| Method | Where | File:line | Kind | Code |
|---|---|---|---|---|
BackgroundDataService.get_result |
core tests | test/test_background_data_service.py:85 | test review | result = service.get_result(req_id) |
BackgroundDataService.get_result |
core tests | test/test_background_data_service.py:107 | test review | seen["filed"] = service.get_result(result.request_id) is result |
BackgroundDataService.get_result |
core tests | test/test_background_data_service.py:148 | test review | result = service.get_result(req_id) |
BackgroundDataService.get_result |
core tests | test/test_background_data_service.py:165 | test review | result = service.get_result(req_id) |
BackgroundDataService.get_result |
core tests | test/test_background_data_service.py:254 | test review | assert service.get_result("unknown") is None |
BackgroundDataService.get_result |
core tests | test/test_background_data_service.py:391 | test review | assert service.get_result(rid).cached is True |
BackgroundDataService.get_result |
core tests | test/test_background_fetch_dedupe.py:198 | test review | assert service.get_result(req).success is True |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:85 | test review | result = service.get_result(req_id) |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:117 | test review | stored = service.get_result(req_id) |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:144 | test review | assert service.get_result(req_id).data == PAYLOAD |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:154 | test review | stored = service.get_result(req_id) |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:171 | test review | assert service.get_result(req_id).data is None |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:193 | test review | assert service.get_result(req_id).data == PAYLOAD |
BackgroundDataService.get_result |
core tests | test/test_background_payload_release.py:278 | test review | stored = service.get_result(first) |
BackgroundDataService.get_result |
core tests | test/test_fetch_service.py:703 | test review | assert bds.get_result(request_id).success |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service.py:145 | test review | while not service.is_request_complete(req_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service.py:162 | test review | while not service.is_request_complete(req_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service.py:194 | test review | while not service.is_request_complete(req_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service.py:211 | test review | while not service.is_request_complete(req_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service.py:246 | test review | assert service.is_request_complete("r2") is False |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service.py:251 | test review | assert service.is_request_complete("r3") is True |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service_espn_ranges.py:91 | test review | while not service.is_request_complete(request_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_data_service_espn_ranges.py:154 | test review | while not service.is_request_complete(request_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_fetch_dedupe.py:55 | test review | while not service.is_request_complete(req_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_background_payload_release.py:67 | test review | while not service.is_request_complete(req_id) and time.time() < deadline: |
BackgroundDataService.is_request_complete |
core tests | test/test_fetch_service.py:701 | test review | while not bds.is_request_complete(request_id) and time.monotonic() < deadline: |
BackgroundDataService.get_request_status |
core tests | test/test_background_data_service.py:223 | test review | assert service.get_request_status("nonexistent") is None |
BackgroundDataService.get_request_status |
core tests | test/test_background_fetch_dedupe.py:448 | test review | assert service.get_request_status(rid) is FetchStatus.CANCELLED, ( |
BaseOddsManager.get_odds_for_games |
core tests | test/test_base_odds_manager.py:356 | test review | result = manager.get_odds_for_games(games) |
BaseOddsManager.get_odds_for_games |
core tests | test/test_base_odds_manager.py:374 | test review | result = manager.get_odds_for_games(games) |
BaseOddsManager.get_odds_for_games |
core tests | test/test_base_odds_manager.py:385 | test review | result = manager.get_odds_for_games([game]) |
BaseOddsManager.format_odds_summary |
core tests | test/test_base_odds_manager.py:322 | test review | result = manager.format_odds_summary({ |
BaseOddsManager.format_odds_summary |
core tests | test/test_base_odds_manager.py:329 | test review | result = manager.format_odds_summary(FULL_EXTRACTED) |
BaseOddsManager.format_odds_summary |
core tests | test/test_base_odds_manager.py:333 | test review | assert manager.format_odds_summary(None) == 'No odds available' |
BaseOddsManager.format_odds_summary |
core tests | test/test_base_odds_manager.py:336 | test review | assert manager.format_odds_summary({}) == 'No odds available' |
BaseOddsManager.format_odds_summary |
core tests | test/test_base_odds_manager.py:339 | test review | assert manager.format_odds_summary( |
CacheManager.load_cache |
core tests | test/conftest.py:219 | test review | mock.load_cache = Mock(side_effect=mock_get) |
CacheManager.generate_sport_cache_key |
core tests | test/test_background_data_service.py:42 | test review | m.generate_sport_cache_key.return_value = "test_key" |
CacheManager.generate_sport_cache_key |
core tests | test/test_background_data_service.py:356 | test call | expected = CacheManager.generate_sport_cache_key(None, sport, date_str) |
CacheManager.generate_sport_cache_key |
core tests | test/test_background_data_service.py:367 | test call | theirs = cm_module.CacheManager.generate_sport_cache_key(None, "nba") |
APIHelper.fetch_espn_scoreboard |
core tests | test/test_api_helper.py:214 | test review | result = helper.fetch_espn_scoreboard('football', 'nfl') |
APIHelper.fetch_espn_scoreboard |
core tests | test/test_api_helper.py:230 | test review | helper.fetch_espn_scoreboard('basketball', 'nba', date='20250115') |
APIHelper.fetch_espn_scoreboard |
core tests | test/test_api_helper.py:239 | test review | helper.fetch_espn_scoreboard('basketball', 'nba', date='20250115', cache_key='mine') |
APIHelper.fetch_espn_scoreboard |
core tests | test/test_api_helper.py:251 | test review | assert helper.fetch_espn_scoreboard('basketball', 'nba', date='20250115') == { |
APIHelper.fetch_espn_scoreboard |
core tests | test/test_espn_scoreboard_cache.py:199 | test call | helper.fetch_espn_scoreboard("football", "nfl", date=self.DAY) |
APIHelper.fetch_espn_scoreboard |
football-scoreboard | test_espn_date_ranges.py:119 | test review | helper = sys.modules[sports.fetch_espn_scoreboard.__module__] |
APIHelper.fetch_espn_scoreboard |
hockey-scoreboard | test_espn_date_ranges.py:106 | test review | helper = sys.modules[sports.fetch_espn_scoreboard.__module__] |
APIHelper.fetch_espn_scoreboard |
ufc-scoreboard | test_every_bout_is_its_own_fight.py:103 | test review | _real_fetch = sports.fetch_espn_scoreboard |
APIHelper.fetch_espn_scoreboard |
ufc-scoreboard | test_every_bout_is_its_own_fight.py:108 | test review | sports.fetch_espn_scoreboard = lambda *a, **k: board(name) |
APIHelper.fetch_espn_scoreboard |
ufc-scoreboard | test_every_bout_is_its_own_fight.py:113 | test review | sports.fetch_espn_scoreboard = _real_fetch |
APIHelper.fetch_espn_standings |
core tests | test/test_api_helper.py:258 | test review | helper.fetch_espn_standings('football', 'nfl') |
APIHelper.fetch_espn_rankings |
core tests | test/test_api_helper.py:269 | test review | helper.fetch_espn_rankings('football', 'college-football') |
APIHelper.set_cache |
core tests | test/test_api_helper.py:128 | test review | helper.set_cache('k', {'a': 1}, ttl=42) |
APIHelper.set_cache |
core tests | test/test_api_helper.py:350 | test call | assert helper.set_cache('k', {'a': 1}) is None |
APIHelper.get_cache |
core tests | test/test_api_helper.py:348 | test call | assert helper.get_cache('k') is None |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:42 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:57 | test review | helper.set_rate_limit(5) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:72 | test review | helper.set_rate_limit(5) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:91 | test review | helper.set_rate_limit(5) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:150 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:305 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:313 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:326 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:334 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_api_helper.py:346 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_espn_scoreboard_cache.py:197 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_fetch_service.py:726 | test call | helper.set_rate_limit(0) |
APIHelper.set_rate_limit |
core tests | test/test_fetch_service.py:1143 | test call | helper.set_rate_limit(0) |
ConfigManager.rollback_config |
core | src/config_manager.py:191 | internal (in ConfigManager.rollback_config) |
success = atomic_mgr.rollback_config(backup_version) |
ConfigManager.rollback_config |
core | src/config_manager_atomic.py:297 | unrelated | def rollback_config(self, backup_version: Optional[str] = None) -> bool: |
ConfigManager.rollback_config |
core tests | test/test_config_durable_writes.py:345 | test review | assert manager.rollback_config() |
ConfigManager.list_backups |
core | src/config_manager.py:212 | internal (in ConfigManager.list_backups) |
return atomic_mgr.list_backups() |
ConfigManager.list_backups |
core | src/config_manager_atomic.py:334 | unrelated | def list_backups(self) -> List[BackupInfo]: |
ConfigManager.list_backups |
core | src/config_manager_atomic.py:309 | unrelated | backups = self.list_backups() |
ConfigManager.list_backups |
core tests | test/test_config_durable_writes.py:323 | test review | assert [b.path for b in manager.list_backups()] == [ |
ConfigManager.validate_config_file |
core | src/config_manager.py:226 | internal (in ConfigManager.validate_config_file) |
return atomic_mgr.validate_config_file(config_path) |
ConfigManager.validate_config_file |
core | src/config_manager_atomic.py:426 | unrelated | def validate_config_file(self, config_path: Optional[str] = None) -> ValidationResult: |
ConfigManager.get_secret |
core tests | test/conftest.py:246 | test review | mock.get_secret = Mock(side_effect=mock_get_secret) |
ConfigManager.get_secret |
core tests | test/test_config_manager.py:317 | test call | assert manager.get_secret("api_key") == "secret123" |
ConfigManager.get_secret |
core tests | test/test_config_manager.py:318 | test call | assert manager.get_secret("token") == "token456" |
ConfigManager.get_secret |
core tests | test/test_config_manager.py:319 | test call | assert manager.get_secret("nonexistent") is None |
ConfigManager.get_secret |
core tests | test/test_config_manager.py:325 | test call | assert manager.get_secret("api_key") is None |
ConfigManager.get_secret |
core tests | test/test_config_manager.py:337 | test call | assert manager.get_secret("api_key") is None |
ConfigManager.cleanup_orphaned_plugin_configs |
core tests | test/test_config_manager.py:447 | test call | removed = manager.cleanup_orphaned_plugin_configs(["plugin1", "plugin2"]) |
ConfigManager.cleanup_orphaned_plugin_configs |
core tests | test/test_core_config_key_adopters.py:80 | test review | removed = manager.cleanup_orphaned_plugin_configs(['installed']) |
ConfigManager.cleanup_orphaned_plugin_configs |
core tests | test/test_web_auth.py:616 | test call | config_manager.cleanup_orphaned_plugin_configs([]) |
ConfigManager.validate_all_plugin_configs |
core tests | test/test_core_config_key_adopters.py:91 | test review | results = manager.validate_all_plugin_configs(schema_manager) |
ConfigManager.validate_all_plugin_configs |
core tests | test/test_retired_plugin_config_keys.py:112 | test call | results = config_manager.validate_all_plugin_configs(schema_manager) |
FontManager.get_native_bdf_size |
core tests | test/test_font_manager.py:104 | test call | assert fm.get_native_bdf_size("five_by_seven") == 7 |
FontManager.get_native_bdf_size |
core tests | test/test_font_manager.py:107 | test call | assert fm.get_native_bdf_size("press_start") is None |
FontManager.get_native_bdf_size |
core tests | test/test_font_manager.py:110 | test call | assert fm.get_native_bdf_size("no-such-family") is None |
FontManager.measure_text |
core tests | test/test_font_manager.py:116 | test call | width, height, baseline = fm.measure_text("SCORE", font) |
FontManager.measure_text |
core tests | test/test_font_manager.py:119 | test call | assert fm.measure_text("SCORE", font) == (width, height, baseline) |
FontManager.measure_text |
core tests | test/test_font_manager.py:124 | test call | short, _, _ = fm.measure_text("AB", font) |
FontManager.measure_text |
core tests | test/test_font_manager.py:125 | test call | long, _, _ = fm.measure_text("ABCD", font) |
FontManager.measure_text |
core tests | test/test_font_manager.py:132 | test call | fm.measure_text("X", font) |
LogoDownloader.fetch_teams_data |
core | src/logo_downloader.py:639 | internal (in LogoDownloader.download_missing_logos_for_league) |
data = self.fetch_teams_data(league) |
LogoDownloader.fetch_teams_data |
core | src/logo_downloader.py:695 | internal (in LogoDownloader.download_all_ncaa_football_logos) |
data = self.fetch_teams_data(league) |
LogoDownloader.extract_teams_from_data |
core | src/logo_downloader.py:645 | internal (in LogoDownloader.download_missing_logos_for_league) |
teams = self.extract_teams_from_data(data, league) |
LogoDownloader.extract_teams_from_data |
core | src/logo_downloader.py:701 | internal (in LogoDownloader.download_all_ncaa_football_logos) |
teams = self.extract_teams_from_data(data, league) |
LogoDownloader.download_missing_logos_for_league |
core | src/logo_downloader.py:786 | internal (in LogoDownloader.download_all_missing_logos) |
downloaded, failed = self.download_missing_logos_for_league(league, force_download) |
LogoDownloader.download_missing_logos_for_league |
core | src/logo_downloader.py:1034 | call | return downloader.download_missing_logos_for_league(league, force_download) |
LogoDownloader.download_missing_logos_for_league |
core tests | test/test_logo_downloader.py:292 | test call | downloader.download_missing_logos_for_league("nfl") |
LogoDownloader.download_missing_logos_for_league |
core tests | test/test_logo_downloader.py:304 | test call | downloader.download_missing_logos_for_league("nfl") |
LogoDownloader.download_all_ncaa_football_logos |
core tests | test/test_logo_downloader.py:319 | test call | downloader.download_all_ncaa_football_logos() |
LogoDownloader.download_all_ncaa_football_logos |
core tests | test/test_logo_downloader.py:332 | test call | downloader.download_all_ncaa_football_logos() |
LogoDownloader.convert_image_to_rgba |
core | src/logo_downloader.py:897 | internal (in LogoDownloader.convert_all_logos_to_rgba) |
if self.convert_image_to_rgba(logo_file): |
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_vegas_segment_width |
core tests | test/test_vegas_participation.py:359 | test review | assert plugin.get_vegas_segment_width() == 2 |
PluginManager.get_all_plugins |
core | src/plugin_system/testing/mocks.py:218 | unrelated | def get_all_plugins(self) -> Dict[str, Any]: |
PluginManager.get_all_plugins |
football-scoreboard | emulator_demo.py:68 | review | mock_plugin_manager.get_all_plugins = Mock(return_value=[]) |
PluginManager.get_all_plugins |
football-scoreboard | test_dynamic_duration.py:64 | test review | mock_plugin_manager.get_all_plugins = Mock(return_value=[]) |
PluginManager.get_all_plugins |
football-scoreboard | test_football_plugin.py:74 | test review | mock_plugin_manager.get_all_plugins = Mock(return_value=[]) |
PluginManager.get_all_plugins |
hockey-scoreboard | test_hockey_emulator.py:99 | test review | mock_plugin_manager.get_all_plugins = Mock(return_value=[]) |
PluginManager.get_plugin_info |
core | src/plugin_system/plugin_catalog.py:120 | unrelated | def get_plugin_info(self, plugin_id: str) -> Optional[Dict[str, Any]]: |
PluginManager.get_plugin_info |
core | src/plugin_system/plugin_catalog.py:133 | unrelated | return [info for info in (self.get_plugin_info(pid) for pid in ids) if info] |
PluginManager.get_plugin_info |
core | src/plugin_system/plugin_manager.py:1001 | internal (in PluginManager.get_all_plugin_info) |
return [info for info in [self.get_plugin_info(pid) for pid in pids] if info] |
PluginManager.get_plugin_info |
core | src/plugin_system/store_install.py:208 | review | plugin_info = self.get_plugin_info(plugin_id, fetch_latest_from_github=True, force_refresh=True) |
PluginManager.get_plugin_info |
core | src/plugin_system/store_registry.py:801 | unrelated | def get_plugin_info(self, plugin_id: str, fetch_latest_from_github: bool = True, force_refresh: bool = False) -> Optional[Dict]: |
PluginManager.get_plugin_info |
core | src/plugin_system/store_update.py:357 | review | plugin_info_remote = self.get_plugin_info(plugin_id, fetch_latest_from_github=True, force_refresh=True) |
PluginManager.get_plugin_info |
core | src/plugin_system/store_update.py:362 | review | plugin_info_remote = self.get_plugin_info(alt_id, fetch_latest_from_github=True, force_refresh=True) |
PluginManager.get_plugin_info |
core | src/plugin_system/store_update.py:685 | review | plugin_info_remote = self.get_plugin_info(plugin_id, fetch_latest_from_github=True, force_refresh=True) |
PluginManager.get_plugin_info |
core | src/plugin_system/store_update.py:691 | review | plugin_info_remote = self.get_plugin_info(alt_id, fetch_latest_from_github=True, force_refresh=True) |
PluginManager.get_plugin_info |
core | src/plugin_system/testing/mocks.py:223 | unrelated | def get_plugin_info(self, plugin_id: str) -> Optional[Dict[str, Any]]: |
PluginManager.get_plugin_info |
core | web_interface/blueprints/api_v3/plugin_store.py:216 | review | remote_info = api_v3.plugin_store_manager.get_plugin_info(plugin_id, fetch_latest_from_github=True) |
PluginManager.get_plugin_info |
core | web_interface/blueprints/api_v3/plugin_store.py:334 | review | plugin_info = api_v3.plugin_store_manager.get_plugin_info(plugin_id) |
PluginManager.get_plugin_info |
core | web_interface/blueprints/api_v3/plugin_store.py:545 | review | elif not api_v3.plugin_store_manager.get_plugin_info(plugin_id): |
PluginManager.get_plugin_info |
core | web_interface/blueprints/api_v3/plugin_store.py:602 | review | elif not api_v3.plugin_store_manager.get_plugin_info(plugin_id): |
PluginManager.get_plugin_info |
core | web_interface/blueprints/pages_v3.py:224 | review | info = pages_v3.plugin_catalog.get_plugin_info(pid) or {} |
PluginManager.get_plugin_info |
core | web_interface/blueprints/pages_v3.py:722 | review | plugin_info = pages_v3.plugin_catalog.get_plugin_info(plugin_id) |
PluginManager.get_plugin_info |
core | web_interface/blueprints/pages_v3.py:727 | review | plugin_info = pages_v3.plugin_catalog.get_plugin_info(plugin_id) |
PluginManager.get_plugin_info |
core tests | test/test_api_v3_plugin_install_endpoints.py:111 | test review | manager.get_plugin_info.return_value = None |
PluginManager.get_plugin_info |
core tests | test/test_api_v3_plugin_install_endpoints.py:119 | test review | manager.get_plugin_info.return_value = {"id": "clock"} |
PluginManager.get_plugin_info |
core tests | test/test_pages_v3_path_guards.py:47 | test call | plugin_manager.get_plugin_info.return_value = {"name": "Weather", "version": "1.0.0"} |
PluginManager.get_plugin_info |
core tests | test/test_registry_id_resolution.py:81 | test review | _ids(store.get_plugin_info("ledmatrix-weather", fetch_latest_from_github=False)) |
PluginManager.get_plugin_info |
core tests | test/test_store_manager_caches.py:612 | test review | info = self.sm.get_plugin_info("foo", fetch_latest_from_github=True, force_refresh=True) |
PluginManager.get_plugin_info |
core tests | test/test_store_non_plugin_entries.py:37 | test review | store.get_plugin_info = MagicMock(return_value=dict(SKIN)) |
PluginManager.get_plugin_info |
core tests | test/test_web_plugin_dir_resolution.py:86 | test review | api.plugin_store_manager.get_plugin_info = MagicMock(return_value=None) |
PluginManager.get_plugin_info |
core tests | test/test_web_plugin_dir_resolution.py:118 | test review | api.plugin_store_manager.get_plugin_info = MagicMock(return_value=None) |
PluginManager.get_plugin_info |
core tests | test/test_web_plugin_dir_resolution.py:178 | test call | plugin_manager.get_plugin_info.return_value = {"id": "weather", "name": "Weather"} |
PluginManager.get_plugin_info |
core tests | test/web_interface/test_plugin_config_form_defaults.py:119 | test call | pm.get_plugin_info.return_value = {"name": "Demo", "version": "1.0.0"} |
PluginManager.get_plugin_info |
core tests | test/web_interface/test_plugin_config_schema_expansion.py:88 | test call | pm.get_plugin_info.return_value = {"id": plugin_id, "name": plugin_id} |
PluginManager.get_plugin_info |
core tests | test/web_interface/test_plugin_widget_route.py:226 | test call | pm.get_plugin_info.return_value = {"id": plugin_id, "name": plugin_id} |
PluginManager.get_plugin_info |
core tests | test/web_interface/test_plugin_widget_route.py:228 | test call | pm.get_plugin_info.return_value["version"] = version |
PluginManager.get_plugin_info |
core tests | test/web_interface/test_update_all_plugins.py:41 | test review | sm.get_plugin_info.return_value = None |
PluginManager.get_plugin_info |
core tests | test/web_interface/test_web_process_runs_no_plugin_code.py:132 | test review | store.get_plugin_info.return_value = None |
PluginManager.get_all_plugin_info |
core | src/plugin_system/plugin_catalog.py:129 | unrelated | def get_all_plugin_info(self) -> List[Dict[str, Any]]: |
PluginManager.get_all_plugin_info |
core | web_interface/blueprints/api_v3/plugins.py:68 | review | all_plugin_info = api_v3.plugin_catalog.get_all_plugin_info() |
PluginManager.get_all_plugin_info |
core | web_interface/blueprints/pages_v3.py:209 | review | pi.get('id') for pi in pages_v3.plugin_catalog.get_all_plugin_info() |
PluginManager.get_all_plugin_info |
core | web_interface/blueprints/pages_v3.py:559 | review | infos = sorted(pages_v3.plugin_catalog.get_all_plugin_info(), |
PluginManager.get_all_plugin_info |
core tests | test/test_api_v3_installed_display_modes.py:30 | test review | api.plugin_catalog.get_all_plugin_info = MagicMock(return_value=[info]) |
PluginManager.get_all_plugin_info |
core tests | test/test_api_v3_installed_plugin_icon.py:24 | test review | api.plugin_catalog.get_all_plugin_info = MagicMock(return_value=[info]) |
PluginManager.get_all_plugin_info |
core tests | test/test_installed_list_registry_offline.py:71 | test review | api.plugin_catalog.get_all_plugin_info = MagicMock(return_value=[ |
PluginManager.get_all_plugin_info |
core tests | test/test_onboarding_checklist.py:68 | test review | mock_pm.get_all_plugin_info.return_value = [] |
PluginManager.get_all_plugin_info |
core tests | test/test_plugin_manager_load_failures.py:78 | test call | infos = {i["id"]: i for i in pm.get_all_plugin_info()} |
PluginManager.get_all_plugin_info |
core tests | test/test_plugin_runtime_snapshot.py:422 | test review | api.plugin_catalog.get_all_plugin_info = MagicMock(return_value=[ |
PluginManager.get_all_plugin_info |
core tests | test/test_vegas_participation.py:447 | test review | api.plugin_catalog.get_all_plugin_info = MagicMock(return_value=[info]) |
PluginManager.get_all_plugin_info |
core tests | test/test_web_api.py:551 | test review | mock_plugin_catalog.get_all_plugin_info.return_value = [ |
PluginManager.get_all_plugin_info |
core tests | test/test_web_api.py:570 | test review | mock_plugin_catalog.get_all_plugin_info.return_value = [ |
PluginManager.get_all_plugin_info |
core tests | test/test_web_api.py:592 | test review | mock_plugin_catalog.get_all_plugin_info.return_value = [ |
PluginManager.get_all_plugin_info |
core tests | test/test_web_plugin_dir_resolution.py:61 | test review | api.plugin_catalog.get_all_plugin_info = MagicMock(return_value=[info]) |
PluginManager.get_all_plugin_info |
core tests | test/test_web_plugin_dir_resolution.py:195 | test call | plugin_manager.get_all_plugin_info.assert_not_called() |
PluginManager.get_all_plugin_info |
core tests | test/test_web_smoke.py:95 | test review | mock_pm.get_all_plugin_info.return_value = [ |
PluginManager.get_plugin_display_modes |
core | src/plugin_system/plugin_catalog.py:175 | unrelated | def get_plugin_display_modes(self, plugin_id: str) -> List[str]: |
PluginManager.get_plugin_display_modes |
core | web_interface/blueprints/api_v3/display.py:197 | review | plugin_modes = api_v3.plugin_catalog.get_plugin_display_modes(plugin_id) or [plugin_id] |
PluginManager.get_plugin_display_modes |
core | web_interface/blueprints/api_v3/display.py:267 | review | modes = api_v3.plugin_catalog.get_plugin_display_modes(resolved_plugin) |
PluginManager.get_plugin_display_modes |
core | web_interface/blueprints/api_v3/plugins.py:157 | review | declared_modes = api_v3.plugin_catalog.get_plugin_display_modes(plugin_id) |
PluginManager.get_plugin_display_modes |
core | web_interface/blueprints/pages_v3.py:565 | review | modes = pages_v3.plugin_catalog.get_plugin_display_modes(pid) or [pid] |
PluginManager.get_plugin_display_modes |
core tests | test/test_api_v3_display_modes.py:40 | test call | pm.get_plugin_display_modes = MagicMock( |
PluginManager.get_plugin_display_modes |
core tests | test/test_api_v3_display_modes.py:100 | test call | pm.get_plugin_display_modes = MagicMock(return_value=[]) |
PluginManager.get_plugin_display_modes |
core tests | test/test_api_v3_display_modes.py:122 | test call | pm.get_plugin_display_modes = MagicMock( |
PluginManager.get_plugin_display_modes |
core tests | test/test_api_v3_installed_display_modes.py:31 | test review | api.plugin_catalog.get_plugin_display_modes = MagicMock(return_value=declared_modes) |
PluginManager.get_plugin_display_modes |
core tests | test/test_api_v3_installed_display_modes.py:39 | test review | api.plugin_catalog.get_plugin_display_modes.assert_any_call('football-scoreboard') |
PluginManager.get_plugin_display_modes |
core tests | test/test_installed_list_registry_offline.py:75 | test review | api.plugin_catalog.get_plugin_display_modes = MagicMock(return_value=[]) |
PluginManager.get_plugin_display_modes |
core tests | test/test_onboarding_checklist.py:69 | test review | mock_pm.get_plugin_display_modes.side_effect = lambda pid: [] |
PluginManager.get_plugin_display_modes |
core tests | test/test_web_smoke.py:99 | test review | mock_pm.get_plugin_display_modes.side_effect = ( |
PluginManager.find_plugin_for_mode |
core | src/plugin_system/plugin_catalog.py:186 | unrelated | def find_plugin_for_mode(self, mode: str) -> Optional[str]: |
PluginManager.find_plugin_for_mode |
core | web_interface/blueprints/api_v3/display.py:271 | review | resolved_plugin = api_v3.plugin_catalog.find_plugin_for_mode(resolved_mode) |
PluginManager.find_plugin_for_mode |
core | web_interface/blueprints/api_v3/display.py:276 | review | resolved_plugin = api_v3.plugin_catalog.find_plugin_for_mode(resolved_mode) |
PluginStateManager.is_loaded |
core | src/plugin_system/plugin_state.py:299 | internal (in PluginStateManager.get_state_info) |
'is_loaded': self.is_loaded(plugin_id), |
PluginStateManager.is_running |
core | src/plugin_system/plugin_state.py:301 | internal (in PluginStateManager.get_state_info) |
'is_running': self.is_running(plugin_id), |
PluginStateManager.is_error |
core | src/plugin_system/plugin_state.py:302 | internal (in PluginStateManager.get_state_info) |
'is_error': self.is_error(plugin_id), |
PluginStateManager.get_error_info |
core | src/plugin_system/plugin_state.py:305 | internal (in PluginStateManager.get_state_info) |
'error_info': self.get_error_info(plugin_id), |
PluginStateManager.get_error_info |
core tests | test/test_async_plugin_updates.py:236 | test call | error = pm.state_manager.get_error_info(plugin_id) |
PluginStateManager.get_error_info |
core tests | test/test_plugin_hang_containment.py:191 | test call | error_info = pm.state_manager.get_error_info('hung') |
PluginStateManager.get_error_info |
core tests | test/test_sports_sunset_matrix.py:212 | test call | f"{manager.state_manager.get_error_info(plugin_id)}" |
PluginStateManager.get_error_info |
core tests | test/test_sports_sunset_matrix.py:285 | test call | info = manager.state_manager.get_error_info(plugin_id) |
PluginStateManager.get_last_update |
core | src/plugin_system/plugin_state.py:304 | internal (in PluginStateManager.get_state_info) |
'last_update': self.get_last_update(plugin_id), |
PluginStateManager.get_state_info |
core | src/plugin_system/plugin_manager.py:987 | internal (in PluginManager.get_plugin_info) |
info['state'] = self.state_manager.get_state_info(plugin_id) |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:39 | test review | info = manager.get_state_info("clock") |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:51 | test review | info = manager.get_state_info("clock") |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:62 | test review | assert manager.get_state_info("clock")["state_history_count"] == 101 |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:63 | test review | assert manager.get_state_info("weather")["state_history_count"] == 1 |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:74 | test review | info = manager.get_state_info("clock") |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:95 | test review | info = m.get_state_info("clock") |
PluginStateManager.get_state_info |
core tests | test/test_plugin_state_transition_count.py:130 | test review | info = manager.get_state_info("clock") |
Sources scanned
| Source | Group | Python files | Hits |
|---|---|---|---|
| core | core | 188 | 50 |
| core tests | core-tests | 416 | 176 |
| 7-segment-clock | monorepo | 3 | 0 |
| afl-scoreboard | monorepo | 36 | 0 |
| baseball-scoreboard | monorepo | 71 | 0 |
| basketball-scoreboard | monorepo | 51 | 2 |
| birdnet-go | monorepo | 3 | 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 | 1 |
| f1-scoreboard | monorepo | 15 | 0 |
| fantasy-blitz | monorepo | 13 | 0 |
| football-scoreboard | monorepo | 78 | 4 |
| geochron | monorepo | 10 | 0 |
| hello-world | monorepo | 2 | 0 |
| hockey-scoreboard | monorepo | 57 | 3 |
| incoming-packages | monorepo | 8 | 0 |
| jellyfin-now-playing | monorepo | 4 | 0 |
| lacrosse-scoreboard | monorepo | 41 | 0 |
| ledmatrix-elections | monorepo | 12 | 0 |
| ledmatrix-flights | monorepo | 48 | 0 |
| ledmatrix-leaderboard | monorepo | 10 | 0 |
| ledmatrix-music | monorepo | 12 | 0 |
| ledmatrix-stocks | monorepo | 7 | 0 |
| ledmatrix-weather | monorepo | 15 | 0 |
| march-madness | monorepo | 4 | 0 |
| masters-tournament | monorepo | 10 | 0 |
| mqtt-notifications | monorepo | 4 | 0 |
| news | monorepo | 7 | 0 |
| nfl-draft | monorepo | 3 | 0 |
| nfl-stat-leaders | monorepo | 8 | 0 |
| nrl-scoreboard | monorepo | 31 | 1 |
| odds-ticker | monorepo | 10 | 0 |
| of-the-day | monorepo | 14 | 0 |
| olympics | monorepo | 16 | 0 |
| on-air | monorepo | 3 | 0 |
| pomodoro-timer | monorepo | 3 | 0 |
| soccer-scoreboard | monorepo | 50 | 0 |
| static-image | monorepo | 4 | 0 |
| stock-news | monorepo | 4 | 0 |
| text-display | monorepo | 4 | 0 |
| tide-display | monorepo | 3 | 0 |
| ufc-scoreboard | monorepo | 40 | 3 |
| 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__).