Source code for rail.projects.file_template

from __future__ import annotations

import os
from typing import Any

from ceci.config import StageParameter

from .configurable import Configurable


[docs] class RailProjectFileInstance(Configurable): """Simple class for holding information about a single file""" config_options: dict[str, StageParameter] = dict( name=StageParameter(str, None, fmt="%s", required=True, msg="File name"), path=StageParameter( str, None, fmt="%s", required=True, msg="Template for path to file" ), ) yaml_tag = "FileInstance" def __init__(self, **kwargs: Any) -> None: """C'tor Parameters ---------- kwargs: Any Configuration parameters for this RailProjectFileInstance, must match class.config_options data members """ Configurable.__init__(self, **kwargs) self._file_exists: bool | None = None
[docs] def resolve(self) -> str: """Return the corresponding path""" return self._config.path
[docs] def check_file(self, **kwargs: dict[str, Any]) -> bool: """Check to see if the file exists Notes ----- When called more than once, this uses the cached value unless called with update=True """ update = kwargs.pop("update", False) if self._file_exists is not None: if not update: return self._file_exists self._file_exists = os.path.exists(os.path.expandvars(self.config.path)) return self._file_exists
[docs] class RailProjectFileTemplate(Configurable): """Simple class for holding a template that can be resolved to a single file For example the path_template might be 'a_file/{flavor}_data.hdf5' and the interpolants would be ['flavor'] When called with a dict such as flavor: 'baseline path_template would get expanded out to a_file/baseline_data.hdf5 """ config_options: dict[str, StageParameter] = dict( name=StageParameter(str, None, fmt="%s", required=True, msg="Dataset name"), path_template=StageParameter( str, None, fmt="%s", required=True, msg="Template for path to file files" ), ) yaml_tag = "FileTemplate" def __init__(self, **kwargs: Any) -> None: """C'tor Parameters ---------- **kwargs Configuration parameters for this RailProjectFileTemplate, must match class.config_options data members """ Configurable.__init__(self, **kwargs)
[docs] def make_file_instance( self, name: str, **kwargs: dict[str, Any] ) -> RailProjectFileInstance: """Resolve the interpolants and construct a RailProjectFileInstance Parameters ---------- name: Name for the FileInstance object **kwargs: Interpolants needed to resolve the path template Returns ------- RailProjectFileInstance: Newly created object """ formatted_path = self.config.path_template.format(**kwargs) return RailProjectFileInstance( name=name, path=formatted_path, )