Source code for doitoml.utils.log
"""Utilities for logging.."""
import contextlib
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional
from doitoml.types import ExecutionContext
from .path import ensure_parents
[docs]
def call_with_capture(
func: Callable[[Any], Optional[bool]],
args: List[Any],
kwargs: Dict[str, Any],
execution_context: ExecutionContext,
) -> Optional[bool]:
"""Call a function with optional output capturing."""
stdout, stderr = ensure_parents(*execution_context.log_paths)
stdout_mgr: contextlib.AbstractContextManager = contextlib.nullcontext()
stderr_mgr: contextlib.AbstractContextManager = contextlib.nullcontext()
managers: List[contextlib.AbstractContextManager] = []
if isinstance(stdout, Path):
stdout_fh = stdout.open(execution_context.log_mode)
stdout_mgr = contextlib.redirect_stdout(stdout_fh)
managers += [stdout_mgr]
if isinstance(stderr, Path):
if stderr == stdout:
stderr_mgr = contextlib.redirect_stderr(stdout_fh)
else:
stderr_fh = stderr.open(execution_context.log_mode)
stderr_mgr = contextlib.redirect_stderr(stderr_fh)
managers += [stderr_mgr]
with stdout_mgr, stderr_mgr:
return func(*args, **kwargs)