Files
RetroDebian/builder/py/retrobuilder/context.py
2026-03-27 23:21:55 +01:00

70 lines
2.6 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from pathlib import Path
from typing import Mapping
@dataclass(frozen=True)
class BuildContext:
project_root: Path
live_dir: Path
artifacts_root: Path
phase: str
current_kind: str
current_name: str
current_module_artifact_dir: Path
profile_name: str = ''
profile_artifact_dir: Path | None = None
base_name: str = ''
base_artifact_dir: Path | None = None
feature_name: str = ''
feature_artifact_dir: Path | None = None
profile_features: tuple[str, ...] = ()
def to_env(self) -> dict[str, str]:
env = {
'PROJECT_ROOT': str(self.project_root),
'LIVE_DIR': str(self.live_dir),
'ARTIFACTS_ROOT': str(self.artifacts_root),
'PHASE': self.phase,
'CURRENT_KIND': self.current_kind,
'CURRENT_NAME': self.current_name,
'CURRENT_MODULE_ARTIFACT_DIR': str(self.current_module_artifact_dir),
'PROFILE_NAME': self.profile_name,
'BASE_NAME': self.base_name,
'FEATURE_NAME': self.feature_name,
'PROFILE_FEATURES': '|'.join(self.profile_features),
}
if self.profile_artifact_dir is not None:
env['PROFILE_ARTIFACT_DIR'] = str(self.profile_artifact_dir)
if self.base_artifact_dir is not None:
env['BASE_ARTIFACT_DIR'] = str(self.base_artifact_dir)
if self.feature_artifact_dir is not None:
env['FEATURE_ARTIFACT_DIR'] = str(self.feature_artifact_dir)
return env
@classmethod
def from_env(cls, env: Mapping[str, str]) -> 'BuildContext':
def p(name: str) -> Path | None:
value = env.get(name, '')
return Path(value) if value else None
features = tuple(filter(None, env.get('PROFILE_FEATURES', '').split('|')))
return cls(
project_root=Path(env['PROJECT_ROOT']),
live_dir=Path(env['LIVE_DIR']),
artifacts_root=Path(env['ARTIFACTS_ROOT']),
phase=env['PHASE'],
current_kind=env['CURRENT_KIND'],
current_name=env['CURRENT_NAME'],
current_module_artifact_dir=Path(env['CURRENT_MODULE_ARTIFACT_DIR']),
profile_name=env.get('PROFILE_NAME', ''),
profile_artifact_dir=p('PROFILE_ARTIFACT_DIR'),
base_name=env.get('BASE_NAME', ''),
base_artifact_dir=p('BASE_ARTIFACT_DIR'),
feature_name=env.get('FEATURE_NAME', ''),
feature_artifact_dir=p('FEATURE_ARTIFACT_DIR'),
profile_features=features,
)