#-----------------------------------------------------------------------------# Copyright (c) 2012 - 2022, Anaconda, Inc. All rights reserved.## Powered by the Bokeh Development Team.## The full license is in the file LICENSE.txt, distributed with this software.#-----------------------------------------------------------------------------""" Provide the Struct property."""#-----------------------------------------------------------------------------# Boilerplate#-----------------------------------------------------------------------------from__future__importannotationsimportlogging# isort:skiplog=logging.getLogger(__name__)#-----------------------------------------------------------------------------# Imports#-----------------------------------------------------------------------------# Bokeh importsfrom.basesimportParameterizedProperty#-----------------------------------------------------------------------------# Globals and constants#-----------------------------------------------------------------------------__all__=('Struct',)#-----------------------------------------------------------------------------# General API#-----------------------------------------------------------------------------
[docs]classStruct(ParameterizedProperty):""" Accept values that are structures. """def__init__(self,**fields)->None:default=fields.pop("default",None)help=fields.pop("help",None)self._fields={}forname,typeinfields.items():self._fields[name]=self._validate_type_param(type)super().__init__(default=default,help=help)@propertydeftype_params(self):returnlist(self._fields.values())defvalidate(self,value,detail=True):super().validate(value,detail)ifisinstance(value,dict)andlen(value)<=len(self._fields):# note use of for-else loop hereforname,typeinself._fields.items():ifnottype.is_valid(value.get(name,None)):breakelse:returnmsg=""ifnotdetailelsef"expected an element of {self}, got {value!r}"raiseValueError(msg)def__str__(self)->str:class_name=self.__class__.__name__fields=", ".join(f"{name}={typ}"forname,typinself._fields.items())returnf"{class_name}({fields})"
#-----------------------------------------------------------------------------# Dev API#-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Private API#-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Code#-----------------------------------------------------------------------------