# Copyright 2026 European Union
# Author: Bulgheroni Antonio (antonio.bulgheroni@ec.europa.eu)
# SPDX-License-Identifier: EUPL-1.2
"""Shared Click options and configuration for GitLab registry command groups.
:author: Bulgheroni Antonio (antonio.bulgheroni@ec.europa.eu)
"""
from __future__ import annotations
from collections.abc import Callable
from typing import Any
import click
from mafw.devtools.gitlab.api import GitlabAPIConfiguration, build_gitlab_api_configuration
[docs]
def gitlab_registry_options(function: Callable[..., Any]) -> Callable[..., Any]:
"""Add the standard GitLab API URL, project ID, and token options."""
function = click.option('--gitlab-token', default=None, envvar='CI_JOB_TOKEN', help='GitLab API token.')(function)
function = click.option(
'--gitlab-project-id',
default=None,
type=int,
envvar='CI_PROJECT_ID',
help='GitLab project numeric id (env: CI_PROJECT_ID).',
)(function)
function = click.option(
'--gitlab-api-url',
default=None,
envvar='CI_API_V4_URL',
help='GitLab API v4 base URL (env: CI_API_V4_URL).',
)(function)
return function
[docs]
def configure_gitlab_registry_context(
ctx: click.Context, api_url: str | None, project_id: int | None, token: str | None
) -> None:
"""Store shared registry options in the current Click context."""
ctx.ensure_object(dict)
ctx.obj['gitlab_api_url'] = api_url
ctx.obj['gitlab_project_id'] = project_id
ctx.obj['gitlab_token'] = token
[docs]
def build_gitlab_registry_configuration(ctx: click.Context) -> GitlabAPIConfiguration:
"""Build the registry configuration and expose validation errors as Click errors."""
options = ctx.ensure_object(dict)
try:
return build_gitlab_api_configuration(
options.get('gitlab_api_url'), options.get('gitlab_project_id'), options.get('gitlab_token')
)
except ValueError as exc:
raise click.ClickException(str(exc)) from exc