Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 22 additions & 3 deletions bento_lib/discovery/models/overview.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Literal
from typing import Annotated, Any, Literal

from geojson_pydantic import Feature, FeatureCollection, Polygon
from pydantic import BaseModel, Field, NonNegativeInt, RootModel, conlist
from pydantic import AfterValidator, BaseModel, Field, NonNegativeInt, RootModel, conlist

from ._internal import NoAdditionalProperties

Expand Down Expand Up @@ -53,20 +53,39 @@ class PieChart(BaseOverviewChart):
chart_type: Literal["pie"] = "pie"


class ColorModeStep(BaseModel):
step: float = Field(..., ge=0.0, le=0.0)
color: str


class ChoroplethColorModeContinuous(BaseModel, NoAdditionalProperties):
mode: Literal["continuous"] = "continuous"
min_color: str
max_color: str


def _steps_validator(value: list[ColorModeStep]) -> list[ColorModeStep]:
last_step: float | None = None
for v in value:
if last_step is not None and v.step <= last_step:
raise ValueError("color mode steps must be strictly increasing")
last_step = v.step
return value


class ChoroplethColorModeContinuousSteps(BaseModel, NoAdditionalProperties):
mode: Literal["continuous_steps"] = "continuous_steps"
steps: Annotated[list[ColorModeStep], AfterValidator(_steps_validator)] = Field(..., min_length=1)


# class ChoroplethColorModeDiscrete:
# mode: Literal["discrete"] = "discrete"
# # TODO: right now, needs a function, which we cannot support in JSON


class ChoroplethChart(BaseOverviewChart):
chart_type: Literal["choropleth"] = "choropleth"
color_mode: ChoroplethColorModeContinuous = Field(
color_mode: ChoroplethColorModeContinuous | ChoroplethColorModeContinuousSteps = Field(
discriminator="mode",
title="Color mode",
description=(
Expand Down
Loading