Files
2026-07-13 12:25:07 +08:00

101 lines
4.9 KiB
Python

# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
# ┃ This file is part of the Perspective library, distributed under the terms ┃
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
from traitlets import HasTraits, Unicode, List, Bool, Dict, validate, Enum
import importlib.metadata
__version__ = importlib.metadata.version("perspective-python")
from .validate import (
validate_version,
)
class PerspectiveTraitlets(HasTraits):
"""Define the traitlet interface with `PerspectiveJupyterWidget` on the
front end. Attributes which are set here are synchronized between the
front-end and back-end.
Examples:
>>> widget = perspective.PerspectiveWidget(
... data, group_by=["a", "b", "c"])
PerspectiveWidget(group_by=["a", "b", "c"])
>>> widget.split_by=["b"]
>>> widget
PerspectiveWidget(group_by=["a", "b", "c"], split_by=["b"])
"""
# `perspective-viewer` options
plugin = Unicode("Datagrid").tag(sync=True)
columns = List(default_value=[]).tag(sync=True)
group_by = List(trait=Unicode(), default_value=[]).tag(sync=True, o=True)
split_by = List(trait=Unicode(), default_value=[]).tag(sync=True)
aggregates = Dict(default_value={}).tag(sync=True)
sort = List(default_value=[]).tag(sync=True)
filter = List(default_value=[]).tag(sync=True)
expressions = Dict(default_value=[]).tag(sync=True)
plugin_config = Dict(default_value={}).tag(sync=True)
settings = Bool(True).tag(sync=True)
theme = Unicode("Pro Light", allow_none=True).tag(sync=True)
# used to tell the frontend which table to connect to
table_name = Unicode(None, allow_none=True).tag(sync=True)
server = Bool(False).tag(sync=True)
binding_mode = Enum(("server", "client-server")).tag(default="server", sync=True)
title = Unicode(None, allow_none=True).tag(sync=True)
version = Unicode(__version__).tag(sync=True)
# @validate("plugin")
# def _validate_plugin(self, proposal):
# return validate_plugin(proposal.value)
# @validate("columns")
# def _validate_columns(self, proposal):
# return validate_columns(proposal.value)
# @validate("group_by")
# def _validate_group_by(self, proposal):
# return validate_group_by(proposal.value)
# @validate("split_by")
# def _validate_split_by(self, proposal):
# return validate_split_by(proposal.value)
# @validate("aggregates")
# def _validate_aggregates(self, proposal):
# return validate_aggregates(proposal.value)
# @validate("sort")
# def _validate_sort(self, proposal):
# return validate_sort(proposal.value)
# @validate("filter")
# def _validate_filter(self, proposal):
# return validate_filter(proposal.value)
# @validate("expressions")
# def _validate_expressions(self, proposal):
# return validate_expressions(proposal.value)
# @validate("plugin_config")
# def _validate_plugin_config(self, proposal):
# return validate_plugin_config(proposal.value)
# @validate("title")
# def _validate_title(self, proposal):
# return validate_title(proposal.value)
@validate("version")
def _validate_version(self, proposal):
return validate_version(proposal.value)