diff --git a/moonraker/components/update_manager/app_deploy.py b/moonraker/components/update_manager/app_deploy.py index 77896f2..ef3abce 100644 --- a/moonraker/components/update_manager/app_deploy.py +++ b/moonraker/components/update_manager/app_deploy.py @@ -35,19 +35,6 @@ if TYPE_CHECKING: from ..machine import Machine from ..file_manager.file_manager import FileManager -SUPPORTED_CHANNELS = { - AppType.WEB: [Channel.STABLE, Channel.BETA], - AppType.ZIP: [Channel.STABLE, Channel.BETA], - AppType.GIT_REPO: list(Channel), - AppType.PYTHON: list(Channel) -} -TYPE_TO_CHANNEL = { - AppType.WEB: Channel.STABLE, - AppType.ZIP: Channel.STABLE, - AppType.GIT_REPO: Channel.DEV, - AppType.PYTHON: Channel.STABLE -} - DISTRO_ALIASES = [distro.id()] DISTRO_ALIASES.extend(distro.like().split()) @@ -57,23 +44,18 @@ class AppDeploy(BaseDeploy): ) -> None: super().__init__(config, cmd_helper, prefix=prefix) self.config = config - type_choices = list(TYPE_TO_CHANNEL.keys()) - self.type = AppType.from_string(config.get('type')) - if self.type not in type_choices: - str_types = [str(t) for t in type_choices] - raise config.error( - f"Section [{config.get_name()}], Option 'type: {self.type}': " - f"value must be one of the following choices: {str_types}" - ) - self.channel = Channel.from_string( - config.get("channel", str(TYPE_TO_CHANNEL[self.type])) + type_choices = {str(t): t for t in AppType.valid_types()} + self.type = config.getchoice("type", type_choices) + channel_choices = {str(chnl): chnl for chnl in list(Channel)} + self.channel = config.getchoice( + "channel", channel_choices, str(self.type.default_channel) ) self.channel_invalid: bool = False - if self.channel not in SUPPORTED_CHANNELS[self.type]: - str_channels = [str(c) for c in SUPPORTED_CHANNELS[self.type]] + if self.channel not in self.type.supported_channels: + str_channels = [str(c) for c in self.type.supported_channels] self.channel_invalid = True invalid_channel = self.channel - self.channel = TYPE_TO_CHANNEL[self.type] + self.channel = self.type.default_channel self.server.add_warning( f"[{config.get_name()}]: Invalid value '{invalid_channel}' for " f"option 'channel'. Type '{self.type}' supports the following " diff --git a/moonraker/components/update_manager/common.py b/moonraker/components/update_manager/common.py index 7221af6..21fcef1 100644 --- a/moonraker/components/update_manager/common.py +++ b/moonraker/components/update_manager/common.py @@ -14,7 +14,8 @@ from ...utils import source_info from typing import ( TYPE_CHECKING, Dict, - Union + Union, + List ) if TYPE_CHECKING: @@ -47,6 +48,8 @@ BASE_CONFIG: Dict[str, Dict[str, str]] = { } } +OPTION_OVERRIDES = ("channel", "pinned_commit", "refresh_interval") + class AppType(ExtendedEnum): NONE = 1 WEB = 2 @@ -66,6 +69,26 @@ class AppType(ExtendedEnum): else: return AppType.NONE + @classmethod + def valid_types(cls) -> List[AppType]: + all_types = list(cls) + all_types.remove(AppType.NONE) + return all_types + + @property + def supported_channels(self) -> List[Channel]: + if self == AppType.NONE: + return [] + elif self in [AppType.WEB, AppType.ZIP]: + return [Channel.STABLE, Channel.BETA] # type: ignore + else: + return list(Channel) + + @property + def default_channel(self) -> Channel: + if self == AppType.GIT_REPO: + return Channel.DEV # type: ignore + return Channel.STABLE # type: ignore class Channel(ExtendedEnum): STABLE = 1 @@ -84,19 +107,16 @@ def get_base_configuration(config: ConfigHelper) -> ConfigHelper: "moonraker", "update_manager.klipper_exec", KLIPPER_DEFAULT_EXEC ).result() base_cfg["klipper"]["type"] = str(AppType.detect(base_cfg["klipper"]["path"])) - channel = config.get("channel", "dev") - base_cfg["moonraker"]["channel"] = channel - base_cfg["klipper"]["channel"] = channel - if config.has_section("update_manager moonraker"): - mcfg = config["update_manager moonraker"] - base_cfg["moonraker"]["channel"] = mcfg.get("channel", channel) - commit = mcfg.get("pinned_commit", None) - if commit is not None: - base_cfg["moonraker"]["pinned_commit"] = commit - if config.has_section("update_manager klipper"): - kcfg = config["update_manager klipper"] - base_cfg["klipper"]["channel"] = kcfg.get("channel", channel) - commit = kcfg.get("pinned_commit", None) - if commit is not None: - base_cfg["klipper"]["pinned_commit"] = commit + default_channel = config.get("channel", None) + # Check for configuration overrides + for app_name in base_cfg.keys(): + if default_channel is not None: + base_cfg[app_name]["channel"] = default_channel + override_section = f"update_manager {app_name}" + if not config.has_section(override_section): + continue + app_cfg = config[override_section] + for opt in OPTION_OVERRIDES: + if app_cfg.has_option(opt): + base_cfg[app_name][opt] = app_cfg.get(opt) return config.read_supplemental_dict(base_cfg)