You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.2 KiB
Python
90 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from decimal import Decimal
|
|
|
|
from isoduration.formatter import format_duration
|
|
from isoduration.operations import add
|
|
|
|
|
|
@dataclass
|
|
class DateDuration:
|
|
years: Decimal = Decimal(0)
|
|
months: Decimal = Decimal(0)
|
|
days: Decimal = Decimal(0)
|
|
weeks: Decimal = Decimal(0)
|
|
|
|
def __neg__(self) -> DateDuration:
|
|
return DateDuration(
|
|
years=-self.years,
|
|
months=-self.months,
|
|
days=-self.days,
|
|
weeks=-self.weeks,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class TimeDuration:
|
|
hours: Decimal = Decimal(0)
|
|
minutes: Decimal = Decimal(0)
|
|
seconds: Decimal = Decimal(0)
|
|
|
|
def __neg__(self) -> TimeDuration:
|
|
return TimeDuration(
|
|
hours=-self.hours,
|
|
minutes=-self.minutes,
|
|
seconds=-self.seconds,
|
|
)
|
|
|
|
|
|
class Duration:
|
|
def __init__(self, date_duration: DateDuration, time_duration: TimeDuration):
|
|
self.date = date_duration
|
|
self.time = time_duration
|
|
|
|
def __repr__(self) -> str:
|
|
return f"{self.__class__.__name__}({self.date}, {self.time})"
|
|
|
|
def __str__(self) -> str:
|
|
return format_duration(self)
|
|
|
|
def __hash__(self) -> int:
|
|
return hash(
|
|
(
|
|
self.date.years,
|
|
self.date.months,
|
|
self.date.days,
|
|
self.date.weeks,
|
|
self.time.hours,
|
|
self.time.minutes,
|
|
self.time.seconds,
|
|
)
|
|
)
|
|
|
|
def __eq__(self, other: object) -> bool:
|
|
if isinstance(other, Duration):
|
|
return self.date == other.date and self.time == other.time
|
|
|
|
raise NotImplementedError
|
|
|
|
def __neg__(self) -> Duration:
|
|
return Duration(-self.date, -self.time)
|
|
|
|
def __add__(self, other: datetime) -> datetime:
|
|
if isinstance(other, datetime):
|
|
return add(other, self)
|
|
|
|
raise NotImplementedError
|
|
|
|
__radd__ = __add__
|
|
|
|
def __sub__(self, other: object) -> None:
|
|
raise NotImplementedError
|
|
|
|
def __rsub__(self, other: datetime) -> datetime:
|
|
if isinstance(other, datetime):
|
|
return -self + other
|
|
|
|
raise NotImplementedError
|