Source code for domovoy.plugins.time

import asyncio
import datetime

import pytz
from dateutil.parser import parse

from domovoy.applications.types import Interval
from domovoy.core.app_infra import AppWrapper
from domovoy.core.configuration import get_main_config
from domovoy.plugins.plugins import AppPlugin


[docs] class TimePlugin(AppPlugin): def __init__(self, name: str, wrapper: AppWrapper) -> None: super().__init__(name, wrapper)
[docs] async def sleep_for(self, interval: Interval) -> None: await asyncio.sleep(interval.total_seconds())
[docs] def parse_date(self, string: str) -> datetime.datetime: return parse(string)
[docs] def timedelta_from_now( self, date: datetime.datetime | str, target_tz: pytz.BaseTzInfo | None = None, ) -> datetime.timedelta: if target_tz is None: target_tz = get_main_config().get_timezone() date = date if isinstance(date, datetime.datetime) else parse(date) has_tz_info = date.tzinfo is not None and date.tzinfo.utcoffset(date) is not None if not has_tz_info: if target_tz is None: raise ValueError( "Date provided does not have timezone and a target timezone was not provided", ) date = target_tz.localize(date) now = datetime.datetime.now(target_tz) return now - date
[docs] def datetime_to_local_timezone(self, dt: datetime.datetime) -> datetime.datetime: return dt.astimezone(get_main_config().get_timezone())
[docs] def parse_timestamp_to_local_timezone(self, timestamp: float) -> datetime.datetime: naive_dt = datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC) return self.datetime_to_local_timezone(naive_dt)
[docs] def now(self, *, tz: datetime.tzinfo | None = None) -> datetime.datetime: if tz is None: tz = get_main_config().get_timezone() return datetime.datetime.now(tz=tz)
[docs] def today(self, *, tz: datetime.tzinfo | None = None) -> datetime.date: return self.now(tz=tz).date()
[docs] def make_datetime_aware(self, *, dt: datetime.datetime, tz: datetime.tzinfo | None = None) -> datetime.datetime: if tz is None: tz = get_main_config().get_timezone() return dt.replace(tzinfo=tz)
[docs] def is_datetime_aware(self, dt: datetime.datetime) -> bool: return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
[docs] def is_now_between_dawn_and_dusk(self) -> bool: return self.is_between_dawn_and_dusk( datetime.datetime.now(tz=get_main_config().get_timezone()), )
[docs] def is_between_dawn_and_dusk(self, dt: datetime.datetime) -> bool: astral_location = get_main_config().get_astral_location() if astral_location is None: raise ValueError("No Location is set in config") date = dt.date() sun_locations = astral_location.sun(date, local=True) dawn = sun_locations["dawn"] dusk = sun_locations["dusk"] return dawn <= dt <= dusk