#-----------------------------------------------------------------------------# Copyright (c) 2012 - 2022, Anaconda, Inc., and Bokeh Contributors.# All rights reserved.## The full license is in the file LICENSE.txt, distributed with this software.#-----------------------------------------------------------------------------""" Provide date and time related properties"""#-----------------------------------------------------------------------------# Boilerplate#-----------------------------------------------------------------------------from__future__importannotationsimportlogging# isort:skiplog=logging.getLogger(__name__)#-----------------------------------------------------------------------------# Imports#-----------------------------------------------------------------------------# Standard library importsimportdatetime# Bokeh importsfrom...util.serializationimportconvert_date_to_datetime,is_datetime_type,is_timedelta_typefrom.basesimportPropertyfrom.primitiveimportbokeh_integer_typesfrom.singletonsimportUndefined#-----------------------------------------------------------------------------# Globals and constants#-----------------------------------------------------------------------------__all__=('Date','Datetime','TimeDelta',)#-----------------------------------------------------------------------------# General API#-----------------------------------------------------------------------------
[docs]classDate(Property):""" Accept ISO format Date (but not DateTime) values. """deftransform(self,value):value=super().transform(value)ifisinstance(value,datetime.date):value=value.isoformat()returnvaluedefvalidate(self,value,detail=True):super().validate(value,detail)# datetime.datetime is datetime.date, exclude manually up frontifisinstance(value,datetime.datetime):msg=""ifnotdetailelse"Expected a date value, got a datetime.datetime"raiseValueError(msg)ifisinstance(value,datetime.date):returntry:datetime.datetime.fromisoformat(value)exceptException:msg=""ifnotdetailelsef"Expected an ISO date string, got {value!r}"raiseValueError(msg)
[docs]classDatetime(Property):""" Accept ISO format Datetime values. """def__init__(self,default=Undefined,help=None)->None:super().__init__(default=default,help=help)deftransform(self,value):value=super().transform(value)ifisinstance(value,str):value=datetime.datetime.fromisoformat(value)# Handled by serialization in protocol.py for now, except for Dateifisinstance(value,datetime.date):value=convert_date_to_datetime(value)returnvaluedefvalidate(self,value,detail=True):super().validate(value,detail)ifis_datetime_type(value):returnifisinstance(value,datetime.date):returnifDatetime.is_timestamp(value):returnifisinstance(value,str):try:datetime.datetime.fromisoformat(value).date()returnexceptException:passmsg=""ifnotdetailelsef"Expected a date, datetime object, or timestamp, got {value!r}"raiseValueError(msg)defserialize_value(self,value):""" Change the value into a JSON serializable format. """ifisinstance(value,datetime.date):value=convert_date_to_datetime(value)returnvalue@staticmethoddefis_timestamp(value):returnisinstance(value,(float,)+bokeh_integer_types)andnotisinstance(value,bool)
[docs]classTimeDelta(Property):""" Accept TimeDelta values. """def__init__(self,default=datetime.timedelta(),help=None)->None:super().__init__(default=default,help=help)deftransform(self,value):value=super().transform(value)returnvalue# Handled by serialization in protocol.py for nowdefvalidate(self,value,detail=True):super().validate(value,detail)ifis_timedelta_type(value):returnmsg=""ifnotdetailelsef"Expected a timedelta instance, got {value!r}"raiseValueError(msg)
#-----------------------------------------------------------------------------# Dev API#-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Private API#-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Code#-----------------------------------------------------------------------------