Source code for duck.cli.commands.sync.registry

"""
Maps generic dependency names (e.g. "gdal") to the package name each
system package manager actually expects. Keeps duck.toml portable across
machines since project authors only write the generic name.
"""

from __future__ import annotations


# Built-in mappings for common native dependencies. Extend via the
# [overrides] section in duck.toml rather than editing this file directly.
SYSTEM_PACKAGE_REGISTRY: dict[str, dict[str, str]] = {
    "build-essential": {
        "apt": "build-essential",
        "brew": "gcc",
        "dnf": "gcc gcc-c++ make",
        "pacman": "base-devel",
        "choco": "visualstudio2022buildtools",
        "termux": "build-essential",
    },
    "python-dev": {
        "apt": "python3-dev",
        "brew": "python3",
        "dnf": "python3-devel",
        "pacman": "python",
        "choco": "python3",
        "termux": "python",
    },
    "openssl": {
        "apt": "libssl-dev",
        "brew": "openssl",
        "dnf": "openssl-devel",
        "pacman": "openssl",
        "choco": "openssl",
        "termux": "openssl",
    },
    "zlib": {
        "apt": "zlib1g-dev",
        "brew": "zlib",
        "dnf": "zlib-devel",
        "pacman": "zlib",
        "choco": "zlib",
        "termux": "zlib",
    },
    "bzip2": {
        "apt": "libbz2-dev",
        "brew": "bzip2",
        "dnf": "bzip2-devel",
        "pacman": "bzip2",
        "choco": "bzip2",
        "termux": "bzip2",
    },
    "libxml2": {
        "apt": "libxml2-dev",
        "brew": "libxml2",
        "dnf": "libxml2-devel",
        "pacman": "libxml2",
        "choco": "libxml2",
        "termux": "libxml2",
    },
    "libxslt": {
        "apt": "libxslt-dev",
        "brew": "libxslt",
        "dnf": "libxslt-devel",
        "pacman": "libxslt",
        "choco": "libxslt",
        "termux": "libxslt",
    },
    "postgresql-client": {
        "apt": "libpq-dev",
        "brew": "libpq",
        "dnf": "libpq-devel",
        "pacman": "postgresql-libs",
        "choco": "postgresql",
        "termux": "postgresql",
    },
    "redis": {
        "apt": "redis-server",
        "brew": "redis",
        "dnf": "redis",
        "pacman": "redis",
        "choco": "redis-64",
        "termux": "redis",
    },
    "gdal": {
        "apt": "gdal-bin libgdal-dev",
        "brew": "gdal",
        "dnf": "gdal gdal-devel",
        "pacman": "gdal",
        "choco": "gdal",
        "termux": "gdal",
    },
    "geos": {
        "apt": "libgeos-dev",
        "brew": "geos",
        "dnf": "geos geos-devel",
        "pacman": "geos",
        "choco": "geos",
        "termux": "libgeos",
    },
    "spatialite": {
        "apt": "libsqlite3-mod-spatialite",
        "brew": "libspatialite",
        "dnf": "libspatialite",
        "pacman": "libspatialite",
        "choco": "spatialite",
        "termux": "libspatialite",
    },
    "jpeg": {
        "apt": "libjpeg-dev",
        "brew": "jpeg",
        "dnf": "libjpeg-turbo-devel",
        "pacman": "libjpeg-turbo",
        "choco": "libjpeg-turbo",
        "termux": "libjpeg-turbo",
    },
    "libpng": {
        "apt": "libpng-dev",
        "brew": "libpng",
        "dnf": "libpng-devel",
        "pacman": "libpng",
        "choco": "libpng",
        "termux": "libpng",
    },
    "libwebp": {
        "apt": "libwebp-dev",
        "brew": "webp",
        "dnf": "libwebp-devel",
        "pacman": "libwebp",
        "choco": "webp",
        "termux": "libwebp",
    },
    "libtiff": {
        "apt": "libtiff-dev",
        "brew": "libtiff",
        "dnf": "libtiff-devel",
        "pacman": "libtiff",
        "choco": "libtiff",
        "termux": "libtiff",
    },
    "freetype": {
        "apt": "libfreetype-dev",
        "brew": "freetype",
        "dnf": "freetype-devel",
        "pacman": "freetype2",
        "choco": "freetype",
        "termux": "freetype",
    },
    "ffmpeg": {
        "apt": "ffmpeg",
        "brew": "ffmpeg",
        "dnf": "ffmpeg-free",
        "pacman": "ffmpeg",
        "choco": "ffmpeg",
        "termux": "ffmpeg",
    },
    "postfix": {
        "apt": "postfix",
        "brew": "postfix",
        "dnf": "postfix",
        "pacman": "postfix",
        "choco": "postfix",
        "termux": "postfix",
    },
}


[docs] def resolve_package_name( generic_name: str, backend: str, overrides: dict[str, dict[str, str]] ) -> str: """ Finds the correct package name for a given backend. Args: generic_name: The name written in duck.toml, e.g. "gdal". backend: The active backend identifier, e.g. "apt". overrides: Project-supplied overrides from duck.toml's [overrides] section, checked before the built-in registry. Returns: The backend-specific package name. Falls back to generic_name unchanged when no mapping is known, since many packages share the same name across managers (e.g. "ffmpeg"). """ project_override = overrides.get(generic_name, {}).get(backend) if project_override: return project_override # Try resolving builtin package backend name built_in = SYSTEM_PACKAGE_REGISTRY.get(generic_name, {}).get(backend) if built_in: return built_in # Returns generic name return generic_name