from typing import Sequence, List, TYPE_CHECKING, Optional, Iterator
if TYPE_CHECKING:
from pyfileconf.sectionpath.sectionpath import SectionPath
from pyfileconf.interfaces import SectionPathLike
from pyfileconf.pmcontext.actions import PyfileconfActions
[docs]class PyfileconfFrame:
[docs] def __init__(
self,
section_path: SectionPathLike,
action: PyfileconfActions,
file_path: Optional[str] = None,
):
from pyfileconf.sectionpath.sectionpath import SectionPath
self.section_path = SectionPath.from_ambiguous(section_path)
self.action = action
self.file_path = file_path
def __repr__(self):
return (
f"<PyfileconfFrame(section_path={self.section_path.path_str}, "
f"action={self.action.value}, file_path={self.file_path})>"
)
[docs] @classmethod
def from_file_path(cls, file_path: str, action: PyfileconfActions):
from pyfileconf import PipelineManager
from pyfileconf.sectionpath.sectionpath import SectionPath
dependent_manager = PipelineManager.get_manager_by_filepath(file_path)
dependent_sp = SectionPath.from_filepath(
dependent_manager.default_config_path, file_path
)
full_sp = SectionPath.join(dependent_manager.name, dependent_sp)
return cls(full_sp, action, file_path=file_path)
[docs]class PyfileconfStack:
frames: List[PyfileconfFrame]
[docs] def __init__(self, frames: Sequence[PyfileconfFrame]):
self.frames = list(frames)
def __getitem__(self, item) -> PyfileconfFrame:
return self.frames[item]
def __iter__(self) -> Iterator[PyfileconfFrame]:
yield from self.frames
def __repr__(self):
frame_repr = "\n".join(f"{i}\t{repr(frame)}" for i, frame in enumerate(self))
return f"<PyfileconfStack(\n{frame_repr}\n)>"
[docs] def add_frame(self, frame: PyfileconfFrame):
self.frames.append(frame)
[docs] def pop_frame(self) -> PyfileconfFrame:
return self.frames.pop(-1)
[docs] def add_running_item(self, section_path: SectionPathLike):
frame = PyfileconfFrame(section_path, PyfileconfActions.RUN)
self.add_frame(frame)
@property
def currently_running_section_path_str(self) -> Optional[str]:
run_frames = [frame for frame in self if frame.action == PyfileconfActions.RUN]
if not run_frames:
return None
return run_frames[-1].section_path.path_str
@property
def file_is_currently_being_loaded(self) -> bool:
load_frames = [
frame
for frame in self
if frame.action == PyfileconfActions.LOAD_FILE_EXECUTE
]
return len(load_frames) > 0
@property
def currently_loading_file_section_path(self) -> Optional["SectionPath"]:
load_frames = [
frame
for frame in self
if frame.action == PyfileconfActions.LOAD_FILE_EXECUTE
]
if not load_frames:
return None
return load_frames[-1].section_path