fluxer/scripts/ci/ci_workflow.py
2026-02-17 12:22:36 +00:00

71 lines
1.8 KiB
Python

#!/usr/bin/env python3
from __future__ import annotations
import argparse
import os
from dataclasses import dataclass
from typing import Iterable, Sequence
@dataclass(frozen=True)
class EnvArg:
flag: str
env: str
default: str = ""
dest: str | None = None
def dest_name(self) -> str:
if self.dest is not None:
return self.dest
return self.flag.lstrip("-").replace("-", "_")
def build_step_parser(
env_args: Sequence[EnvArg] | None = None,
*,
include_server_ip: bool = False,
step_required: bool = True,
) -> argparse.ArgumentParser:
parser = argparse.ArgumentParser()
if step_required:
parser.add_argument("--step", required=True)
if include_server_ip:
parser.add_argument("--server-ip", default="")
for arg in env_args or []:
parser.add_argument(arg.flag, default=arg.default, dest=arg.dest_name())
return parser
def apply_env_args(args: argparse.Namespace, env_args: Iterable[EnvArg]) -> None:
for arg in env_args:
value = getattr(args, arg.dest_name(), "")
if value:
os.environ[arg.env] = value
def apply_server_ip(args: argparse.Namespace) -> None:
value = getattr(args, "server_ip", "")
if value:
os.environ["SERVER_IP"] = value
def parse_step_env_args(
env_args: Sequence[EnvArg] | None = None,
*,
include_server_ip: bool = False,
) -> argparse.Namespace:
parser = build_step_parser(env_args, include_server_ip=include_server_ip)
args = parser.parse_args()
apply_env_args(args, env_args or [])
if include_server_ip:
apply_server_ip(args)
return args
def parse_env_args(env_args: Sequence[EnvArg]) -> argparse.Namespace:
parser = build_step_parser(env_args, step_required=False)
args = parser.parse_args()
apply_env_args(args, env_args)
return args