mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-04 06:15:09 +00:00
* refactor: remove the skin system Skins never rendered with the current scoreboard plugins: the only hook was SportsCore._render_game in src/base_classes, which no plugin builds on, so the UI and store already treated them as unsupported. The owner decided on 2026-09-23 to remove them outright. Removed src/skin_system/ (runtime, base class, fixtures), skins/, scripts/validate_skin.py and their tests; the store's "type": "skin" installer, uninstaller and hide/refuse filters (the official registry lists no skins); SchemaManager.inject_skin_selector; and GET /api/v3/skins. Stored skin/skin_options config values are handled in the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(config): drop retired skin/skin_options keys instead of validating them A config.json written while the skin system existed can carry skin and skin_options in any plugin section, and most plugin schemas set additionalProperties: false. They are no longer core plugin properties; RETIRED_PLUGIN_KEYS in schema_manager lists them and drop_retired_plugin_keys removes them (unless the plugin's own schema declares the name) in prepare_plugin_config, which loading, hot reload, GET /plugins/config and both web saves already share, and in validate_config_against_schema for callers that validate a raw section. POST /plugins/config and /config/main also drop them from the stored section they merge into, so they leave config.json on the next save. Tests cover the load path (real PluginManager.load_plugin: no schema warning, not degraded), raw and prepared validation, validate_all_plugin_configs, and the JSON, form and /config/main saves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor: remove the unused src/base_classes package No scoreboard plugin builds on src.base_classes: the nine monorepo scoreboards ship their own sports.py and share code through src/common (docs/SPORTS_UNIFICATION.md), and none of the third-party registry plugins imports it. The one import anywhere, baseball-scoreboard's rankings_manager.py, is a lazy import of ESPNDataSource in a class nothing instantiates. Removed the package and the eight test files that only tested it (test_api_extractors, test_data_sources, test_sports_base_characterization, test_sports_capabilities, test_sports_core_promotions, test_sports_logo_cache_bounded, test_sports_modes_promotions, test_sports_odds_fanout). test_common_is_hardware_free no longer lists src.base_classes as a forbidden import, and comments in sports_helpers.py and base_odds_manager.py stop pointing at it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: drop the skin system and src/base_classes from the docs Deletes docs/SKIN_SYSTEM.md and docs/CREATING_SKINS.md and every link to them (docs/README.md, README.md, PLUGIN_DEVELOPMENT_GUIDE.md, the /skins section of REST_API_REFERENCE.md), the skin section of CLAUDE.md and the term in PRODUCT.md. SPORTS_UNIFICATION.md now says src/base_classes was removed and shared code lives in src/common, in the Layering section and the view-model-contract rule. Other docs stop pointing at the removed package. CHANGELOG records both removals under Unreleased. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(store): hide and refuse registry entries that aren't plugins The skin filters went with the skin system, but a custom registry can still list "type": "skin" entries, and installing one as a plugin would unpack it into the plugins directory. PluginStoreManager.is_plugin_entry() (a missing type means plugin) now hides non-plugin entries from the store and custom-registry listings, and install refuses them, in the route with a clear 400 and in _install_plugin_impl for any other caller. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
92 lines
2.7 KiB
Plaintext
92 lines
2.7 KiB
Plaintext
# Python
|
|
__pycache__/
|
|
*.py[cod]
|
|
*$py.class
|
|
|
|
# Secrets
|
|
config/config_secrets.json
|
|
# Atomic writes leave these behind when a save or a test is interrupted;
|
|
# the suite drops several per run.
|
|
config/.config_secrets.json.tmp.*
|
|
config/config.json
|
|
config/config.json.backup
|
|
config/wifi_config.json
|
|
config/uninstalled_plugins.json
|
|
credentials.json
|
|
token.pickle
|
|
|
|
# Environment
|
|
.env
|
|
.venv
|
|
env/
|
|
venv/
|
|
venv*/
|
|
ENV/
|
|
|
|
# IDE
|
|
.vscode/
|
|
.idea/
|
|
*.swp
|
|
*.swo
|
|
emulator_config.json
|
|
|
|
# Testing
|
|
.pytest_cache/
|
|
.coverage
|
|
htmlcov/
|
|
.mypy_cache/
|
|
|
|
# Cache directory (root level only, not src/cache which is source code)
|
|
/cache/
|
|
|
|
# Development plugins directory: symlinks into a ledmatrix-plugins checkout
|
|
# See docs/PLUGIN_DEVELOPMENT_GUIDE.md and docs/MULTI_ROOT_WORKSPACE_SETUP.md
|
|
plugins/*
|
|
!plugins/.gitkeep
|
|
# Local settings for scripts/dev/dev_plugin_setup.sh (template: dev_plugins.json.example)
|
|
/dev_plugins.json
|
|
|
|
# Binary files and backups
|
|
bin/pixlet/
|
|
config/backups/
|
|
|
|
# Starlark apps runtime storage (installed .star files and cached renders)
|
|
/starlark-apps/
|
|
|
|
# JS test deps (test/js)
|
|
node_modules/
|
|
package-lock.json
|
|
|
|
# Team logos fetched at runtime.
|
|
#
|
|
# src/logo_downloader.py and LogoHelper write into assets/sports/<league>_logos/
|
|
# whenever a plugin meets a team whose logo is not on disk. Those directories are
|
|
# also tracked -- 209 NCAA logos and 153 soccer ones ship with the repo -- so
|
|
# every rig accumulated untracked files it was never meant to commit and
|
|
# `git status` was permanently dirty. That noise is not harmless: it trains
|
|
# everyone to ignore the one signal that says a checkout is not what you think
|
|
# it is, which is how a stale tree sat unnoticed on a rig until a restart
|
|
# surfaced four dead sports plugins.
|
|
#
|
|
# Ignoring a directory does not untrack what is already in it, so the logos that
|
|
# ship keep shipping. Only new downloads are hidden.
|
|
#
|
|
# Adding a logo on purpose is rare and deliberate -- the last time was #415, four
|
|
# named NCAA logos a plugin needed, and there has been no other in a year. Do it
|
|
# with an explicit override:
|
|
# git add -f assets/sports/ncaa_logos/DUKE.png
|
|
assets/sports/*_logos/
|
|
assets/stocks/ticker_icons/
|
|
assets/stocks/crypto_icons/
|
|
|
|
# Plugin operation state written at runtime.
|
|
#
|
|
# web_interface/app.py writes data/plugin_operations.json, data/plugin_state.json
|
|
# and data/operation_history.json as the web interface runs, into a directory that
|
|
# ships tracked (data/.gitkeep) and was otherwise unignored. So every rig that ever
|
|
# opened the web UI -- and every test run that constructs the app -- left three
|
|
# untracked files behind and a permanently dirty `git status`. Same reasoning as
|
|
# the logo rule above: a checkout that is always dirty is a checkout nobody reads.
|
|
data/*
|
|
!data/.gitkeep
|