diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py index 3a730f2e5..7eaab77c1 100644 --- a/altair/utils/schemapi.py +++ b/altair/utils/schemapi.py @@ -4,6 +4,7 @@ import contextlib import copy +import datetime as dt import inspect import json import sys @@ -502,6 +503,34 @@ def _from_array_like(obj: Iterable[Any], /) -> list[Any]: return list(obj) +def _from_date_datetime(obj: dt.date | dt.datetime, /) -> dict[str, Any]: + """ + Parse native `datetime.(date|datetime)` into a `DateTime`_ schema. + + .. _DateTime: + https://vega.github.io/vega-lite/docs/datetime.html + """ + result: dict[str, Any] = {"year": obj.year, "month": obj.month, "date": obj.day} + if isinstance(obj, dt.datetime): + if obj.time() != dt.time.min: + us = obj.microsecond + ms = us if us == 0 else us // 1_000 + result.update( + hours=obj.hour, minutes=obj.minute, seconds=obj.second, milliseconds=ms + ) + if tzinfo := obj.tzinfo: + if tzinfo is dt.timezone.utc: + result["utc"] = True + else: + msg = ( + f"Unsupported timezone {tzinfo!r}.\n" + "Only `'UTC'` or naive (local) datetimes are permitted.\n" + "See https://altair-viz.github.io/user_guide/generated/core/altair.DateTime.html" + ) + raise TypeError(msg) + return result + + def _todict(obj: Any, context: dict[str, Any] | None, np_opt: Any, pd_opt: Any) -> Any: # noqa: C901 """Convert an object to a dict representation.""" if np_opt is not None: @@ -532,6 +561,8 @@ def _todict(obj: Any, context: dict[str, Any] | None, np_opt: Any, pd_opt: Any) return pd_opt.Timestamp(obj).isoformat() elif _is_iterable(obj, exclude=(str, bytes)): return _todict(_from_array_like(obj), context, np_opt, pd_opt) + elif isinstance(obj, dt.date): + return _from_date_datetime(obj) else: return obj diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py index b10fb88a4..d836615f9 100644 --- a/altair/vegalite/v5/api.py +++ b/altair/vegalite/v5/api.py @@ -9,6 +9,7 @@ import sys import typing as t import warnings +from collections.abc import Mapping, Sequence from copy import deepcopy as _deepcopy from typing import TYPE_CHECKING, Any, Literal, TypeVar, Union, overload @@ -30,7 +31,7 @@ from .data import data_transformers from .display import VEGA_VERSION, VEGAEMBED_VERSION, VEGALITE_VERSION, renderers from .schema import SCHEMA_URL, channels, core, mixins -from .schema._typing import Map +from .schema._typing import Map, PrimitiveValue_T, SingleDefUnitChannel_T, Temporal from .theme import themes if sys.version_info >= (3, 14): @@ -38,16 +39,24 @@ else: from typing_extensions import TypedDict if sys.version_info >= (3, 12): - from typing import Protocol, runtime_checkable + from typing import Protocol, TypeAliasType, runtime_checkable else: - from typing_extensions import Protocol, runtime_checkable # noqa: F401 + from typing_extensions import ( # noqa: F401 + Protocol, + TypeAliasType, + runtime_checkable, + ) +if sys.version_info >= (3, 11): + from typing import LiteralString +else: + from typing_extensions import LiteralString if sys.version_info >= (3, 10): from typing import TypeAlias else: from typing_extensions import TypeAlias if TYPE_CHECKING: - from collections.abc import Iterable, Iterator, Sequence + from collections.abc import Iterable, Iterator from pathlib import Path from typing import IO @@ -85,7 +94,6 @@ ResolveMode_T, SelectionResolution_T, SelectionType_T, - SingleDefUnitChannel_T, SingleTimeUnit_T, StackOffset_T, ) @@ -99,6 +107,7 @@ BindRadioSelect, BindRange, BinParams, + DateTime, Expr, ExprRef, FacetedEncoding, @@ -539,10 +548,8 @@ def check_fields_and_encodings(parameter: Parameter, field_name: str) -> bool: ``` """ -_LiteralValue: TypeAlias = Union[str, bool, float, int] -"""Primitive python value types.""" -_FieldEqualType: TypeAlias = Union[_LiteralValue, Map, Parameter, SchemaBase] +_FieldEqualType: TypeAlias = Union[PrimitiveValue_T, Map, Parameter, SchemaBase] """Permitted types for equality checks on field values: - `datum.field == ...` @@ -633,7 +640,7 @@ class _ConditionExtra(TypedDict, closed=True, total=False): # type: ignore[call param: Parameter | str test: _TestPredicateType value: Any - __extra_items__: _StatementType | OneOrSeq[_LiteralValue] + __extra_items__: _StatementType | OneOrSeq[PrimitiveValue_T] _Condition: TypeAlias = _ConditionExtra @@ -1436,9 +1443,63 @@ def selection(type: Optional[SelectionType_T] = Undefined, **kwds: Any) -> Param return _selection(type=type, **kwds) +_SelectionPointValue: TypeAlias = "PrimitiveValue_T | Temporal | DateTime | Sequence[Mapping[SingleDefUnitChannel_T | LiteralString, PrimitiveValue_T | Temporal | DateTime]]" +""" +Point selections can be initialized with a single primitive value: + + import altair as alt + + alt.selection_point(fields=["year"], value=1980) + + +You can also provide a sequence of mappings between ``encodings`` or ``fields`` to **values**: + + alt.selection_point( + fields=["cylinders", "year"], + value=[{"cylinders": 4, "year": 1981}, {"cylinders": 8, "year": 1972}], + ) +""" + +_SelectionIntervalValueMap: TypeAlias = Mapping[ + SingleDefUnitChannel_T, + Union[ + tuple[bool, bool], + tuple[float, float], + tuple[str, str], + tuple["Temporal | DateTime", "Temporal | DateTime"], + Sequence[bool], + Sequence[float], + Sequence[str], + Sequence["Temporal | DateTime"], + ], +] +""" +Interval selections are initialized with a mapping between ``encodings`` to **values**: + + import altair as alt + + alt.selection_interval( + encodings=["longitude"], + empty=False, + value={"longitude": [-50, -110]}, + ) + +The values specify the **start** and **end** of the interval selection. + +You can use a ``tuple`` for type-checking each sequence has **two** elements: + + alt.selection_interval(value={"x": (55, 160), "y": (13, 37)}) + + +.. note:: + + Unlike :func:`.selection_point()`, the use of ``None`` is not permitted. +""" + + def selection_interval( name: str | None = None, - value: Optional[Any] = Undefined, + value: Optional[_SelectionIntervalValueMap] = Undefined, bind: Optional[Binding | str] = Undefined, empty: Optional[bool] = Undefined, expr: Optional[str | Expr | Expression] = Undefined, @@ -1551,7 +1612,7 @@ def selection_interval( def selection_point( name: str | None = None, - value: Optional[Any] = Undefined, + value: Optional[_SelectionPointValue] = Undefined, bind: Optional[Binding | str] = Undefined, empty: Optional[bool] = Undefined, expr: Optional[Expr] = Undefined, diff --git a/altair/vegalite/v5/schema/_typing.py b/altair/vegalite/v5/schema/_typing.py index 4b9cacd8a..f4c0eaff0 100644 --- a/altair/vegalite/v5/schema/_typing.py +++ b/altair/vegalite/v5/schema/_typing.py @@ -6,6 +6,7 @@ import re import sys from collections.abc import Mapping, Sequence +from datetime import date, datetime from typing import Annotated, Any, Generic, Literal, TypeVar, Union, get_args if sys.version_info >= (3, 14): # https://peps.python.org/pep-0728/ @@ -87,6 +88,7 @@ "StepFor_T", "StrokeCap_T", "StrokeJoin_T", + "Temporal", "TextBaseline_T", "TextDirection_T", "TimeInterval_T", @@ -198,6 +200,8 @@ class PaddingKwds(TypedDict, total=False): top: float +Temporal: TypeAlias = Union[date, datetime] + VegaThemes: TypeAlias = Literal[ "carbong10", "carbong100", diff --git a/altair/vegalite/v5/schema/channels.py b/altair/vegalite/v5/schema/channels.py index 35eb04b63..011dbe6f6 100644 --- a/altair/vegalite/v5/schema/channels.py +++ b/altair/vegalite/v5/schema/channels.py @@ -651,7 +651,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -673,12 +673,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -844,7 +850,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -1074,7 +1080,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -1092,7 +1098,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -1117,7 +1125,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -1134,7 +1142,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -1573,7 +1583,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -1595,12 +1605,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -1766,7 +1782,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -1999,7 +2015,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -2017,7 +2033,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -2042,7 +2060,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -2059,7 +2077,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -2540,7 +2560,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | SortOrder_T | None @@ -2993,7 +3013,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -3011,7 +3031,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -3036,7 +3058,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -3053,7 +3075,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -3918,7 +3942,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | SortOrder_T | None @@ -4349,7 +4373,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -4371,12 +4395,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -4542,7 +4572,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -4775,7 +4805,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -4793,7 +4823,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -4818,7 +4850,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -4835,7 +4867,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -5273,7 +5307,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -5295,12 +5329,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -5466,7 +5506,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -5698,7 +5738,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -5716,7 +5756,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -5741,7 +5783,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -5758,7 +5800,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -6221,7 +6265,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -6239,7 +6283,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -6264,7 +6310,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -6281,7 +6327,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -8641,7 +8689,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -8663,12 +8711,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -8834,7 +8888,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -9064,7 +9118,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -9082,7 +9136,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -9107,7 +9163,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -9124,7 +9180,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -9841,12 +9899,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -10019,7 +10083,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -10210,12 +10274,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -11130,7 +11200,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | SortOrder_T | None @@ -11559,7 +11629,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -11581,12 +11651,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -11752,7 +11828,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -11985,7 +12061,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -12003,7 +12079,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -12028,7 +12106,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -12045,7 +12123,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -12481,7 +12561,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -12503,12 +12583,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -12674,7 +12760,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -12904,7 +12990,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -12922,7 +13008,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -12947,7 +13035,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -12964,7 +13052,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -13403,7 +13493,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -13425,12 +13515,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -13596,7 +13692,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -13829,7 +13925,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -13847,7 +13943,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -13872,7 +13970,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -13889,7 +13987,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -14327,7 +14427,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -14349,12 +14449,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -14520,7 +14626,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -14752,7 +14858,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -14770,7 +14876,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -14795,7 +14903,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -14812,7 +14920,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -15250,7 +15360,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -15272,12 +15382,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -15443,7 +15559,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -15675,7 +15791,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -15693,7 +15809,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -15718,7 +15836,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -15735,7 +15853,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -16173,7 +16293,7 @@ def legend( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -16195,12 +16315,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -16366,7 +16492,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -16598,7 +16724,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -16616,7 +16742,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -16641,7 +16769,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -16658,7 +16786,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -17688,12 +17818,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -17866,7 +18002,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -18057,12 +18193,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -18959,7 +19101,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -18977,7 +19119,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -19002,7 +19146,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -19019,7 +19163,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -19482,7 +19628,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -19500,7 +19646,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, test: Optional[str | SchemaBase | Map] = Undefined, @@ -19525,7 +19673,7 @@ def condition( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -19542,7 +19690,9 @@ def condition( def condition( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, empty: Optional[bool] = Undefined, legend: Optional[SchemaBase | Map | None] = Undefined, param: Optional[str | SchemaBase] = Undefined, @@ -19962,7 +20112,7 @@ def axis( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -20035,12 +20185,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -20215,7 +20371,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -20521,7 +20677,7 @@ def axis( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -20559,12 +20715,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -21805,12 +21967,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -21974,7 +22142,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -22133,12 +22301,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -22602,7 +22776,7 @@ def axis( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -22675,12 +22849,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -22855,7 +23035,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -23161,7 +23341,7 @@ def axis( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -23199,12 +23379,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -24445,12 +24631,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -24614,7 +24806,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -24773,12 +24965,18 @@ def scale( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ diff --git a/altair/vegalite/v5/schema/core.py b/altair/vegalite/v5/schema/core.py index a9fa8e2fd..17ba53d10 100644 --- a/altair/vegalite/v5/schema/core.py +++ b/altair/vegalite/v5/schema/core.py @@ -1725,7 +1725,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -2302,7 +2302,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -5647,7 +5647,7 @@ class DomainUnionWith(VegaLiteSchema): def __init__( self, unionWith: Optional[ - Sequence[str | bool | float | SchemaBase | Map] + Sequence[str | bool | float | Temporal | SchemaBase | Map] ] = Undefined, **kwds, ): @@ -6599,7 +6599,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | SortOrder_T | None @@ -6825,7 +6825,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | SortOrder_T | None @@ -9728,7 +9728,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map ] = Undefined, zindex: Optional[float] = Undefined, @@ -12469,7 +12469,9 @@ def __init__( self, bandPosition: Optional[float] = Undefined, condition: Optional[SchemaBase | Sequence[SchemaBase | Map] | Map] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, type: Optional[SchemaBase | Type_T] = Undefined, **kwds, @@ -12725,7 +12727,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -13117,7 +13119,9 @@ def __init__( self, bandPosition: Optional[float] = Undefined, condition: Optional[SchemaBase | Sequence[SchemaBase | Map] | Map] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, type: Optional[SchemaBase | Type_T] = Undefined, **kwds, @@ -13373,7 +13377,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -13524,7 +13528,9 @@ def __init__( self, bandPosition: Optional[float] = Undefined, condition: Optional[SchemaBase | Sequence[SchemaBase | Map] | Map] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, type: Optional[SchemaBase | Type_T] = Undefined, **kwds, @@ -13780,7 +13786,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -15157,7 +15163,9 @@ class DatumDef(LatLongDef, Position2Def): def __init__( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, type: Optional[SchemaBase | Type_T] = Undefined, **kwds, @@ -15315,7 +15323,9 @@ class PositionDatumDefBase(PolarDef): def __init__( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, stack: Optional[bool | SchemaBase | StackOffset_T | None] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, @@ -15508,7 +15518,9 @@ def __init__( self, axis: Optional[SchemaBase | Map | None] = Undefined, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, impute: Optional[SchemaBase | Map | None] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, stack: Optional[bool | SchemaBase | StackOffset_T | None] = Undefined, @@ -15797,7 +15809,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -16077,7 +16089,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -16217,7 +16229,9 @@ class FieldEqualPredicate(Predicate): def __init__( self, - equal: Optional[str | bool | float | Parameter | SchemaBase | Map] = Undefined, + equal: Optional[ + str | bool | float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, field: Optional[str | SchemaBase] = Undefined, timeUnit: Optional[ SchemaBase | Map | MultiTimeUnit_T | BinnedTimeUnit_T | SingleTimeUnit_T @@ -16246,7 +16260,9 @@ class FieldGTEPredicate(Predicate): def __init__( self, field: Optional[str | SchemaBase] = Undefined, - gte: Optional[str | float | Parameter | SchemaBase | Map] = Undefined, + gte: Optional[ + str | float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, timeUnit: Optional[ SchemaBase | Map | MultiTimeUnit_T | BinnedTimeUnit_T | SingleTimeUnit_T ] = Undefined, @@ -16274,7 +16290,7 @@ class FieldGTPredicate(Predicate): def __init__( self, field: Optional[str | SchemaBase] = Undefined, - gt: Optional[str | float | Parameter | SchemaBase | Map] = Undefined, + gt: Optional[str | float | Temporal | Parameter | SchemaBase | Map] = Undefined, timeUnit: Optional[ SchemaBase | Map | MultiTimeUnit_T | BinnedTimeUnit_T | SingleTimeUnit_T ] = Undefined, @@ -16302,7 +16318,9 @@ class FieldLTEPredicate(Predicate): def __init__( self, field: Optional[str | SchemaBase] = Undefined, - lte: Optional[str | float | Parameter | SchemaBase | Map] = Undefined, + lte: Optional[ + str | float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, timeUnit: Optional[ SchemaBase | Map | MultiTimeUnit_T | BinnedTimeUnit_T | SingleTimeUnit_T ] = Undefined, @@ -16330,7 +16348,7 @@ class FieldLTPredicate(Predicate): def __init__( self, field: Optional[str | SchemaBase] = Undefined, - lt: Optional[str | float | Parameter | SchemaBase | Map] = Undefined, + lt: Optional[str | float | Temporal | Parameter | SchemaBase | Map] = Undefined, timeUnit: Optional[ SchemaBase | Map | MultiTimeUnit_T | BinnedTimeUnit_T | SingleTimeUnit_T ] = Undefined, @@ -16363,7 +16381,7 @@ def __init__( Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] ] = Undefined, timeUnit: Optional[ SchemaBase | Map | MultiTimeUnit_T | BinnedTimeUnit_T | SingleTimeUnit_T @@ -16396,7 +16414,7 @@ def __init__( range: Optional[ Parameter | SchemaBase - | Sequence[float | Parameter | SchemaBase | Map | None] + | Sequence[float | Temporal | Parameter | SchemaBase | Map | None] | Map ] = Undefined, timeUnit: Optional[ @@ -17974,7 +17992,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | SortOrder_T | None @@ -18278,12 +18296,18 @@ def __init__( Parameter | SchemaBase | Literal["unaggregated"] - | Sequence[str | bool | float | Parameter | SchemaBase | Map | None] + | Sequence[ + str | bool | float | Temporal | Parameter | SchemaBase | Map | None + ] | Map ] = Undefined, - domainMax: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMax: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainMid: Optional[float | Parameter | SchemaBase | Map] = Undefined, - domainMin: Optional[float | Parameter | SchemaBase | Map] = Undefined, + domainMin: Optional[ + float | Temporal | Parameter | SchemaBase | Map + ] = Undefined, domainRaw: Optional[Parameter | SchemaBase | Map] = Undefined, exponent: Optional[float | Parameter | SchemaBase | Map] = Undefined, interpolate: Optional[ @@ -18729,7 +18753,9 @@ class ScaleDatumDef(OffsetDef): def __init__( self, bandPosition: Optional[float] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, scale: Optional[SchemaBase | Map | None] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, type: Optional[SchemaBase | Type_T] = Undefined, @@ -18964,7 +18990,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -20058,7 +20084,7 @@ def __init__( select: Optional[SchemaBase | Map | SelectionType_T] = Undefined, bind: Optional[SchemaBase | Literal["legend", "scales"] | Map] = Undefined, value: Optional[ - SchemaBase | Sequence[SchemaBase | Map] | Map | PrimitiveValue_T + Temporal | SchemaBase | Sequence[SchemaBase | Map] | Map | PrimitiveValue_T ] = Undefined, **kwds, ): @@ -20282,7 +20308,9 @@ def __init__( self, bandPosition: Optional[float] = Undefined, condition: Optional[SchemaBase | Sequence[SchemaBase | Map] | Map] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, type: Optional[SchemaBase | Type_T] = Undefined, **kwds, @@ -20538,7 +20566,7 @@ def __init__( | Sequence[str] | Sequence[bool] | Sequence[float] - | Sequence[SchemaBase | Map] + | Sequence[Temporal | SchemaBase | Map] | Map | AllSortString_T | None @@ -22749,7 +22777,9 @@ def __init__( self, bandPosition: Optional[float] = Undefined, condition: Optional[SchemaBase | Sequence[SchemaBase | Map] | Map] = Undefined, - datum: Optional[Parameter | SchemaBase | Map | PrimitiveValue_T] = Undefined, + datum: Optional[ + Temporal | Parameter | SchemaBase | Map | PrimitiveValue_T + ] = Undefined, format: Optional[str | SchemaBase | Map] = Undefined, formatType: Optional[str] = Undefined, title: Optional[str | SchemaBase | Sequence[str] | None] = Undefined, @@ -24205,7 +24235,7 @@ def __init__( select: Optional[SchemaBase | Map | SelectionType_T] = Undefined, bind: Optional[SchemaBase | Literal["legend", "scales"] | Map] = Undefined, value: Optional[ - SchemaBase | Sequence[SchemaBase | Map] | Map | PrimitiveValue_T + Temporal | SchemaBase | Sequence[SchemaBase | Map] | Map | PrimitiveValue_T ] = Undefined, views: Optional[Sequence[str]] = Undefined, **kwds, diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py index d369ab29b..fa5e83aff 100644 --- a/tests/utils/test_schemapi.py +++ b/tests/utils/test_schemapi.py @@ -2,6 +2,7 @@ from __future__ import annotations import copy +import datetime as dt import inspect import io import json @@ -1024,3 +1025,138 @@ def test_to_dict_range(tp) -> None: x_dict = alt.X("x:O", sort=tp(0, 5)).to_dict() actual = x_dict["sort"] # type: ignore assert actual == expected + + +@pytest.fixture +def stocks() -> alt.Chart: + source = "https://cdn.jsdelivr.net/npm/vega-datasets@v1.29.0/data/sp500.csv" + return alt.Chart(source).mark_area().encode(x="date:T", y="price:Q") + + +def DateTime( + year: int, + month: int, + day: int, + hour: int = 0, + minute: int = 0, + second: int = 0, + milliseconds: int = 0, + *, + utc: bool | None = None, +) -> alt.DateTime: + """Factory for positionally aligning `datetime.datetime`/ `alt.DateTime`.""" + kwds: dict[str, Any] = {} + if utc is True: + kwds.update(utc=utc) + if (hour, minute, second, milliseconds) != (0, 0, 0, 0): + kwds.update( + hours=hour, minutes=minute, seconds=second, milliseconds=milliseconds + ) + return alt.DateTime(year=year, month=month, date=day, **kwds) + + +@pytest.mark.parametrize( + ("window", "expected"), + [ + ( + (dt.date(2005, 1, 1), dt.date(2009, 1, 1)), + (DateTime(2005, 1, 1), DateTime(2009, 1, 1)), + ), + ( + (dt.datetime(2005, 1, 1), dt.datetime(2009, 1, 1)), + ( + # NOTE: Keep this to test truncating independently! + alt.DateTime(year=2005, month=1, date=1), + alt.DateTime(year=2009, month=1, date=1), + ), + ), + ( + ( + dt.datetime(2001, 1, 1, 9, 30, 0, 2999), + dt.datetime(2002, 1, 1, 17, 0, 0, 5000), + ), + ( + DateTime(2001, 1, 1, 9, 30, 0, 2), + DateTime(2002, 1, 1, 17, 0, 0, 5), + ), + ), + ( + ( + dt.datetime(2003, 5, 1, 1, 30, tzinfo=dt.timezone.utc), + dt.datetime(2003, 6, 3, 4, 3, tzinfo=dt.timezone.utc), + ), + ( + DateTime(2003, 5, 1, 1, 30, 0, 0, utc=True), + DateTime(2003, 6, 3, 4, 3, 0, 0, utc=True), + ), + ), + ], + ids=["date", "datetime (no time)", "datetime (microseconds)", "datetime (UTC)"], +) +def test_to_dict_datetime( + stocks, window: tuple[dt.date, dt.date], expected: tuple[alt.DateTime, alt.DateTime] +) -> None: + """ + Includes `datetime.datetime` with an empty time component. + + This confirms that conversion matches how `alt.DateTime` omits `Undefined`. + """ + expected_dicts = [e.to_dict() for e in expected] + brush = alt.selection_interval(encodings=["x"], value={"x": window}) + base = stocks + + upper = base.encode(alt.X("date:T").scale(domain=brush)) + lower = base.add_params(brush) + chart = upper & lower + mapping = chart.to_dict() + params_value = mapping["params"][0]["value"]["x"] + + assert isinstance(params_value, list) + assert params_value == expected_dicts + + +@pytest.mark.parametrize( + "tzinfo", + [ + dt.timezone(dt.timedelta(hours=2), "UTC+2"), + dt.timezone(dt.timedelta(hours=1), "BST"), + dt.timezone(dt.timedelta(hours=-7), "pdt"), + dt.timezone(dt.timedelta(hours=-3), "BRT"), + dt.timezone(dt.timedelta(hours=9), "UTC"), + dt.timezone(dt.timedelta(minutes=60), "utc"), + ], +) +def test_to_dict_datetime_unsupported_timezone(tzinfo: dt.timezone) -> None: + datetime = dt.datetime(2003, 5, 1, 1, 30) + + result = alt.FieldEqualPredicate(datetime, "column 1") + assert result.to_dict() + + with pytest.raises(TypeError, match=r"Unsupported timezone.+\n.+UTC.+local"): + alt.FieldEqualPredicate(datetime.replace(tzinfo=tzinfo), "column 1") + + +def test_to_dict_datetime_typing() -> None: + """ + Enumerating various places that need updated annotations. + + All work at runtime, just need to give the type checkers the new info. + + Sub-issue of https://github.com/vega/altair/issues/3650 + """ + datetime = dt.datetime(2003, 5, 1, 1, 30) + datetime_seq = [datetime, datetime.replace(2005), datetime.replace(2008)] + assert alt.FieldEqualPredicate(datetime, field="column 1") + assert alt.FieldOneOfPredicate(oneOf=datetime_seq, field="column 1") + + assert alt.Legend(values=datetime_seq) + + assert alt.Scale(domain=datetime_seq) + assert alt.Scale(domainMin=datetime_seq[0], domainMax=datetime_seq[2]) + + # NOTE: `datum` is not annotated? + assert alt.XDatum(datum=datetime).to_dict() + + # NOTE: `*args` is not annotated? + # - All of these uses *args incorrectly + assert alt.Vector2DateTime(datetime_seq[:2]) diff --git a/tests/vegalite/v5/test_params.py b/tests/vegalite/v5/test_params.py index a5ea3c001..d380586a8 100644 --- a/tests/vegalite/v5/test_params.py +++ b/tests/vegalite/v5/test_params.py @@ -167,6 +167,40 @@ def test_selection_condition(): assert dct["encoding"]["size"]["value"] == 10 +def test_selection_interval_value_typing() -> None: + """Ensure each encoding restricts types independently.""" + import datetime as dt + + w_date = dt.date(2005, 1, 1), dt.date(2009, 1, 1) + w_float = (0, 999) + w_date_datetime = dt.date(2005, 1, 1), alt.DateTime(year=2009) + w_str = ["0", "500"] + + a = alt.selection_interval(encodings=["x"], value={"x": w_date}).to_dict() + b = alt.selection_interval(encodings=["y"], value={"y": w_float}).to_dict() + c = alt.selection_interval(encodings=["x"], value={"x": w_date_datetime}).to_dict() + d = alt.selection_interval(encodings=["text"], value={"text": w_str}).to_dict() + + a_b = alt.selection_interval( + encodings=["x", "y"], value={"x": w_date, "y": w_float} + ).to_dict() + a_c = alt.selection_interval( + encodings=["x", "y"], value={"x": w_date, "y": w_date_datetime} + ).to_dict() + b_c_d = alt.selection_interval( + encodings=["x", "y", "text"], + value={"x": w_date_datetime, "y": w_float, "text": w_str}, + ).to_dict() + + assert a + assert b + assert c + assert d + assert a_b + assert a_c + assert b_c_d + + def test_creation_views_params_layered_repeat_chart(): import altair as alt from vega_datasets import data diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py index bf42cdf96..8787508ca 100644 --- a/tools/generate_schema_wrapper.py +++ b/tools/generate_schema_wrapper.py @@ -255,6 +255,7 @@ class {name}(TypedDict{metaclass_kwds}):{comment} THEME_CONFIG: Literal["ThemeConfig"] = "ThemeConfig" PADDING_KWDS: Literal["PaddingKwds"] = "PaddingKwds" ROW_COL_KWDS: Literal["RowColKwds"] = "RowColKwds" +TEMPORAL: Literal["Temporal"] = "Temporal" ENCODE_KWDS_SUMMARY: Final = ( "Encoding channels map properties of the data to visual properties of the chart." ) @@ -392,6 +393,8 @@ class PaddingKwds(TypedDict, total=False): left: float right: float top: float + +Temporal: TypeAlias = Union[date, datetime] ''' _ChannelType = Literal["field", "datum", "value"] @@ -667,6 +670,7 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> str: "from narwhals.dependencies import is_pandas_dataframe as _is_pandas_dataframe", "from altair.utils.schemapi import SchemaBase, Undefined, UndefinedType, _subclasses # noqa: F401\n", import_type_checking( + "from datetime import date, datetime", "from altair import Parameter", "from altair.typing import Optional", "from ._typing import * # noqa: F403", @@ -792,6 +796,7 @@ def generate_vegalite_channel_wrappers(fp: Path, /) -> str: CHANNEL_MYPY_IGNORE_STATEMENTS, *imports, import_type_checking( + "from datetime import date, datetime", "from altair import Parameter, SchemaBase", "from altair.typing import Optional", f"from altair.vegalite.v5.api import {INTO_CONDITION}", @@ -1102,6 +1107,7 @@ def vegalite_main(skip_download: bool = False) -> None: "is_color_hex", ROW_COL_KWDS, PADDING_KWDS, + TEMPORAL, header=HEADER, extra=TYPING_EXTRA, ) diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py index bf08994bd..b41c61a85 100644 --- a/tools/schemapi/schemapi.py +++ b/tools/schemapi/schemapi.py @@ -2,6 +2,7 @@ import contextlib import copy +import datetime as dt import inspect import json import sys @@ -500,6 +501,34 @@ def _from_array_like(obj: Iterable[Any], /) -> list[Any]: return list(obj) +def _from_date_datetime(obj: dt.date | dt.datetime, /) -> dict[str, Any]: + """ + Parse native `datetime.(date|datetime)` into a `DateTime`_ schema. + + .. _DateTime: + https://vega.github.io/vega-lite/docs/datetime.html + """ + result: dict[str, Any] = {"year": obj.year, "month": obj.month, "date": obj.day} + if isinstance(obj, dt.datetime): + if obj.time() != dt.time.min: + us = obj.microsecond + ms = us if us == 0 else us // 1_000 + result.update( + hours=obj.hour, minutes=obj.minute, seconds=obj.second, milliseconds=ms + ) + if tzinfo := obj.tzinfo: + if tzinfo is dt.timezone.utc: + result["utc"] = True + else: + msg = ( + f"Unsupported timezone {tzinfo!r}.\n" + "Only `'UTC'` or naive (local) datetimes are permitted.\n" + "See https://altair-viz.github.io/user_guide/generated/core/altair.DateTime.html" + ) + raise TypeError(msg) + return result + + def _todict(obj: Any, context: dict[str, Any] | None, np_opt: Any, pd_opt: Any) -> Any: # noqa: C901 """Convert an object to a dict representation.""" if np_opt is not None: @@ -530,6 +559,8 @@ def _todict(obj: Any, context: dict[str, Any] | None, np_opt: Any, pd_opt: Any) return pd_opt.Timestamp(obj).isoformat() elif _is_iterable(obj, exclude=(str, bytes)): return _todict(_from_array_like(obj), context, np_opt, pd_opt) + elif isinstance(obj, dt.date): + return _from_date_datetime(obj) else: return obj diff --git a/tools/schemapi/utils.py b/tools/schemapi/utils.py index cb3fbfc64..8358a4f38 100644 --- a/tools/schemapi/utils.py +++ b/tools/schemapi/utils.py @@ -117,6 +117,7 @@ def __init__(self, fmt: str = "{}_T") -> None: self._imports: Sequence[str] = ( "from __future__ import annotations\n", "import sys", + "from datetime import date, datetime", "from typing import Annotated, Any, Generic, Literal, Mapping, TypeVar, Sequence, Union, get_args", "import re", import_typing_extensions( @@ -563,6 +564,8 @@ def title_to_type_reprs(self, *, use_concrete: bool) -> set[str]: # NOTE: To keep type hints simple, we annotate with `SchemaBase` for all subclasses. if title in tp_param: tps.add("Parameter") + if self.is_datetime(): + tps.add("Temporal") elif self.is_value(): value = self.properties["value"] t = value.to_type_repr(target="annotation", use_concrete=use_concrete) @@ -841,6 +844,9 @@ def is_theme_config_target(self) -> bool: and not (iskeyword(next(iter(self.required), ""))) ) + def is_datetime(self) -> bool: + return self.refname == "DateTime" + def flatten(container: Iterable) -> Iterable: """