plexus.cli.metrics.time_utils module

Time parsing utilities for flexible date/time input handling.

This module provides flexible time parsing using the dateparser library, allowing users to input times in various formats: - Relative: “2 hours ago”, “yesterday”, “last week” - Absolute: “2024-11-19”, “2024-11-19 14:00” - Natural: “1 AM February 3”, “Nov 19 2pm”

plexus.cli.metrics.time_utils.format_time_range(start: datetime, end: datetime) str

Format a time range for display.

Args:

start: Start datetime end: End datetime

Returns:

Formatted string representation of the time range

Examples:
>>> start = datetime(2024, 11, 19, 13, 0, 0, tzinfo=timezone.utc)
>>> end = datetime(2024, 11, 19, 15, 0, 0, tzinfo=timezone.utc)
>>> format_time_range(start, end)
'2024-11-19 13:00 to 15:00 UTC (2.0 hours)'
plexus.cli.metrics.time_utils.get_calendar_hour_range(reference_time: datetime | None = None) Tuple[datetime, datetime]

Get the current and previous calendar hour range.

This is the default time range used by the Lambda function. If it’s 14:30, returns (13:00, 15:00) covering hours 13 and 14.

Args:

reference_time: Optional reference time (defaults to now)

Returns:

Tuple of (start_time, end_time) covering two calendar hours

Examples:
>>> ref = datetime(2024, 11, 19, 14, 30, 0, tzinfo=timezone.utc)
>>> get_calendar_hour_range(ref)
(datetime(2024, 11, 19, 13, 0, 0), datetime(2024, 11, 19, 15, 0, 0))
plexus.cli.metrics.time_utils.get_time_range_from_args(hours: int | None = None, start: str | None = None, end: str | None = None) Tuple[datetime, datetime]

Get a time range from command-line arguments.

Priority order: 1. If hours is provided: return (now - hours, now) 2. If start and end are provided: parse both and return 3. If only start is provided: return (start, now) 4. Default: return current and previous calendar hour

Args:

hours: Number of hours to go back from now start: Start time string (flexible format) end: End time string (flexible format)

Returns:

Tuple of (start_time, end_time) as datetime objects in UTC

Raises:

ValueError: If time strings cannot be parsed or if end < start

Examples:
>>> get_time_range_from_args(hours=2)
(datetime(2024, 11, 19, 12, 0, 0), datetime(2024, 11, 19, 14, 0, 0))
>>> get_time_range_from_args(start="yesterday", end="now")
(datetime(2024, 11, 18, 0, 0, 0), datetime(2024, 11, 19, 14, 0, 0))
>>> get_time_range_from_args()  # Default: current and previous hour
(datetime(2024, 11, 19, 13, 0, 0), datetime(2024, 11, 19, 15, 0, 0))
plexus.cli.metrics.time_utils.parse_flexible_time(time_str: str) datetime

Parse a flexible time string into a datetime object.

Supports a wide variety of formats: - Relative times: “2 hours ago”, “yesterday”, “last week” - Absolute dates: “2024-11-19”, “November 19 2024” - Times with dates: “2024-11-19 14:00”, “1 AM February 3” - Natural language: “tomorrow at 3pm”, “next Monday”

Args:

time_str: The time string to parse

Returns:

datetime: Parsed datetime in UTC timezone

Raises:

ValueError: If the time string cannot be parsed

Examples:
>>> parse_flexible_time("2 hours ago")
datetime.datetime(2024, 11, 19, 12, 0, 0, tzinfo=timezone.utc)
>>> parse_flexible_time("2024-11-19 14:00")
datetime.datetime(2024, 11, 19, 14, 0, 0, tzinfo=timezone.utc)
>>> parse_flexible_time("yesterday")
datetime.datetime(2024, 11, 18, 0, 0, 0, tzinfo=timezone.utc)