70 lines
2.6 KiB
Python
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,
|
|
)
|