def construct_data_model(parameterized, name=None, ignore=[], types={}): properties = {} for pname in parameterized.param: if pname in ignore: continue p = parameterized.param[pname] if p.precedence and p.precedence < 0: continue ptype = types.get(pname, type(p)) prop = PARAM_MAPPING.get(ptype) pname = parameterized._rename.get(pname, pname) if pname == 'name' or pname is None: continue nullable = getattr(p, 'allow_None', False) kwargs = {'default': p.default, 'help': p.doc} if prop is None: bk_prop, accepts = bp.Any(**kwargs), [] else: bkp = prop(p, {} if nullable else kwargs) bk_prop, accepts = bkp if isinstance(bkp, tuple) else (bkp, []) if nullable: bk_prop = bp.Nullable(bk_prop, **kwargs) for bkp, convert in accepts: bk_prop = bk_prop.accepts(bkp, convert) properties[pname] = bk_prop name = name or parameterized.name return type(name, (DataModel, ), properties)
def construct_data_model(parameterized, name=None, ignore=[], types={}): """ Dynamically creates a Bokeh DataModel class from a Parameterized object. Arguments --------- parameterized: param.Parameterized The Parameterized class or instance from which to create the DataModel name: str or None Name of the dynamically created DataModel class ignore: list(str) List of parameters to ignore. types: dict A dictionary mapping from parameter name to a Parameter type, making it possible to override the default parameter types. Returns ------- DataModel """ properties = {} for pname in parameterized.param: if pname in ignore: continue p = parameterized.param[pname] if p.precedence and p.precedence < 0: continue ptype = types.get(pname, type(p)) prop = PARAM_MAPPING.get(ptype) if isinstance(parameterized, Syncable): pname = parameterized._rename.get(pname, pname) if pname == 'name' or pname is None: continue nullable = getattr(p, 'allow_None', False) kwargs = {'default': p.default, 'help': p.doc} if prop is None: bk_prop, accepts = bp.Any(**kwargs), [] else: bkp = prop(p, {} if nullable else kwargs) bk_prop, accepts = bkp if isinstance(bkp, tuple) else (bkp, []) if nullable: bk_prop = bp.Nullable(bk_prop, **kwargs) for bkp, convert in accepts: bk_prop = bk_prop.accepts(bkp, convert) properties[pname] = bk_prop name = name or parameterized.name return type(name, (DataModel, ), properties)
def construct_data_model(parameterized, name=None, ignore=['name']): properties = {} for pname in parameterized.param: if pname in ignore: continue p = parameterized.param[pname] prop = PARAM_MAPPING.get(type(p)) kwargs = {'default': p.default, 'help': p.doc} if prop is None: properties[pname] = bp.Any(**kwargs) else: properties[pname] = prop(p, kwargs) name = name or parameterized.name return type(name, (DataModel, ), properties)
_DATA_MODELS = weakref.WeakKeyDictionary() PARAM_MAPPING = { pm.Array: lambda p, kwargs: bp.Array(bp.Any, **kwargs), pm.Boolean: lambda p, kwargs: bp.Bool(**kwargs), pm.CalendarDate: lambda p, kwargs: bp.Date(**kwargs), pm.CalendarDateRange: lambda p, kwargs: bp.Tuple(bp.Date, bp.Date, **kwargs), pm.ClassSelector: lambda p, kwargs: ((bp.Instance(DataModel, **kwargs), [ (Parameterized, create_linked_datamodel) ]) if isinstance(p.class_, type) and issubclass( p.class_, param.Parameterized) else bp.Any(**kwargs)), pm.Color: lambda p, kwargs: bp.Color(**kwargs), pm.DataFrame: lambda p, kwargs: (bp.ColumnData(bp.Any, bp.Seq(bp.Any), **kwargs), [( bp.PandasDataFrame, lambda x: ColumnDataSource._data_from_df(x))]), pm.DateRange: lambda p, kwargs: bp.Tuple(bp.Datetime, bp.Datetime, **kwargs), pm.Date: lambda p, kwargs: bp.Datetime(**kwargs), pm.Dict: lambda p, kwargs: bp.Dict(bp.String, bp.Any, **kwargs), pm.Event: lambda p, kwargs: bp.Bool(**kwargs), pm.Integer: lambda p, kwargs: bp.Int(**kwargs),