mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-13 18:46:37 +00:00
New hardware-free module src/common/sports_live_fetch.py, copied from
ledmatrix-plugins claude/family9-reconcile once the nine scoreboards made
_fetch_todays_games (seven bodies when measured) and _fetch_odds (three) one
body each. Both live on the plugins' SportsCore, so one mixin,
SportsLiveFetchMixin, carries exactly those two plus the odds worker
_drain_odds_queue; no manager gains a method it lacks today.
Owner decisions (2026-10-12):
- Live scores are always fresh: every poll asks ESPN through
get_espn_scoreboard and leaves the answer under the shared
espn_scoreboard_cache_key for its dates (max_age=1: only a copy another
reader fetched within the last second is reused). The plugins' 30 s
<sport_key>_scoreboard_current cache is gone.
- College basketball is asked by date like every other league (ESPN
answered single dates for both college leagues on 2026-10-12).
- Odds never block update(): one daemon worker per manager answers a queue
and attaches each line in place under _games_lock; one batch in flight per
manager, games queued meanwhile join it, every dict queued for an id gets
the one answer. show_odds, the two odds intervals and a missing odds
manager (debug, not ERROR) are respected.
- An answer whose events is not a list is no games.
Fix: get_espn_scoreboard() no longer caches an answer whose events is not a
list ("events": null), which every reader of the shared key inherited; it is
still returned to the caller.
- test/test_sports_live_fetch.py: the plugins' pinned cases (requests,
dates and keys at 10:00 and 02:00 Eastern, freshness, malformed and failed
answers, odds that never block and land later, the intervals, one batch per
manager, a worker that cannot start, update and display on two threads),
plus the host contract. Mutation-checked (11 mutants, all caught).
- test/test_sports_live_fetch_parity.py: with LEDMATRIX_PLUGINS, compares
each body with every plugin copy. Passes against claude/family9-reconcile;
fails against the pre-reconcile tree.
- test/test_espn_scoreboard_cache.py: the null-events regression.
- mypy ratchet, src/common/README.md, CHANGELOG (Unreleased: New modules,
Fixes), docs/SPORTS_UNIFICATION.md family 9 status and decisions.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
111 lines
3.4 KiB
Plaintext
111 lines
3.4 KiB
Plaintext
# The mypy ratchet: modules that type-check clean, one path per line, sorted.
|
|
#
|
|
# CI ("Type check (mypy ratchet)") runs `python scripts/check_types.py`, which
|
|
# runs mypy on exactly these files (imports followed silently, so errors in an
|
|
# unlisted module they import don't count) and fails on any error, so a listed
|
|
# module stays clean. Most of src/ isn't clean yet. When you make a module
|
|
# clean, add it here. Don't take a module off to get CI green -- fix the error
|
|
# (annotation-only where you can: hints, typing.cast, TYPE_CHECKING imports;
|
|
# widen an annotation rather than delete a defensive runtime check).
|
|
|
|
src/__init__.py
|
|
src/adaptive_images.py
|
|
src/auto_update_setup.py
|
|
src/backup_manager.py
|
|
src/base_odds_manager.py
|
|
src/cache/__init__.py
|
|
src/cache/cache_strategy.py
|
|
src/cache/memory_cache.py
|
|
src/common/__init__.py
|
|
src/common/api_helper.py
|
|
src/common/bdf_font.py
|
|
src/common/espn_dates.py
|
|
src/common/favorite_team_check.py
|
|
src/common/fetch_service.py
|
|
src/common/font_layout.py
|
|
src/common/frame_timing.py
|
|
src/common/json_body.py
|
|
src/common/logo_helper.py
|
|
src/common/path_safety.py
|
|
src/common/permission_utils.py
|
|
src/common/render_gate.py
|
|
src/common/scroll_config.py
|
|
src/common/snapshot_policy.py
|
|
src/common/sports_card.py
|
|
src/common/sports_card_wrappers.py
|
|
src/common/sports_celebration.py
|
|
src/common/sports_display_rules.py
|
|
src/common/sports_favorites.py
|
|
src/common/sports_fetch.py
|
|
src/common/sports_font_path.py
|
|
src/common/sports_game_over.py
|
|
src/common/sports_live_fetch.py
|
|
src/common/sports_live_scroll.py
|
|
src/common/sports_plugin_host.py
|
|
src/common/sports_rankings.py
|
|
src/common/sports_rotation.py
|
|
src/common/sports_scroll.py
|
|
src/common/sports_timezone.py
|
|
src/common/sports_vegas.py
|
|
src/config_service.py
|
|
src/core_config_keys.py
|
|
src/deprecation.py
|
|
src/device_location.py
|
|
src/display_arbiter.py
|
|
src/display_geometry.py
|
|
src/dynamic_team_resolver.py
|
|
src/exceptions.py
|
|
src/font_usage.py
|
|
src/ipc/__init__.py
|
|
src/ipc/client.py
|
|
src/ipc/contract.py
|
|
src/ipc/server.py
|
|
src/logging_config.py
|
|
src/logo_downloader.py
|
|
src/malloc_tuning.py
|
|
src/matrix_support.py
|
|
src/pi5_matrix_support.py
|
|
src/plugin_system/__init__.py
|
|
src/plugin_system/compatibility.py
|
|
src/plugin_system/field_model.py
|
|
src/plugin_system/operation_history.py
|
|
src/plugin_system/operation_queue.py
|
|
src/plugin_system/operation_types.py
|
|
src/plugin_system/plugin_catalog.py
|
|
src/plugin_system/plugin_dirs.py
|
|
src/plugin_system/plugin_executor.py
|
|
src/plugin_system/plugin_health.py
|
|
src/plugin_system/plugin_loader.py
|
|
src/plugin_system/plugin_runtime.py
|
|
src/plugin_system/plugin_state.py
|
|
src/plugin_system/repo_urls.py
|
|
src/plugin_system/resource_monitor.py
|
|
src/plugin_system/saved_repositories.py
|
|
src/plugin_system/schema_manager.py
|
|
src/plugin_system/state_reconciliation.py
|
|
src/plugin_system/testing/__init__.py
|
|
src/plugin_system/testing/bounds_display_manager.py
|
|
src/plugin_system/testing/loading.py
|
|
src/plugin_system/testing/mocks.py
|
|
src/plugin_system/testing/plugin_test_base.py
|
|
src/plugin_system/testing/sizes.py
|
|
src/plugin_system/testing/vegas.py
|
|
src/plugin_system/vegas_elements.py
|
|
src/redaction.py
|
|
src/scan_order.py
|
|
src/screen_runner.py
|
|
src/startup_validator.py
|
|
src/vegas_mode/__init__.py
|
|
src/vegas_mode/config.py
|
|
src/vegas_mode/coordinator.py
|
|
src/vegas_mode/elements.py
|
|
src/vegas_mode/geometry.py
|
|
src/vegas_mode/live_worker.py
|
|
src/vegas_mode/stream_manager.py
|
|
src/web_interface/api_helpers.py
|
|
src/web_interface/config_arrays.py
|
|
src/web_interface/error_handler.py
|
|
src/web_interface/errors.py
|
|
src/web_interface/secret_helpers.py
|
|
src/web_interface/validators.py
|