Source code for contree_sdk.docker.kw_arg
"""`ARG NAME[=DEFAULT]` - declare a build-time variable."""
from __future__ import annotations
from dataclasses import dataclass
from typing import ClassVar
from .context import AsyncBuildContext, BuildContext
from .keyword import DockerKeyword
[docs]
@dataclass(frozen=True, repr=False)
class ArgKeyword(DockerKeyword):
NAME: ClassVar[str] = "ARG"
name: str = ""
default: str | None = None
def __repr__(self) -> str:
if self.default is None:
return f"ARG {self.name}"
return f"ARG {self.name}={self.default}"
[docs]
@classmethod
def parse(cls, args_text: str) -> ArgKeyword:
raw = args_text.strip()
if not raw:
raise ValueError("ARG requires a name")
if "=" in raw:
name, _, default = raw.partition("=")
return cls(name=name.strip(), default=default.strip())
return cls(name=raw, default=None)
[docs]
def serialize(self) -> str:
if self.default is None:
return f"ARG {self.name}"
return f"ARG {self.name}={self.default}"
[docs]
def execute(self, ctx: BuildContext) -> None:
ctx.declared_args.add(self.name)
if self.default is not None and self.name not in ctx.arg_defaults:
ctx.arg_defaults[self.name] = ctx.substitute(self.default)
[docs]
async def execute_async(self, ctx: AsyncBuildContext) -> None:
ctx.declared_args.add(self.name)
if self.default is not None and self.name not in ctx.arg_defaults:
ctx.arg_defaults[self.name] = ctx.substitute(self.default)