Source code for contree_sdk.utils.oci

from __future__ import annotations

from dataclasses import dataclass
from posixpath import join
from urllib.parse import urlparse, urlunparse


DOCKER_IO = "docker.io"
DOCKER_SCHEMA = "docker"
DOCKER_NAMESPACE = "library"

__all__ = ["OCIReference"]


[docs] @dataclass(frozen=True) class OCIReference: url: str tag: str
[docs] @classmethod def from_oci(cls, ref: str) -> OCIReference: reference = str(ref) if reference.startswith(":") or not reference: raise ValueError(f"{reference!r} is not a valid OCI reference") if "://" not in reference: reference = f"{DOCKER_SCHEMA}://{reference}" parsed = urlparse(reference) if parsed.scheme != DOCKER_SCHEMA: raise ValueError(f"Invalid scheme: {reference}") if not parsed.path: parsed = urlparse(reference.replace("://", ":///")) host, path = parsed.netloc, parsed.path.lstrip("/") if "." not in host: path = join(host, path) host = "" path = path.lstrip("/") host = host or DOCKER_IO if host == DOCKER_IO: if not path.startswith(DOCKER_NAMESPACE): path = join(DOCKER_NAMESPACE, path) tag = path.removeprefix(DOCKER_NAMESPACE) else: tag = join(host, path) return cls(url=urlunparse((parsed.scheme, host, path, "", "", "")), tag=tag.lstrip("/"))