Skip to content

models

appimage_updater.config.models

Configuration models for AppImage updater.

ApplicationConfig

Configuration for a single application.

basename = Field(default=None, description='Base name for file matching (defaults to app name if not specified)') class-attribute instance-attribute

checksum = Field(default_factory=ChecksumConfig, description='Checksum verification settings') class-attribute instance-attribute

download_dir = Field(description='Download directory') class-attribute instance-attribute

enabled = Field(default=True, description='Whether to check for updates') class-attribute instance-attribute

name = Field(description='Application name') class-attribute instance-attribute

pattern = Field(description='File pattern to match') class-attribute instance-attribute

prerelease = Field(default=False, description='Include prerelease versions') class-attribute instance-attribute

retain_count = Field(default=3, ge=1, le=10, description='Number of old files to retain (1 = keep .old only, 2 = keep .old and .old2, etc.)') class-attribute instance-attribute

rotation_enabled = Field(default=False, description='Enable image rotation (.current/.old/.old2, etc.) and symlink management') class-attribute instance-attribute

source_type = Field(description='Source type') class-attribute instance-attribute

url = Field(description='Source URL') class-attribute instance-attribute

model_post_init(__context)

Post-initialization validation.

Source code in src/appimage_updater/config/models.py
def model_post_init(self, __context: dict[str, object]) -> None:
    """Post-initialization validation."""
    if self.rotation_enabled and self.symlink_path is None:
        msg = "symlink_path is required when rotation_enabled is True"
        raise ValueError(msg)

validate_download_dir(v) classmethod

Ensure download directory is absolute.

Source code in src/appimage_updater/config/models.py
@field_validator("download_dir")
@classmethod
def validate_download_dir(cls, v: Path) -> Path:
    """Ensure download directory is absolute."""
    return v.expanduser().resolve()

validate_pattern(v) classmethod

Validate regex pattern.

Source code in src/appimage_updater/config/models.py
@field_validator("pattern")
@classmethod
def validate_pattern(cls, v: str) -> str:
    """Validate regex pattern."""
    try:
        re.compile(v)
    except re.error as e:
        msg = f"Invalid regex pattern: {e}"
        raise ValueError(msg) from e
    return v

Validate symlink path (expand user but don't resolve symlinks).

Source code in src/appimage_updater/config/models.py
@field_validator("symlink_path")
@classmethod
def validate_symlink_path(cls, v: Path | None) -> Path | None:
    """Validate symlink path (expand user but don't resolve symlinks)."""
    if v is not None:
        return v.expanduser()
    return v

ChecksumConfig

Configuration for checksum verification.

algorithm = Field(default='sha256', description='Hash algorithm used in checksum file') class-attribute instance-attribute

enabled = Field(default=True, description='Whether to verify checksums') class-attribute instance-attribute

pattern = Field(default='{filename}-SHA256.txt', description='Pattern to find checksum files (use {filename} as placeholder)') class-attribute instance-attribute

required = Field(default=False, description='Whether checksum verification is required (fail if no checksum file)') class-attribute instance-attribute

Config

Main configuration container.

applications = Field(default_factory=list) class-attribute instance-attribute

global_config = Field(default_factory=GlobalConfig) class-attribute instance-attribute

apply_global_defaults_to_config(app_config, app_name)

Apply global defaults to an application configuration dictionary.

Source code in src/appimage_updater/config/models.py
def apply_global_defaults_to_config(self, app_config: dict[str, Any], app_name: str) -> dict[str, Any]:
    """Apply global defaults to an application configuration dictionary."""
    defaults = self.global_config.defaults

    # Apply download directory default if not specified
    if "download_dir" not in app_config or app_config["download_dir"] is None:
        app_config["download_dir"] = str(defaults.get_default_download_dir(app_name))

    # Apply rotation and symlink defaults
    self._apply_rotation_defaults(app_config, defaults, app_name)

    # Apply checksum defaults
    self._apply_checksum_defaults(app_config, defaults)

    # Apply prerelease default if not specified
    if "prerelease" not in app_config:
        app_config["prerelease"] = defaults.prerelease

    return app_config

get_effective_config_for_app(app_name)

Get the effective configuration for an app (global defaults + app-specific settings).

Source code in src/appimage_updater/config/models.py
def get_effective_config_for_app(self, app_name: str) -> dict[str, Any] | None:
    """Get the effective configuration for an app (global defaults + app-specific settings)."""
    # Find the app in the configuration
    app = self._find_application_by_name(app_name)
    if app is None:
        return None

    # Convert app to dict
    app_dict = self._create_base_app_dict(app)
    self._add_optional_app_fields(app_dict, app)
    return app_dict

get_enabled_apps()

Get list of enabled applications.

Source code in src/appimage_updater/config/models.py
def get_enabled_apps(self) -> list[ApplicationConfig]:
    """Get list of enabled applications."""
    return [app for app in self.applications if app.enabled]

DefaultsConfig

Default settings for new applications.

auto_subdir = Field(default=False, description='Automatically create {appname} subdirectory in download_dir') class-attribute instance-attribute

checksum_algorithm = Field(default='sha256', description='Default checksum algorithm') class-attribute instance-attribute

checksum_enabled = Field(default=True, description='Enable checksum verification by default') class-attribute instance-attribute

checksum_pattern = Field(default='{filename}-SHA256.txt', description='Default checksum file pattern') class-attribute instance-attribute

checksum_required = Field(default=False, description='Require checksum verification by default') class-attribute instance-attribute

download_dir = Field(default=None, description='Default download directory (None means no global default)') class-attribute instance-attribute

prerelease = Field(default=False, description='Include prerelease versions by default') class-attribute instance-attribute

retain_count = Field(default=3, ge=1, le=10, description='Default number of old files to retain') class-attribute instance-attribute

rotation_enabled = Field(default=False, description='Enable file rotation by default') class-attribute instance-attribute

get_default_download_dir(app_name)

Get effective download directory for an app.

Source code in src/appimage_updater/config/models.py
def get_default_download_dir(self, app_name: str) -> Path:
    """Get effective download directory for an app."""
    base_dir = self.download_dir if self.download_dir is not None else Path.cwd()

    # Add app subdirectory if auto_subdir is enabled
    return base_dir / app_name if self.auto_subdir else base_dir

Get effective symlink path for an app.

Source code in src/appimage_updater/config/models.py
def get_default_symlink_path(self, app_name: str) -> Path | None:
    """Get effective symlink path for an app."""
    if self.symlink_enabled and self.symlink_dir is not None:
        symlink_name = self.symlink_pattern.format(appname=app_name)
        return self.symlink_dir / symlink_name
    return None

validate_paths(v) classmethod

Validate and expand user paths.

Source code in src/appimage_updater/config/models.py
@field_validator("download_dir", "symlink_dir")
@classmethod
def validate_paths(cls, v: Path | None) -> Path | None:
    """Validate and expand user paths."""
    if v is not None:
        return v.expanduser()
    return v

GlobalConfig

Global configuration settings.

concurrent_downloads = Field(default=3, ge=1, le=10) class-attribute instance-attribute

defaults = Field(default_factory=DefaultsConfig, description='Default settings for new applications') class-attribute instance-attribute

timeout_seconds = Field(default=30, ge=5, le=300) class-attribute instance-attribute

user_agent = Field(default_factory=(lambda: _get_default_user_agent()), description='User agent for HTTP requests') class-attribute instance-attribute