Source code for enriched.datetime_interval_set
"""
Interval and interval set subclassed to work with `datetime` values.
This serves also as prototype for other extension to specific 'real-like'
domains for subclassing and which methods should be overridden (and how).
Everything else is inherited from the superclasses in a way that takes care
of ensuring operations (utils, builders, algebraic operations)
will stay in the correct domain.
"""
import datetime
from clothesline.base.base_interval_set import BaseIntervalSet
from clothesline.base.base_interval import BaseInterval
from clothesline.base.base_domain_metric import BaseDomainMetric
from clothesline.generic.interval_generic_builder import IntervalGenericBuilder
from clothesline.generic.interval_generic_utils import IntervalGenericUtils
from clothesline.generic.interval_set_generic_utils import (
IntervalSetGenericUtils,
) # noqa: E501
[docs]class DatetimeMetric(BaseDomainMetric):
"""
The metric on the datetime domain just needs to take care
of the fact that differences are 'timedelta' objects.
"""
[docs] @staticmethod
def adder(val1, val2):
"""standard addition."""
return val1 + val2
[docs] @staticmethod
def subtracter(val1, val2):
"""standard subtraction."""
return val1 - val2
zero = datetime.timedelta(0)
[docs]class DatetimeInterval(BaseInterval):
"""
Domain-specific interval subclass.
Below are the methods that one should override when creating a subclass.
For these intervals, values are `datetime`.
"""
metric = DatetimeMetric
[docs] @staticmethod
def value_encoder(val):
"""domain encoder: datetime => timestamp (floating-point number)."""
return val.timestamp()
[docs] @staticmethod
def value_decoder(val):
"""domain decoder: timestamp -> datetime."""
return datetime.datetime.fromtimestamp(val)
serializing_class = "DatetimeInterval"
serializing_version = 1
[docs] @staticmethod
def builder():
"""
Return a builder configured to make peg pairs into
these types of intervals.
"""
return IntervalGenericBuilder(
interval_class=DatetimeInterval,
interval_set_class=None,
)
[docs] @staticmethod
def utils():
"""
Return an "utils" object configured to create special cases of
intervals as instance of this subclass.
"""
return IntervalGenericUtils(interval_class=DatetimeInterval)
[docs]class DatetimeIntervalSet(BaseIntervalSet):
"""
Domain-specific interval-set subclass.
Below are the methods that one should override when creating a subclass.
For these interval sets, values are `datetime`.
"""
interval_class = DatetimeInterval
serializing_class = "DatetimeIntervalSet"
serializing_version = 1
[docs] @staticmethod
def builder():
"""
Return a builder configured to make peg pairs into
these types of interval sets.
"""
return IntervalGenericBuilder(
interval_set_class=DatetimeIntervalSet,
)
[docs] @staticmethod
def utils():
"""
Return an "utils" object configured to create special cases of
interval sets as instance of this subclass.
"""
return IntervalSetGenericUtils(
interval_set_class=DatetimeIntervalSet,
)