Skip to content

repository_version_service

appimage_updater.core.repository_version_service

Service for getting latest versions from repositories using Repository Protocol.

This module provides centralized logic for interacting with any repository type through the Repository Protocol to get latest versions and assets.

RepositoryVersionService(version_parser=None)

Service for getting latest versions from repositories using Repository Protocol.

Source code in src/appimage_updater/core/repository_version_service.py
def __init__(self, version_parser: VersionParser | None = None):
    """Initialize with optional version parser for testing."""
    self.version_parser = version_parser or VersionParser()

version_parser = version_parser or VersionParser() instance-attribute

generate_pattern_from_repository(app_config) async

Generate a flexible pattern from repository assets.

Parameters:

Name Type Description Default
app_config ApplicationConfig

Application configuration containing repository URL

required

Returns:

Type Description
str | None

Generated pattern or None if generation failed

Source code in src/appimage_updater/core/repository_version_service.py
async def generate_pattern_from_repository(self, app_config: ApplicationConfig) -> str | None:
    """Generate a flexible pattern from repository assets.

    Args:
        app_config: Application configuration containing repository URL

    Returns:
        Generated pattern or None if generation failed
    """
    try:
        repository_client = await get_repository_client_async(app_config.url, timeout=30, enable_probing=True)

        async with repository_client:
            releases = await repository_client.get_releases(app_config.url, limit=20)
            if not releases:
                return None

            appimage_files = self._collect_appimage_files_from_releases(releases)
            if not appimage_files:
                return None

            # Generate pattern from the first AppImage file found
            return self.version_parser.generate_flexible_pattern_from_filename(appimage_files[0])

    except Exception as e:
        logger.debug(f"Failed to generate pattern from {app_config.url}: {e}")
        return None

get_latest_asset(app_config) async

Get latest matching asset from repository.

Parameters:

Name Type Description Default
app_config ApplicationConfig

Application configuration containing repository URL and pattern

required

Returns:

Type Description
Asset | None

Latest matching asset or None if not found

Source code in src/appimage_updater/core/repository_version_service.py
async def get_latest_asset(self, app_config: ApplicationConfig) -> Asset | None:
    """Get latest matching asset from repository.

    Args:
        app_config: Application configuration containing repository URL and pattern

    Returns:
        Latest matching asset or None if not found
    """
    try:
        repository_client = await get_repository_client_async(app_config.url, timeout=30, enable_probing=True)

        async with repository_client:
            releases = await repository_client.get_releases(app_config.url, limit=20)
            if not releases:
                return None

            # Filter releases based on prerelease preference
            filtered_releases = self._filter_releases_by_prerelease(releases, app_config.prerelease)
            if not filtered_releases:
                return None

            return self._find_first_matching_asset(filtered_releases, app_config.pattern)

    except Exception as e:
        logger.debug(f"Failed to get latest asset from {app_config.url}: {e}")
        return None

get_latest_version(app_config) async

Get latest version from repository.

Parameters:

Name Type Description Default
app_config ApplicationConfig

Application configuration containing repository URL

required

Returns:

Type Description
str | None

Latest version string or None if not available

Source code in src/appimage_updater/core/repository_version_service.py
async def get_latest_version(self, app_config: ApplicationConfig) -> str | None:
    """Get latest version from repository.

    Args:
        app_config: Application configuration containing repository URL

    Returns:
        Latest version string or None if not available
    """
    try:
        repository_client = await get_repository_client_async(app_config.url, timeout=30, enable_probing=True)

        async with repository_client:
            releases = await repository_client.get_releases(app_config.url, limit=20)
            if not releases:
                logger.debug(f"No releases found for {app_config.url}")
                return None

            # Filter releases based on prerelease preference
            filtered_releases = self._filter_releases_by_prerelease(releases, app_config.prerelease)
            if not filtered_releases:
                logger.debug(f"No compatible releases found for {app_config.url}")
                return None

            # Return the latest version
            latest_release = filtered_releases[0]  # Releases are sorted by date descending
            version_str: str = latest_release.version
            return version_str

    except Exception as e:
        logger.debug(f"Failed to get latest version from {app_config.url}: {e}")
        return None