Source code for aces.utils

import io
import logging
import sys
from collections.abc import Generator
from contextlib import contextmanager
from datetime import timedelta

from bigtree import Node, print_tree
from pytimeparse import parse

logger = logging.getLogger(__name__)


[docs]def parse_timedelta(time_str: str | None = None) -> timedelta: """Parse a time string and return a timedelta object. Using time expression parser: https://github.com/wroberts/pytimeparse Args: time_str: The time string to parse. Returns: datetime.timedelta: The parsed timedelta object. Examples: >>> parse_timedelta("1 days") datetime.timedelta(days=1) >>> parse_timedelta("1 day") datetime.timedelta(days=1) >>> parse_timedelta("1 days 2 hours 3 minutes 4 seconds") datetime.timedelta(days=1, seconds=7384) >>> parse_timedelta('1 day, 14:20:16') datetime.timedelta(days=1, seconds=51616) >>> parse_timedelta('365 days') datetime.timedelta(days=365) >>> parse_timedelta() datetime.timedelta(0) >>> parse_timedelta("") datetime.timedelta(0) >>> parse_timedelta(None) datetime.timedelta(0) """ if not time_str: return timedelta(days=0) return timedelta(seconds=parse(time_str))
[docs]@contextmanager def capture_output() -> Generator[io.StringIO, None, None]: """A context manager to capture stdout output. This can eventually be eliminated if https://github.com/kayjan/bigtree/issues/285 is resolved. Examples: >>> with capture_output() as captured: ... print("Hello, world!") >>> captured.getvalue().strip() 'Hello, world!' """ new_out = io.StringIO() # Create a StringIO object to capture output old_out = sys.stdout # Save the current stdout so we can restore it later try: sys.stdout = new_out # Redirect stdout to our StringIO object yield new_out finally: sys.stdout = old_out # Restore the original stdout
[docs]def log_tree(node: Node) -> None: """Logs the tree structure using logging.info.""" with capture_output() as captured: print_tree(node, style="const_bold") # This will print to the captured StringIO instead of stdout logger.info("\n" + captured.getvalue()) # Log the captured output