83 lines
1.5 KiB
Python
83 lines
1.5 KiB
Python
"""Types and helpers for setup profiles."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from enum import Enum, auto
|
|
|
|
Command = tuple[str, ...]
|
|
|
|
|
|
class Action(Enum):
|
|
SYMLINK = auto()
|
|
COPY = auto()
|
|
SYSTEM_INSTALL = auto()
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Item:
|
|
action: Action
|
|
src: str
|
|
dst: str | None = None
|
|
mode: int | None = None
|
|
post_install: tuple[Command, ...] = ()
|
|
|
|
@property
|
|
def target(self) -> str:
|
|
return self.dst or self.src
|
|
|
|
|
|
def normalize_commands(commands: list[Command] | None) -> tuple[Command, ...]:
|
|
return tuple(commands or [])
|
|
|
|
|
|
def ln(
|
|
src: str,
|
|
dst: str | None = None,
|
|
*,
|
|
post_install: list[Command] | None = None,
|
|
) -> Item:
|
|
return Item(
|
|
Action.SYMLINK, src, dst, post_install=normalize_commands(post_install)
|
|
)
|
|
|
|
|
|
def cp(
|
|
src: str,
|
|
dst: str | None = None,
|
|
*,
|
|
post_install: list[Command] | None = None,
|
|
) -> Item:
|
|
return Item(
|
|
Action.COPY, src, dst, post_install=normalize_commands(post_install)
|
|
)
|
|
|
|
|
|
def install(
|
|
src: str,
|
|
dst: str | None = None,
|
|
*,
|
|
mode: int = 0o644,
|
|
post_install: list[Command] | None = None,
|
|
) -> Item:
|
|
return Item(
|
|
Action.SYSTEM_INSTALL,
|
|
src,
|
|
dst,
|
|
mode,
|
|
normalize_commands(post_install),
|
|
)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Profile:
|
|
items: list[Item]
|
|
pkgs: dict[str, list[str]]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Resolved:
|
|
pkgs: list[str]
|
|
items: list[Item]
|
|
has_package_profile: bool = True
|