Files
dotfiles/setup_types.py

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