Skip to content

models

appimage_updater.core.models

Data models for releases and updates.

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

Asset

Represents a downloadable asset.

architecture property

Extract architecture from filename.

checksum_asset = Field(default=None, description='Associated checksum file asset') class-attribute instance-attribute

created_at = Field(description='Asset creation time') class-attribute instance-attribute

download_url property

Get download URL (alias for url).

file_extension property

Extract file extension from filename.

name = Field(description='Asset filename') class-attribute instance-attribute

platform property

Extract platform from filename.

size = Field(description='File size in bytes') class-attribute instance-attribute

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

CheckResult

Result of checking for updates.

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

asset = Field(default=None, description='Associated asset') class-attribute instance-attribute

available_version = Field(default=None, description='Available version') class-attribute instance-attribute

candidate = Field(default=None, description='Update candidate') class-attribute instance-attribute

checked_at = Field(default_factory=(datetime.now), description='Check time') class-attribute instance-attribute

current_version = Field(default=None, description='Current version') class-attribute instance-attribute

download_url = Field(default=None, description='Download URL') class-attribute instance-attribute

error_message = Field(default=None, description='Error message if failed') class-attribute instance-attribute

message = Field(default=None, description='Status message') class-attribute instance-attribute

success = Field(description='Whether check was successful') class-attribute instance-attribute

update_available = Field(default=False, description='Whether update is available') class-attribute instance-attribute

ChecksumResult

Result of checksum verification.

actual = Field(default=None, description='Actual checksum') class-attribute instance-attribute

algorithm = Field(default=None, description='Hash algorithm used') class-attribute instance-attribute

error_message = Field(default=None, description='Error if verification failed') class-attribute instance-attribute

expected = Field(default=None, description='Expected checksum') class-attribute instance-attribute

verified = Field(description='Whether checksum was verified') class-attribute instance-attribute

DownloadResult

Result of downloading an update.

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

checksum_result = Field(default=None, description='Checksum verification result') class-attribute instance-attribute

download_size = Field(default=0, description='Downloaded bytes') class-attribute instance-attribute

duration_seconds = Field(default=0.0, description='Download duration') class-attribute instance-attribute

error_message = Field(default=None, description='Error message if failed') class-attribute instance-attribute

file_path = Field(default=None, description='Downloaded file path') class-attribute instance-attribute

success = Field(description='Whether download was successful') class-attribute instance-attribute

InteractiveResult

Result from interactive operations.

cancelled = Field(default=False, description='Whether the operation was cancelled by user') class-attribute instance-attribute

data = Field(default=None, description='Operation result data') class-attribute instance-attribute

reason = Field(default=None, description='Reason for cancellation or failure') class-attribute instance-attribute

success = Field(description='Whether the operation completed successfully') class-attribute instance-attribute

cancelled_result(reason) classmethod

Create a cancelled result.

Source code in src/appimage_updater/core/models.py
@classmethod
def cancelled_result(cls, reason: str) -> InteractiveResult:
    """Create a cancelled result."""
    return cls(success=False, cancelled=True, reason=reason)

success_result(data=None) classmethod

Create a successful result.

Source code in src/appimage_updater/core/models.py
@classmethod
def success_result(cls, data: dict[str, Any] | None = None) -> InteractiveResult:
    """Create a successful result."""
    return cls(success=True, data=data)

Release

Represents a software release.

assets = Field(description='Available assets') class-attribute instance-attribute

is_draft = Field(default=False, description='Is draft') class-attribute instance-attribute

is_prerelease = Field(default=False, description='Is prerelease') class-attribute instance-attribute

name = Field(default=None, description='Release name') class-attribute instance-attribute

published_at = Field(description='Release publication time') class-attribute instance-attribute

tag_name = Field(description='Git tag name') class-attribute instance-attribute

version = Field(description='Release version') class-attribute instance-attribute

get_matching_assets(pattern, filter_compatible=False)

Get assets matching the given pattern.

Parameters:

Name Type Description Default
pattern str

Regex pattern to match asset names

required
filter_compatible bool

If True, filter out incompatible architectures/platforms

False

Returns:

Type Description
list[Asset]

List of matching assets, optionally filtered for compatibility

Source code in src/appimage_updater/core/models.py
def get_matching_assets(self, pattern: str, filter_compatible: bool = False) -> list[Asset]:
    """Get assets matching the given pattern.

    Args:
        pattern: Regex pattern to match asset names
        filter_compatible: If True, filter out incompatible architectures/platforms

    Returns:
        List of matching assets, optionally filtered for compatibility
    """
    regex = re.compile(pattern)
    matching_assets = [asset for asset in self.assets if regex.search(asset.name)]

    if filter_compatible:
        return self._filter_compatible_assets(matching_assets)

    return matching_assets

UpdateCandidate

Represents an available update.

app_config = Field(default=None, description='Application configuration for rotation settings') class-attribute instance-attribute

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

asset = Field(description='Asset to download') class-attribute instance-attribute

checksum_required = Field(default=False, description='Whether checksum verification is required') class-attribute instance-attribute

current_version = Field(description='Currently installed version') class-attribute instance-attribute

download_path = Field(description='Local download path') class-attribute instance-attribute

is_newer = Field(description='Whether this is actually newer') class-attribute instance-attribute

latest_version = Field(description='Latest available version') class-attribute instance-attribute

needs_update property

Check if update is needed.

release = Field(default=None, description='Associated release') class-attribute instance-attribute

version property

Get version string (alias for latest_version).

rebuild_models()

Rebuild models after all imports are resolved.

Source code in src/appimage_updater/core/models.py
def rebuild_models() -> None:
    """Rebuild models after all imports are resolved."""
    if not TYPE_CHECKING and ApplicationConfig is not None:
        UpdateCandidate.model_rebuild()
        CheckResult.model_rebuild()