mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-13 02:26:37 +00:00
fix(config): use the shared core-key list in the last three private copies
StartupValidator warned "Plugin 'auto_update' is enabled but not found" on every display start with auto-update or a dim schedule on; the reserved plugin-id check missed auto_update, sync, location and the rest; and ConfigManager's (uncalled) orphan cleanup would have deleted display, schedule and auto_update. All three now read src/core_config_keys.py, which also gains CORE_SECRETS_KEYS for the github/youtube secrets sections. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,7 @@ import os
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Dict, Any, Optional, List
|
||||
from src.core_config_keys import CORE_CONFIG_KEYS, CORE_SECRETS_KEYS
|
||||
from src.exceptions import ConfigError
|
||||
from src.logging_config import get_logger
|
||||
from src.config_manager_atomic import (
|
||||
@@ -756,12 +757,13 @@ class ConfigManager:
|
||||
|
||||
valid_set = set(valid_plugin_ids)
|
||||
|
||||
# Find orphaned plugins in main config
|
||||
main_plugins = set(main_config.keys())
|
||||
# Find orphaned plugins in main config. Core sections (display,
|
||||
# schedule, auto_update, ...) are not plugins and never orphans.
|
||||
main_plugins = set(main_config.keys()) - CORE_CONFIG_KEYS
|
||||
orphaned_main = main_plugins - valid_set
|
||||
|
||||
# Find orphaned plugins in secrets config
|
||||
secrets_plugins = set(secrets_config.keys())
|
||||
secrets_plugins = set(secrets_config.keys()) - CORE_CONFIG_KEYS - CORE_SECRETS_KEYS
|
||||
orphaned_secrets = secrets_plugins - valid_set
|
||||
|
||||
all_orphaned = orphaned_main | orphaned_secrets
|
||||
@@ -815,8 +817,8 @@ class ConfigManager:
|
||||
if not isinstance(plugin_config, dict):
|
||||
continue
|
||||
|
||||
# Skip non-plugin config sections
|
||||
if plugin_id in ['display', 'schedule', 'timezone', 'plugin_system']:
|
||||
# Skip core config sections
|
||||
if plugin_id in CORE_CONFIG_KEYS:
|
||||
continue
|
||||
|
||||
schema = plugin_schema_manager.load_schema(plugin_id, use_cache=True)
|
||||
|
||||
@@ -41,3 +41,13 @@ CORE_CONFIG_KEYS = frozenset({
|
||||
'vegas_excluded_plugins',
|
||||
'vegas_scroll_enabled',
|
||||
})
|
||||
|
||||
#: Top-level keys of ``config_secrets.json`` that belong to the core rather than
|
||||
#: to a plugin: the GitHub token the Plugin Store reads, and the historical
|
||||
#: ``youtube`` section. Plugin secrets are namespaced by plugin id, so anything
|
||||
#: deciding whether a secrets section is a plugin's needs this as well as
|
||||
#: ``CORE_CONFIG_KEYS``.
|
||||
CORE_SECRETS_KEYS = frozenset({
|
||||
'github',
|
||||
'youtube',
|
||||
})
|
||||
|
||||
@@ -13,6 +13,8 @@ from typing import Any, Dict, List, Optional, Tuple
|
||||
import jsonschema
|
||||
from jsonschema import Draft7Validator, ValidationError
|
||||
|
||||
from src.core_config_keys import CORE_CONFIG_KEYS
|
||||
|
||||
|
||||
def _renders_as_object(prop: Dict[str, Any]) -> bool:
|
||||
"""``field_type == 'object'`` as ``plugin_config.html`` computes it.
|
||||
@@ -698,10 +700,11 @@ class SchemaManager:
|
||||
"""
|
||||
collisions = []
|
||||
|
||||
# Reserved top-level config keys that plugins should not use as IDs
|
||||
reserved_keys = {
|
||||
'display', 'schedule', 'timezone', 'plugin_system',
|
||||
'display_modes', 'system', 'hardware', 'debug',
|
||||
# Reserved top-level config keys that plugins should not use as IDs:
|
||||
# every core section (src/core_config_keys.py), plus a few names that
|
||||
# read as core even though no current section uses them.
|
||||
reserved_keys = set(CORE_CONFIG_KEYS) | {
|
||||
'display_modes', 'hardware', 'debug',
|
||||
'log_level', 'emulator', 'web_interface'
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ Fails fast with clear error messages to prevent runtime issues.
|
||||
import os
|
||||
from typing import Any, List, Optional, Tuple
|
||||
from pathlib import Path
|
||||
from src.core_config_keys import CORE_CONFIG_KEYS
|
||||
from src.exceptions import ConfigError, PluginError, CacheError
|
||||
from src.logging_config import get_logger
|
||||
|
||||
@@ -275,8 +276,9 @@ class StartupValidator:
|
||||
|
||||
# Check for enabled plugins that don't exist
|
||||
for plugin_id, plugin_config in config.items():
|
||||
# Skip non-plugin config sections
|
||||
if plugin_id in ['display', 'schedule', 'timezone', 'plugin_system']:
|
||||
# Skip core sections: auto_update and dim_schedule have an
|
||||
# 'enabled' key too, and are not plugins that went missing.
|
||||
if plugin_id in CORE_CONFIG_KEYS:
|
||||
continue
|
||||
|
||||
if not isinstance(plugin_config, dict):
|
||||
|
||||
Reference in New Issue
Block a user