#-----------------------------------------------------------------------------# Copyright (c) Anaconda, Inc., and Bokeh Contributors.# All rights reserved.## The full license is in the file LICENSE.txt, distributed with this software.#-----------------------------------------------------------------------------""" Provide the Enum property."""#-----------------------------------------------------------------------------# Boilerplate#-----------------------------------------------------------------------------from__future__importannotationsimportlogging# isort:skiplog=logging.getLogger(__name__)#-----------------------------------------------------------------------------# Imports#-----------------------------------------------------------------------------# Standard library importsfromtypingimport(Any,Literal,get_args,overload,)# Bokeh importsfrom...util.stringsimportnice_joinfrom..importenumsfrom._sphinximportmodel_link,property_link,register_type_linkfrom.basesimportInitfrom.primitiveimportStringfrom.singletonsimportIntrinsic#-----------------------------------------------------------------------------# Globals and constants#-----------------------------------------------------------------------------__all__=('Enum',)#-----------------------------------------------------------------------------# General API#-----------------------------------------------------------------------------
[docs]classEnum(String):""" Accept values from enumerations. The first value in enumeration is used as the default value, unless the ``default`` keyword argument is used. See :ref:`bokeh.core.enums` for more information. """_enum:enums.Enumeration@overloaddef__init__(self,enum:type[Literal[""]],*,default:Init[str]=...,help:str|None=...)->None:...@overloaddef__init__(self,enum:enums.Enumeration,*,default:Init[str]=...,help:str|None=...)->None:...@overloaddef__init__(self,enum:str,*values:str,default:Init[str]=...,help:str|None=...)->None:...def__init__(self,enum:str|type[Literal[""]]|enums.Enumeration,*values:str,default:Init[str]=Intrinsic,help:str|None=None)->None:ifisinstance(enum,str):self._enum=enums.enumeration(enum,*values)elifvalues:raiseValueError("unexpected enum values")elifisinstance(enum,enums.Enumeration):self._enum=enumelse:self._enum=enums.enumeration(*get_args(enum))default=defaultifdefaultisnotIntrinsicelseself._enum._defaultsuper().__init__(default=default,help=help)def__str__(self)->str:class_name=self.__class__.__name__allowed_values=", ".join(repr(x)forxinself.allowed_values)returnf"{class_name}({allowed_values})"@propertydefallowed_values(self)->list[str]:returnself._enum._valuesdefvalidate(self,value:Any,detail:bool=True)->None:super().validate(value,detail)ifvalueinself._enum:returnmsg=""ifnotdetailelsef"invalid value: {value!r}; allowed values are {nice_join(self.allowed_values)}"raiseValueError(msg)
#-----------------------------------------------------------------------------# Dev API#-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Private API#-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Code#-----------------------------------------------------------------------------@register_type_link(Enum)def_sphinx_type(obj:Enum)->str:# try to return a link to a proper enum in bokeh.core.enums if possibleifobj._enuminenums.__dict__.values():forname,valueinenums.__dict__.items():ifobj._enumisvalue:fullname=f"{obj._enum.__module__}.{name}"returnf"{property_link(obj)}({model_link(fullname)})"# otherwise just a basic str name formatreturnf"{property_link(obj)}({obj._enum})"