From fef34887e7b7ae6ed44d5bfc914feee6e9b1bec9 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 30 Oct 2024 12:11:35 +0000
Subject: [PATCH 01/53] docs(typing): Fix inaccurate `selection_interval`
signature (#3662)
---
altair/vegalite/v5/api.py | 35 ++++++++++++++++++-----------------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index d836615f9..93d0b0516 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -80,6 +80,7 @@
)
from altair.utils.display import MimeBundleType
+ from .schema._config import BrushConfigKwds, DerivedStreamKwds, MergedStreamKwds
from .schema._typing import (
AggregateOp_T,
AutosizeType_T,
@@ -107,6 +108,7 @@
BindRadioSelect,
BindRange,
BinParams,
+ BrushConfig,
DateTime,
Expr,
ExprRef,
@@ -122,7 +124,6 @@
JoinAggregateFieldDef,
LayerRepeatMapping,
LookupSelection,
- Mark,
NamedData,
ParameterName,
PointSelectionConfig,
@@ -1503,11 +1504,11 @@ def selection_interval(
bind: Optional[Binding | str] = Undefined,
empty: Optional[bool] = Undefined,
expr: Optional[str | Expr | Expression] = Undefined,
- encodings: Optional[list[SingleDefUnitChannel_T]] = Undefined,
- on: Optional[str] = Undefined,
- clear: Optional[str | bool] = Undefined,
+ encodings: Optional[Sequence[SingleDefUnitChannel_T]] = Undefined,
+ on: Optional[str | MergedStreamKwds | DerivedStreamKwds] = Undefined,
+ clear: Optional[str | bool | MergedStreamKwds | DerivedStreamKwds] = Undefined,
resolve: Optional[SelectionResolution_T] = Undefined,
- mark: Optional[Mark] = Undefined,
+ mark: Optional[BrushConfig | BrushConfigKwds] = Undefined,
translate: Optional[str | bool] = Undefined,
zoom: Optional[str | bool] = Undefined,
**kwds: Any,
@@ -1517,16 +1518,16 @@ def selection_interval(
Parameters
----------
- name : string (optional)
+ name : str (optional)
The name of the parameter. If not specified, a unique name will be
created.
- value : any (optional)
+ value : Any (optional)
The default value of the parameter. If not specified, the parameter
will be created without a default value.
bind : :class:`Binding`, str (optional)
Binds the parameter to an external input element such as a slider,
selection list or radio button group.
- empty : boolean (optional)
+ empty : bool (optional)
For selection parameters, the predicate of empty selections returns
True by default. Override this behavior, by setting this property
'empty=False'.
@@ -1534,16 +1535,16 @@ def selection_interval(
An expression for the value of the parameter. This expression may
include other parameters, in which case the parameter will
automatically update in response to upstream parameter changes.
- encodings : List[str] (optional)
+ encodings : Sequence[str] (optional)
A list of encoding channels. The corresponding data field values
must match for a data tuple to fall within the selection.
- on : string (optional)
+ on : str (optional)
A Vega event stream (object or selector) that triggers the selection.
For interval selections, the event stream must specify a start and end.
- clear : string or boolean (optional)
+ clear : str, bool (optional)
Clears the selection, emptying it of all values. This property can
be an Event Stream or False to disable clear. Default is 'dblclick'.
- resolve : enum('global', 'union', 'intersect') (optional)
+ resolve : Literal['global', 'union', 'intersect'] (optional)
With layered and multi-view displays, a strategy that determines
how selections' data queries are resolved when applied in a filter
transform, conditional encoding rule, or scale domain.
@@ -1559,11 +1560,11 @@ def selection_interval(
brushes.
The default is 'global'.
- mark : :class:`Mark` (optional)
+ mark : :class:`BrushConfig` (optional)
An interval selection also adds a rectangle mark to depict the
- extents of the interval. The mark property can be used to
+ extents of the interval. The ``mark`` property can be used to
customize the appearance of the mark.
- translate : string or boolean (optional)
+ translate : str, bool (optional)
When truthy, allows a user to interactively move an interval
selection back-and-forth. Can be True, False (to disable panning),
or a Vega event stream definition which must include a start and
@@ -1574,7 +1575,7 @@ def selection_interval(
[pointerdown, window:pointerup] > window:pointermove!
This default allows users to click and drag within an interval
selection to reposition it.
- zoom : string or boolean (optional)
+ zoom : str, bool (optional)
When truthy, allows a user to interactively resize an interval
selection. Can be True, False (to disable zooming), or a Vega
event stream definition. Currently, only wheel events are supported,
@@ -1584,7 +1585,7 @@ def selection_interval(
The default value is True, which corresponds to wheel!. This
default allows users to use the mouse wheel to resize an interval
selection.
- **kwds :
+ **kwds : Any
Additional keywords to control the selection.
Returns
From 74d58f0fbe5336d01e8491cf64941e0bbc7658b4 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 30 Oct 2024 12:38:24 +0000
Subject: [PATCH 02/53] docs(typing): Update `selection_point` signature
(#3663)
---
altair/vegalite/v5/api.py | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index 93d0b0516..a3070acbf 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -1616,11 +1616,11 @@ def selection_point(
value: Optional[_SelectionPointValue] = Undefined,
bind: Optional[Binding | str] = Undefined,
empty: Optional[bool] = Undefined,
- expr: Optional[Expr] = Undefined,
- encodings: Optional[list[SingleDefUnitChannel_T]] = Undefined,
- fields: Optional[list[str]] = Undefined,
- on: Optional[str] = Undefined,
- clear: Optional[str | bool] = Undefined,
+ expr: Optional[str | Expr | Expression] = Undefined,
+ encodings: Optional[Sequence[SingleDefUnitChannel_T]] = Undefined,
+ fields: Optional[Sequence[str]] = Undefined,
+ on: Optional[str | MergedStreamKwds | DerivedStreamKwds] = Undefined,
+ clear: Optional[str | bool | MergedStreamKwds | DerivedStreamKwds] = Undefined,
resolve: Optional[SelectionResolution_T] = Undefined,
toggle: Optional[str | bool] = Undefined,
nearest: Optional[bool] = Undefined,
@@ -1631,16 +1631,16 @@ def selection_point(
Parameters
----------
- name : string (optional)
+ name : str (optional)
The name of the parameter. If not specified, a unique name will be
created.
- value : any (optional)
+ value : Any (optional)
The default value of the parameter. If not specified, the parameter
will be created without a default value.
bind : :class:`Binding`, str (optional)
Binds the parameter to an external input element such as a slider,
selection list or radio button group.
- empty : boolean (optional)
+ empty : bool (optional)
For selection parameters, the predicate of empty selections returns
True by default. Override this behavior, by setting this property
'empty=False'.
@@ -1648,19 +1648,19 @@ def selection_point(
An expression for the value of the parameter. This expression may
include other parameters, in which case the parameter will
automatically update in response to upstream parameter changes.
- encodings : List[str] (optional)
+ encodings : Sequence[str] (optional)
A list of encoding channels. The corresponding data field values
must match for a data tuple to fall within the selection.
- fields : List[str] (optional)
+ fields : Sequence[str] (optional)
A list of field names whose values must match for a data tuple to
fall within the selection.
- on : string (optional)
+ on : str (optional)
A Vega event stream (object or selector) that triggers the selection.
For interval selections, the event stream must specify a start and end.
- clear : string or boolean (optional)
+ clear : str, bool (optional)
Clears the selection, emptying it of all values. This property can
be an Event Stream or False to disable clear. Default is 'dblclick'.
- resolve : enum('global', 'union', 'intersect') (optional)
+ resolve : Literal['global', 'union', 'intersect'] (optional)
With layered and multi-view displays, a strategy that determines
how selections' data queries are resolved when applied in a filter
transform, conditional encoding rule, or scale domain.
@@ -1676,7 +1676,7 @@ def selection_point(
brushes.
The default is 'global'.
- toggle : string or boolean (optional)
+ toggle : str, bool (optional)
Controls whether data values should be toggled (inserted or
removed from a point selection) or only ever inserted into
point selections.
@@ -1696,13 +1696,13 @@ def selection_point(
value to the Vega expression True will toggle data values
without the user pressing the shift-key.
- nearest : boolean (optional)
+ nearest : bool (optional)
When true, an invisible voronoi diagram is computed to accelerate
discrete selection. The data value nearest the mouse cursor is
added to the selection. The default is False, which means that
data values must be interacted with directly (e.g., clicked on)
to be added to the selection.
- **kwds :
+ **kwds : Any
Additional keywords to control the selection.
Returns
From 64c1e09719c1506620da4d5f4b8341d8b2a3386a Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 30 Oct 2024 13:12:39 +0000
Subject: [PATCH 03/53] feat: Support `datetime.(date|datetime)` in
`Expression`(s) (#3654)
---
altair/expr/core.py | 48 ++++++++++++++++++++++++++++++++++++++---
tests/expr/test_expr.py | 41 +++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+), 3 deletions(-)
diff --git a/altair/expr/core.py b/altair/expr/core.py
index 429766b8a..cb89391f4 100644
--- a/altair/expr/core.py
+++ b/altair/expr/core.py
@@ -1,10 +1,20 @@
from __future__ import annotations
-from typing import Any, Union
-from typing_extensions import TypeAlias
+import datetime as dt
+from typing import TYPE_CHECKING, Any, Literal, Union
from altair.utils import SchemaBase
+if TYPE_CHECKING:
+ import sys
+
+ from altair.vegalite.v5.schema._typing import Map, PrimitiveValue_T
+
+ if sys.version_info >= (3, 10):
+ from typing import TypeAlias
+ else:
+ from typing_extensions import TypeAlias
+
class DatumType:
"""An object to assist in building Vega-Lite Expressions."""
@@ -38,10 +48,40 @@ def _js_repr(val) -> str:
return "null"
elif isinstance(val, OperatorMixin):
return val._to_expr()
+ elif isinstance(val, dt.date):
+ return _from_date_datetime(val)
else:
return repr(val)
+def _from_date_datetime(obj: dt.date | dt.datetime, /) -> str:
+ """
+ Parse native `datetime.(date|datetime)` into a `datetime expression`_ string.
+
+ **Month is 0-based**
+
+ .. _datetime expression:
+ https://vega.github.io/vega/docs/expressions/#datetime
+ """
+ fn_name: Literal["datetime", "utc"] = "datetime"
+ args: tuple[int, ...] = obj.year, obj.month - 1, obj.day
+ if isinstance(obj, dt.datetime):
+ if tzinfo := obj.tzinfo:
+ if tzinfo is dt.timezone.utc:
+ fn_name = "utc"
+ 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)
+ us = obj.microsecond
+ ms = us if us == 0 else us // 1_000
+ args = *args, obj.hour, obj.minute, obj.second, ms
+ return FunctionExpression(fn_name, args)._to_expr()
+
+
# Designed to work with Expression and VariableParameter
class OperatorMixin:
def _to_expr(self) -> str:
@@ -237,4 +277,6 @@ def __repr__(self) -> str:
return f"{self.group}[{self.name!r}]"
-IntoExpression: TypeAlias = Union[bool, None, str, float, OperatorMixin, dict[str, Any]]
+IntoExpression: TypeAlias = Union[
+ "PrimitiveValue_T", dt.date, dt.datetime, OperatorMixin, "Map"
+]
diff --git a/tests/expr/test_expr.py b/tests/expr/test_expr.py
index 15757b09f..b2200184c 100644
--- a/tests/expr/test_expr.py
+++ b/tests/expr/test_expr.py
@@ -1,5 +1,6 @@
from __future__ import annotations
+import datetime as dt
import operator
import sys
from inspect import classify_class_attrs, getmembers, signature
@@ -188,3 +189,43 @@ def test_expression_function_nostring():
with pytest.raises(ValidationError):
expr(["foo", "bah"]) # pyright: ignore
+
+
+@pytest.mark.parametrize(
+ ("value", "expected"),
+ [
+ (dt.date(2000, 1, 1), "datetime(2000,0,1)"),
+ (dt.datetime(2000, 1, 1), "datetime(2000,0,1,0,0,0,0)"),
+ (dt.datetime(2001, 1, 1, 9, 30, 0, 2999), "datetime(2001,0,1,9,30,0,2)"),
+ (
+ dt.datetime(2003, 5, 1, 1, 30, tzinfo=dt.timezone.utc),
+ "utc(2003,4,1,1,30,0,0)",
+ ),
+ ],
+ ids=["date", "datetime (no time)", "datetime (microseconds)", "datetime (UTC)"],
+)
+def test_expr_datetime(value: Any, expected: str) -> None:
+ r_datum = datum.date >= value
+ assert isinstance(r_datum, Expression)
+ assert repr(r_datum) == f"(datum.date >= {expected})"
+
+
+@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_expr_datetime_unsupported_timezone(tzinfo: dt.timezone) -> None:
+ datetime = dt.datetime(2003, 5, 1, 1, 30)
+
+ result = datum.date == datetime
+ assert repr(result) == "(datum.date === datetime(2003,4,1,1,30,0,0))"
+
+ with pytest.raises(TypeError, match=r"Unsupported timezone.+\n.+UTC.+local"):
+ datum.date == datetime.replace(tzinfo=tzinfo) # noqa: B015
From 211f7c517d7c005af521b242e51e414a084b8350 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 30 Oct 2024 17:23:23 +0000
Subject: [PATCH 04/53] docs: Update "Ranged Dot Plot" example (#3665)
---
.../ranged_dot_plot.py | 49 +++++++++----------
.../ranged_dot_plot.py | 44 ++++++++---------
2 files changed, 45 insertions(+), 48 deletions(-)
diff --git a/tests/examples_arguments_syntax/ranged_dot_plot.py b/tests/examples_arguments_syntax/ranged_dot_plot.py
index d7efcf77c..2ca244eb4 100644
--- a/tests/examples_arguments_syntax/ranged_dot_plot.py
+++ b/tests/examples_arguments_syntax/ranged_dot_plot.py
@@ -9,35 +9,32 @@
source = data.countries.url
-chart = alt.Chart(
- data=source
-).transform_filter(
- filter={"field": 'country',
- "oneOf": ["China", "India", "United States", "Indonesia", "Brazil"]}
-).transform_filter(
- filter={'field': 'year',
- "oneOf": [1955, 2000]}
+chart = (
+ alt.Chart(source)
+ .encode(x="life_expect:Q", y="country:N")
+ .transform_filter(
+ alt.FieldOneOfPredicate(
+ field="country",
+ oneOf=["China", "India", "United States", "Indonesia", "Brazil"],
+ )
+ )
+ .transform_filter(alt.FieldOneOfPredicate(field="year", oneOf=[1955, 2000]))
)
-line = chart.mark_line(color='#db646f').encode(
- x='life_expect:Q',
- y='country:N',
- detail='country:N'
-)
+line = chart.mark_line(color="#db646f").encode(detail="country:N")
+
# Add points for life expectancy in 1955 & 2000
-points = chart.mark_point(
- size=100,
- opacity=1,
- filled=True
-).encode(
- x='life_expect:Q',
- y='country:N',
- color=alt.Color('year:O',
- scale=alt.Scale(
- domain=[1955, 2000],
- range=['#e6959c', '#911a24']
- )
+color = alt.Color(
+ "year:O", scale=alt.Scale(domain=[1955, 2000], range=["#e6959c", "#911a24"])
+)
+points = (
+ chart.mark_point(
+ size=100,
+ opacity=1,
+ filled=True,
)
-).interactive()
+ .encode(color=color)
+ .interactive()
+)
(line + points)
diff --git a/tests/examples_methods_syntax/ranged_dot_plot.py b/tests/examples_methods_syntax/ranged_dot_plot.py
index 340eeed32..d2649c7ec 100644
--- a/tests/examples_methods_syntax/ranged_dot_plot.py
+++ b/tests/examples_methods_syntax/ranged_dot_plot.py
@@ -9,30 +9,30 @@
source = data.countries.url
-chart = alt.Chart(
- data=source
-).transform_filter(
- filter={"field": 'country',
- "oneOf": ["China", "India", "United States", "Indonesia", "Brazil"]}
-).transform_filter(
- filter={'field': 'year',
- "oneOf": [1955, 2000]}
+chart = (
+ alt.Chart(source)
+ .encode(x="life_expect:Q", y="country:N")
+ .transform_filter(
+ alt.FieldOneOfPredicate(
+ field="country",
+ oneOf=["China", "India", "United States", "Indonesia", "Brazil"],
+ )
+ )
+ .transform_filter(alt.FieldOneOfPredicate(field="year", oneOf=[1955, 2000]))
)
-line = chart.mark_line(color='#db646f').encode(
- x='life_expect:Q',
- y='country:N',
- detail='country:N'
-)
+line = chart.mark_line(color="#db646f").encode(detail="country:N")
+
# Add points for life expectancy in 1955 & 2000
-points = chart.mark_point(
- size=100,
- opacity=1,
- filled=True
-).encode(
- x='life_expect:Q',
- y='country:N',
- color=alt.Color('year:O').scale(domain=[1955, 2000], range=['#e6959c', '#911a24'])
-).interactive()
+color = alt.Color("year:O").scale(domain=[1955, 2000], range=["#e6959c", "#911a24"])
+points = (
+ chart.mark_point(
+ size=100,
+ opacity=1,
+ filled=True,
+ )
+ .encode(color=color)
+ .interactive()
+)
(line + points)
From 88c76e3f8ca320da4b6bde7b1d3f54389b75f1da Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Sat, 2 Nov 2024 12:56:26 +0000
Subject: [PATCH 05/53] docs: Promote `when-then-otherwise` in User Guide
(#3544)
Co-authored-by: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Co-authored-by: Joel Ostblom
Co-authored-by: Joel Ostblom
---
README.md | 2 +-
altair/vegalite/v5/api.py | 29 ++-
doc/case_studies/exploring-weather.rst | 31 ++-
doc/user_guide/compound_charts.rst | 15 +-
.../interactions/bindings_widgets.rst | 40 +---
doc/user_guide/interactions/expressions.rst | 13 +-
doc/user_guide/interactions/jupyter_chart.rst | 20 +-
doc/user_guide/interactions/parameters.rst | 226 +++++++++++++++---
doc/user_guide/marks/geoshape.rst | 11 +-
doc/user_guide/marks/line.rst | 2 +-
doc/user_guide/marks/text.rst | 7 +-
doc/user_guide/times_and_dates.rst | 7 +-
doc/user_guide/transform/filter.rst | 26 +-
doc/user_guide/transform/pivot.rst | 24 +-
.../bar_chart_with_highlighted_bar.py | 14 +-
.../bar_chart_with_negatives.py | 9 +-
.../candlestick_chart.py | 8 +-
.../dot_dash_plot.py | 8 +-
.../interactive_brush.py | 2 +-
.../interactive_column_selection.py | 2 +-
.../interactive_cross_highlight.py | 2 +-
.../interactive_legend.py | 2 +-
.../interactive_reorder_stacked_bars.py | 2 +-
.../interval_selection_map_quakes.py | 2 +-
.../examples_arguments_syntax/lasagna_plot.py | 8 +-
.../layered_heatmap_text.py | 12 +-
.../multiline_highlight.py | 2 +-
.../multiline_tooltip.py | 5 +-
.../multiline_tooltip_standard.py | 5 +-
.../multiple_interactions.py | 22 +-
.../scatter_linked_brush.py | 2 +-
.../scatter_linked_table.py | 2 +-
.../scatter_point_paths_hover.py | 20 +-
.../scatter_with_histogram.py | 2 +-
.../scatter_with_layered_histogram.py | 12 +-
.../scatter_with_minimap.py | 2 +-
.../seattle_weather_interactive.py | 4 +-
.../select_detail.py | 7 +-
.../selection_histogram.py | 2 +-
.../selection_layer_bar_month.py | 2 +-
.../selection_zorder.py | 7 +-
.../slider_cutoff.py | 6 +-
.../us_employment.py | 7 +-
.../us_state_capitals.py | 4 +-
.../waterfall_chart.py | 70 +++---
.../candlestick_chart.py | 9 +-
.../interactive_column_selection.py | 2 +-
.../interactive_cross_highlight.py | 2 +-
.../interactive_legend.py | 2 +-
.../interval_selection_map_quakes.py | 2 +-
tests/examples_methods_syntax/lasagna_plot.py | 8 +-
.../layered_heatmap_text.py | 13 +-
.../multiline_highlight.py | 2 +-
.../multiline_tooltip.py | 5 +-
.../multiline_tooltip_standard.py | 5 +-
.../multiple_interactions.py | 20 +-
.../scatter_linked_table.py | 2 +-
.../scatter_point_paths_hover.py | 20 +-
.../scatter_with_layered_histogram.py | 12 +-
.../scatter_with_minimap.py | 2 +-
.../seattle_weather_interactive.py | 4 +-
.../examples_methods_syntax/select_detail.py | 7 +-
.../examples_methods_syntax/us_employment.py | 7 +-
.../us_state_capitals.py | 4 +-
64 files changed, 485 insertions(+), 350 deletions(-)
diff --git a/README.md b/README.md
index 0e14e8826..6134975c6 100644
--- a/README.md
+++ b/README.md
@@ -57,7 +57,7 @@ brush = alt.selection_interval()
points = alt.Chart(source).mark_point().encode(
x='Horsepower',
y='Miles_per_Gallon',
- color=alt.condition(brush, 'Origin', alt.value('lightgray'))
+ color=alt.when(brush).then("Origin").otherwise(alt.value("lightgray"))
).add_params(
brush
)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index a3070acbf..51d3f2cac 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -913,7 +913,7 @@ def then(self, statement: _StatementType, /, **kwds: Any) -> Then[Any]:
A spec or value to use when the preceding :func:`.when()` clause is true.
.. note::
- ``str`` will be encoded as `shorthand`__.
+ ``str`` will be encoded as `shorthand`_.
**kwds
Additional keyword args are added to the resulting ``dict``.
@@ -921,6 +921,9 @@ def then(self, statement: _StatementType, /, **kwds: Any) -> Then[Any]:
-------
:class:`Then`
+ .. _shorthand:
+ https://altair-viz.github.io/user_guide/encodings/index.html#encoding-shorthands
+
Examples
--------
Simple conditions may be expressed without defining a default::
@@ -990,10 +993,12 @@ def otherwise(
Roughly equivalent to an ``else`` clause.
.. note::
- ``str`` will be encoded as `shorthand`__.
+ ``str`` will be encoded as `shorthand`_.
**kwds
Additional keyword args are added to the resulting ``dict``.
+ .. _shorthand:
+ https://altair-viz.github.io/user_guide/encodings/index.html#encoding-shorthands
Examples
--------
@@ -1071,7 +1076,7 @@ def when(
When ``predicate`` is a ``Parameter`` that is used more than once,
``alt.when().then().when(..., empty=...)`` provides granular control for each occurrence.
**constraints
- Specify `Field Equal Predicate `__'s.
+ Specify `Field Equal Predicate`_'s.
Shortcut for ``alt.datum.field_name == value``, see examples for usage.
Returns
@@ -1079,6 +1084,8 @@ def when(
:class:`ChainedWhen`
A partial state which requires calling :meth:`ChainedWhen.then()` to finish the condition.
+ .. _Field Equal Predicate:
+ https://vega.github.io/vega-lite/docs/predicate.html#equal-predicate
Examples
--------
@@ -1176,7 +1183,7 @@ def then(self, statement: _StatementType, /, **kwds: Any) -> Then[_Conditions]:
A spec or value to use when the preceding :meth:`Then.when()` clause is true.
.. note::
- ``str`` will be encoded as `shorthand`__.
+ ``str`` will be encoded as `shorthand`_.
**kwds
Additional keyword args are added to the resulting ``dict``.
@@ -1184,6 +1191,9 @@ def then(self, statement: _StatementType, /, **kwds: Any) -> Then[_Conditions]:
-------
:class:`Then`
+ .. _shorthand:
+ https://altair-viz.github.io/user_guide/encodings/index.html#encoding-shorthands
+
Examples
--------
Multiple conditions with an implicit default::
@@ -1247,7 +1257,7 @@ def when(
When ``predicate`` is a ``Parameter`` that is used more than once,
``alt.when(..., empty=...)`` provides granular control for each occurrence.
**constraints
- Specify `Field Equal Predicate `__'s.
+ Specify `Field Equal Predicate`_'s.
Shortcut for ``alt.datum.field_name == value``, see examples for usage.
Returns
@@ -1257,11 +1267,12 @@ def when(
Notes
-----
- - Directly inspired by the ``when-then-otherwise`` syntax used in ``polars.when``.
+ - Directly inspired by the ``when-then-otherwise`` syntax used in `polars.when`_.
- References
- ----------
- `polars.when `__
+ .. _Field Equal Predicate:
+ https://vega.github.io/vega-lite/docs/predicate.html#equal-predicate
+ .. _polars.when:
+ https://docs.pola.rs/py-polars/html/reference/expressions/api/polars.when.html
Examples
--------
diff --git a/doc/case_studies/exploring-weather.rst b/doc/case_studies/exploring-weather.rst
index bc9776787..ad2a3bc2d 100644
--- a/doc/case_studies/exploring-weather.rst
+++ b/doc/case_studies/exploring-weather.rst
@@ -226,31 +226,28 @@ of the selection (for more information on selections, see
.. altair-plot::
brush = alt.selection_interval()
-
- points = alt.Chart().mark_point().encode(
- alt.X('temp_max:Q').title('Maximum Daily Temperature (C)'),
- alt.Y('temp_range:Q').title('Daily Temperature Range (C)'),
- color=alt.condition(brush, 'weather:N', alt.value('lightgray'), scale=scale),
- size=alt.Size('precipitation:Q').scale(range=[1, 200])
+ color = alt.Color("weather:N").scale(scale)
+ temp_range = alt.datum["temp_max"] - alt.datum["temp_min"]
+
+ points = alt.Chart(width=600, height=400).mark_point().encode(
+ alt.X("temp_max:Q").title("Maximum Daily Temperature (C)"),
+ alt.Y("temp_range:Q").title("Daily Temperature Range (C)"),
+ color=alt.when(brush).then(color).otherwise(alt.value("lightgray")),
+ size=alt.Size("precipitation:Q").scale(range=[1, 200]),
).transform_calculate(
- "temp_range", "datum.temp_max - datum.temp_min"
- ).properties(
- width=600,
- height=400
+ temp_range=temp_range
).add_params(
brush
)
- bars = alt.Chart().mark_bar().encode(
- x='count()',
- y='weather:N',
- color=alt.Color('weather:N').scale(scale),
+ bars = alt.Chart(width=600).mark_bar().encode(
+ x="count()",
+ y="weather:N",
+ color=color
).transform_calculate(
- "temp_range", "datum.temp_max - datum.temp_min"
+ temp_range=temp_range
).transform_filter(
brush
- ).properties(
- width=600
)
alt.vconcat(points, bars, data=df)
diff --git a/doc/user_guide/compound_charts.rst b/doc/user_guide/compound_charts.rst
index 503add798..a39114d38 100644
--- a/doc/user_guide/compound_charts.rst
+++ b/doc/user_guide/compound_charts.rst
@@ -364,28 +364,25 @@ layered chart with a hover selection:
.. altair-plot::
hover = alt.selection_point(on='pointerover', nearest=True, empty=False)
+ when_hover = alt.when(hover)
base = alt.Chart(iris).encode(
x='petalLength:Q',
y='petalWidth:Q',
- color=alt.condition(hover, 'species:N', alt.value('lightgray'))
+ color=when_hover.then("species:N").otherwise(alt.value("lightgray"))
).properties(
width=180,
height=180,
)
- points = base.mark_point().add_params(
- hover
- )
+ points = base.mark_point().add_params(hover)
text = base.mark_text(dy=-5).encode(
- text = 'species:N',
- opacity = alt.condition(hover, alt.value(1), alt.value(0))
+ text="species:N",
+ opacity=when_hover.then(alt.value(1)).otherwise(alt.value(0)),
)
- alt.layer(points, text).facet(
- 'species:N',
- )
+ (points + text).facet("species:N")
Though each of the above examples have faceted the data across columns,
faceting across rows (or across rows *and* columns) is supported as
diff --git a/doc/user_guide/interactions/bindings_widgets.rst b/doc/user_guide/interactions/bindings_widgets.rst
index dc62a6e11..9a62307dc 100644
--- a/doc/user_guide/interactions/bindings_widgets.rst
+++ b/doc/user_guide/interactions/bindings_widgets.rst
@@ -51,10 +51,10 @@ where a drop-down is used to highlight cars of a specific ``Origin``:
input_dropdown = alt.binding_select(options=['Europe', 'Japan', 'USA'], name='Region ')
selection = alt.selection_point(fields=['Origin'], bind=input_dropdown)
- color = alt.condition(
- selection,
- alt.Color('Origin:N').legend(None),
- alt.value('lightgray')
+ color = (
+ alt.when(selection)
+ .then(alt.Color("Origin:N").legend(None))
+ .otherwise(alt.value("lightgray"))
)
alt.Chart(cars).mark_point().encode(
@@ -72,7 +72,7 @@ and selection parameters follow the same pattern as you will see further down
in the :ref:`encoding-channel-binding` section.
As you can see above,
-we are still using ``conditions`` to make the chart respond to the selection,
+we are still using :ref:`conditions ` to make the chart respond to the selection,
just as we did without widgets.
Bindings and input elements can also be used to filter data
allowing the user to see just the selected points as in the example below.
@@ -137,11 +137,7 @@ to see the point highlighted
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
tooltip='Name:N',
- opacity=alt.condition(
- search_input,
- alt.value(1),
- alt.value(0.05)
- )
+ opacity=alt.when(search_input).then(alt.value(1)).otherwise(alt.value(0.05)),
).add_params(
search_input
)
@@ -185,16 +181,12 @@ which would have been the case if we just wrote ``xval < selector``.
slider = alt.binding_range(min=0, max=100, step=1, name='Cutoff ')
selector = alt.param(name='SelectorName', value=50, bind=slider)
+ predicate = alt.datum.xval < selector
alt.Chart(df).mark_point().encode(
x='xval',
y='yval',
- color=alt.condition(
- alt.datum.xval < selector,
- # 'datum.xval < SelectorName', # An equivalent alternative
- alt.value('red'),
- alt.value('blue')
- )
+ color=alt.when(predicate).then(alt.value("red")).otherwise(alt.value("blue")),
).add_params(
selector
)
@@ -213,16 +205,12 @@ points based on whether they are smaller or larger than the value:
bind=slider,
value=[{'cutoff': 50}]
)
+ predicate = alt.datum.xval < selector.cutoff
alt.Chart(df).mark_point().encode(
x='xval',
y='yval',
- color=alt.condition(
- alt.datum.xval < selector.cutoff,
- # 'datum.xval < SelectorName.cutoff', # An equivalent alternative
- alt.value('red'),
- alt.value('blue')
- )
+ color=alt.when(predicate).then(alt.value("red")).otherwise(alt.value("blue")),
).add_params(
selector
)
@@ -263,11 +251,7 @@ just if the value of the check box is True (checked) or False (unchecked):
alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- size=alt.condition(
- param_checkbox,
- 'Acceleration:Q',
- alt.value(25)
- )
+ size=alt.when(param_checkbox).then("Acceleration:Q").otherwise(alt.value(25)),
).add_params(
param_checkbox
)
@@ -315,7 +299,7 @@ Altair provides the ``bind='legend'`` option to facilitate the creation of click
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color='Origin:N',
- opacity=alt.condition(selection, alt.value(0.8), alt.value(0.2))
+ opacity=alt.when(selection).then(alt.value(0.8)).otherwise(alt.value(0.2)),
).add_params(
selection
)
diff --git a/doc/user_guide/interactions/expressions.rst b/doc/user_guide/interactions/expressions.rst
index a73751ef4..a4e9440ab 100644
--- a/doc/user_guide/interactions/expressions.rst
+++ b/doc/user_guide/interactions/expressions.rst
@@ -169,19 +169,14 @@ To try this out, you can type ``mazda|ford`` in the search input box below.
name='Search ',
)
)
+ search_matches = alt.expr.test(alt.expr.regexp(search_input, "i"), alt.datum.Name)
+
alt.Chart(cars).mark_point(size=60).encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
tooltip='Name:N',
- opacity=alt.condition(
- alt.expr.test(alt.expr.regexp(search_input, 'i'), alt.datum.Name),
- # f"test(regexp({search_input.name}, 'i'), datum.Name)", # Equivalent js alternative
- alt.value(1),
- alt.value(0.05)
- )
- ).add_params(
- search_input
- )
+ opacity=alt.when(search_matches).then(alt.value(1)).otherwise(alt.value(0.05)),
+ ).add_params(search_input)
And remember, all this interactivity is client side.
You can save this chart as an HTML file or put it on a static site generator such as GitHub/GitLab pages
diff --git a/doc/user_guide/interactions/jupyter_chart.rst b/doc/user_guide/interactions/jupyter_chart.rst
index 88982c06b..a4ad028d1 100644
--- a/doc/user_guide/interactions/jupyter_chart.rst
+++ b/doc/user_guide/interactions/jupyter_chart.rst
@@ -105,14 +105,12 @@ is available as ``jchart.params.cutoff``.
slider = alt.binding_range(min=0, max=100, step=1)
cutoff = alt.param(name="cutoff", bind=slider, value=50)
+ predicate = alt.datum.xval < cutoff
chart = alt.Chart(df).mark_point().encode(
x='xval',
y='yval',
- color=alt.condition(
- alt.datum.xval < cutoff,
- alt.value('red'), alt.value('blue')
- )
+ color=alt.when(predicate).then(alt.value("red")).otherwise(alt.value("blue")),
).add_params(
cutoff
)
@@ -201,14 +199,12 @@ variable's value only from the ``IntSlider`` ipywidget.
})
cutoff = alt.param(name="cutoff", value=50)
+ predicate = alt.datum.xval < cutoff
chart = alt.Chart(df).mark_point().encode(
x='xval',
y='yval',
- color=alt.condition(
- alt.datum.xval < cutoff,
- alt.value('red'), alt.value('blue')
- )
+ color=alt.when(predicate).then(alt.value("red")).otherwise(alt.value("blue"))
).add_params(
cutoff
)
@@ -253,7 +249,7 @@ the legend.
chart = alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Origin:N', alt.value('grey')),
+ color=alt.when(brush).then("Origin:N").otherwise(alt.value("grey")),
).add_params(brush)
jchart = alt.JupyterChart(chart)
@@ -306,7 +302,7 @@ extract the selected rows in the input DataFrame.
chart = alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Origin:N', alt.value('grey')),
+ color=alt.when(brush).then("Origin:N").otherwise(alt.value("grey")),
).add_params(brush)
jchart = alt.JupyterChart(chart)
@@ -344,7 +340,7 @@ is a dictionary from column names to selection intervals
chart = alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Cylinders:O', alt.value('grey')),
+ color=alt.when(brush).then("Cylinders:O").otherwise(alt.value("grey")),
).add_params(brush)
jchart = alt.JupyterChart(chart)
@@ -399,7 +395,7 @@ is used to combine the chart and HTML table in a column layout.
chart_widget = alt.JupyterChart(alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Cylinders:O', alt.value('grey')),
+ color=alt.when(brush).then("Cylinders:O").otherwise(alt.value("grey")),
).add_params(brush))
table_widget = HTML(value=source.iloc[:0].to_html())
diff --git a/doc/user_guide/interactions/parameters.rst b/doc/user_guide/interactions/parameters.rst
index 1dce8c116..cf42d572b 100644
--- a/doc/user_guide/interactions/parameters.rst
+++ b/doc/user_guide/interactions/parameters.rst
@@ -3,7 +3,10 @@
.. _parameters:
Parameters, Conditions, & Filters
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+=================================
+
+Parameters
+~~~~~~~~~~
Parameters are the building blocks of interaction in Altair.
There are two types of parameters: *variables* and *selections*. We introduce these concepts through a series of examples.
@@ -146,25 +149,29 @@ we created a selection parameter using ``brush = alt.selection_interval()``,
and we attached that parameter to the chart using ``add_params``.
One difference is that here we have not defined how the chart should respond to the selection; you will learn this in the next section.
-Conditions & Filters
-~~~~~~~~~~~~~~~~~~~~
+.. _conditions:
-Conditional Encodings
-^^^^^^^^^^^^^^^^^^^^^
+Conditions
+~~~~~~~~~~
+
+.. note::
+
+ This material was changed considerably with the release of Altair ``5.5.0``.
+ :func:`when` was introduced in ``5.4.0`` and should be preferred over :func:`condition`.
The example above is neat, but the selection interval doesn't actually *do* anything yet.
-To make the chart respond to this selection, we need to reference the selection in within
-the chart specification. Here, we will use the :func:`condition` function to create
-a conditional color encoding: we'll tie the color to the ``"Origin"``
-column for points in the selection, and set the color to ``"lightgray"``
-for points outside the selection:
+To make the chart respond to this selection, we need to reference ``brush`` within
+the chart specification. Here, we will use the :func:`when` function to create
+a conditional color encoding:
.. altair-plot::
+ conditional = alt.when(brush).then("Origin:N").otherwise(alt.value("lightgray"))
+
alt.Chart(cars).mark_point().encode(
- x='Horsepower:Q',
- y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Origin:N', alt.value('lightgray'))
+ x="Horsepower:Q",
+ y="Miles_per_Gallon:Q",
+ color=conditional,
).add_params(
brush
)
@@ -172,16 +179,68 @@ for points outside the selection:
As you can see, the color of the points now changes depending on whether they are inside or outside the selection.
Above we are using the selection parameter ``brush`` as a *predicate*
(something that evaluates as `True` or `False`).
-This is controlled by the line ``color=alt.condition(brush, 'Origin:N', alt.value('lightgray'))``.
+
+This is controlled by our definition ``conditional``::
+
+ conditional = alt.when(brush).then("Origin:N").otherwise(alt.value("lightgray"))
+
Data points which fall within the selection evaluate as ``True``,
and data points which fall outside the selection evaluate to ``False``.
-The ``'Origin:N'`` specifies how to color the points which fall within the selection,
-and the ``alt.value('lightgray')`` specifies that the outside points should be given a constant color value;
-you can remember this as ``alt.condition(, , )``.
+The ``"Origin:N"`` specifies how to color the points which fall within the selection,
+and the ``alt.value('lightgray')`` specifies that the outside points should be given a constant color value.
+
+Understanding :func:`when`
+^^^^^^^^^^^^^^^^^^^^^^^^^^
-This approach becomes even more powerful when the selection behavior is
+The ``when-then-otherwise`` syntax was directly inspired by `polars.when`_,
+and is similar to an ``if-else`` statement written in Python::
+
+ # alt.when(brush)
+ if brush:
+ # .then("Origin:N")
+ color = "Origin:N"
+ else:
+ # .otherwise(alt.value("lightgray"))
+ color = alt.value("lightgray")
+
+Omitting the ``.otherwise()`` clause will use the channel default instead:
+
+.. altair-plot::
+
+ source = data.cars()
+ brush = alt.selection_interval()
+
+ points = alt.Chart(source).mark_point().encode(
+ x="Horsepower",
+ y="Miles_per_Gallon",
+ color=alt.when(brush).then(alt.value("goldenrod"))
+ ).add_params(
+ brush
+ )
+
+ points
+
+Multiple conditional branches (``if, elif, ..., elif`` in Python)
+are expressed via chained calls to :func:`when`.
+You will see an example with working code in :ref:`conditional-branches`
+when you have learned about different selection types.
+
+More advanced use of conditions can be found
+in the :func:`when` API reference
+and in these gallery examples:
+
+- :ref:`gallery_dot_dash_plot`
+- :ref:`gallery_interactive_bar_select_highlight`
+- :ref:`gallery_multiline_tooltip_standard`
+- :ref:`gallery_scatter_point_paths_hover`
+- :ref:`gallery_waterfall_chart`
+
+Linking Conditions Across Charts
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Conditional encodings become even more powerful when the selection behavior is
tied across multiple views of the data within a compound chart.
-For example, here we create a ``chart`` object using the same code as
+For example, here we create a :class:`Chart` using the same code as
above, and horizontally concatenate two versions of this chart: one
with the x-encoding tied to ``"Horsepower"``, and one with the x-encoding
tied to ``"Acceleration"``
@@ -191,7 +250,7 @@ tied to ``"Acceleration"``
chart = alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Origin:N', alt.value('lightgray'))
+ color=alt.when(brush).then("Origin:N").otherwise(alt.value("lightgray")),
).properties(
width=250,
height=250
@@ -218,7 +277,7 @@ We can modify the brush definition, and leave the rest of the code unchanged:
chart = alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Origin:N', alt.value('lightgray'))
+ color=alt.when(brush).then("Origin:N").otherwise(alt.value("lightgray")),
).properties(
width=250,
height=250
@@ -231,15 +290,18 @@ We can modify the brush definition, and leave the rest of the code unchanged:
As you might have noticed,
the selected points are sometimes obscured by some of the unselected points.
To bring the selected points to the foreground,
-we can change the order in which they are laid out via the following
-encoding: ``order=alt.condition(hover, alt.value(1), alt.value(0))``.
-You can see an example of this in the :ref:`gallery_selection_zorder` gallery example.
+we can change the order in which they are laid out via the following encoding::
-Filtering Data
-^^^^^^^^^^^^^^
+ hover = alt.selection_point(on='pointerover', nearest=True, empty=False)
+ order = alt.when(hover).then(alt.value(1)).otherwise(alt.value(0))
+
+
+
+Filters
+~~~~~~~
Using a selection parameter to filter data works in much the same way
-as using it within ``condition``.
+as using it within :func:`when`.
For example, in ``transform_filter(brush)``,
we are again using the selection parameter ``brush`` as a predicate.
Data points which evaluate to ``True`` (i.e., data points which lie within the selection) are kept,
@@ -296,7 +358,7 @@ selection:
return alt.Chart(cars).mark_rect().encode(
x="Cylinders:O",
y="Origin:N",
- color=alt.condition(selector, 'count()', alt.value('lightgray'))
+ color=alt.when(selector).then("count()").otherwise(alt.value("lightgray")),
).properties(
width=300,
height=180
@@ -328,6 +390,16 @@ empty selection contains none of the points:
interval_x = alt.selection_interval(encodings=['x'], empty=False)
make_example(interval_x)
+The ``empty=False`` argument could instead be set inside :func:`when`,
+to change the behavior of each condition when an empty selection is passed,
+rather than having to define separate selection objects::
+
+ brush = alt.selection_interval()
+ ...
+ color=alt.when(brush).then(...)
+ size=alt.when(brush, empty=False).then(...)
+ ...
+
Point Selections
^^^^^^^^^^^^^^^^
A *point* selection allows you to select chart elements one at a time
@@ -367,10 +439,10 @@ with a matching ``Origin``.
.. altair-plot::
selection = alt.selection_point(fields=['Origin'])
- color = alt.condition(
- selection,
- alt.Color('Origin:N').legend(None),
- alt.value('lightgray')
+ color = (
+ alt.when(selection)
+ .then(alt.Color("Origin:N").legend(None))
+ .otherwise(alt.value("lightgray"))
)
scatter = alt.Chart(cars).mark_point().encode(
@@ -402,10 +474,10 @@ cylinders:
.. altair-plot::
selection = alt.selection_point(fields=['Origin', 'Cylinders'])
- color = alt.condition(
- selection,
- alt.Color('Origin:N').legend(None),
- alt.value('lightgray')
+ color = (
+ alt.when(selection)
+ .then(alt.Color("Origin:N").legend(None))
+ .otherwise(alt.value("lightgray"))
)
scatter = alt.Chart(cars).mark_point().encode(
@@ -428,9 +500,85 @@ cylinders:
By fine-tuning the behavior of selections in this way, they can be used to
create a wide variety of linked interactive chart types.
+Combining Parameters
+~~~~~~~~~~~~~~~~~~~~
+
+Multiple parameters can be combined in a single chart,
+either via multiple separate response conditions,
+different conditional branches in :func:`when`,
+or parameter composition.
+
+Multiple conditions
+^^^^^^^^^^^^^^^^^^^
+
+In this example,
+points that are hovered with the pointer
+will increase in size
+and those that are clicked
+will be filled in with red.
+The ``empty=False`` is to ensure that no points are selected to start.
+Try holding shift to select multiple points on either hover or click.
+
+.. altair-plot::
+
+ click = alt.selection_point(empty=False)
+ hover = alt.selection_point(on='pointerover', empty=False)
+
+ points = alt.Chart(cars).mark_point().encode(
+ x='Horsepower:Q',
+ y='Miles_per_Gallon:Q',
+ fill=alt.when(click).then(alt.value('red')),
+ size=alt.when(hover).then(alt.value(1000))
+ ).add_params(
+ click, hover
+ )
+
+ points
+
+.. _conditional-branches:
+
+Conditional branches
+^^^^^^^^^^^^^^^^^^^^
+
+:func:`when` allows the use of multiple ``then`` (``elif``) branches
+which can change the behavior of a single encoding
+in response to multiple different parameters.
+Here,
+we fill hovered points in yellow,
+before changing the fill to red
+when a point is clicked.
+Since the mouse is hovering over points
+while clicking them,
+both conditions will be active
+and the earlier branch takes precedence
+(you can try by changing the order of the two ``when.then`` clauses
+and observing that the points will not change to red when clicked).
+
+.. altair-plot::
+
+ click = alt.selection_point(empty=False)
+ hover = alt.selection_point(on='pointerover', empty=False)
+
+ points = alt.Chart(cars).mark_point().encode(
+ x='Horsepower:Q',
+ y='Miles_per_Gallon:Q',
+ fill=(
+ alt.when(click)
+ .then(alt.value('red'))
+ .when(hover)
+ .then(alt.value('gold'))
+ ),
+ size=alt.when(hover).then(alt.value(1000))
+ ).add_params(
+ click, hover
+ )
+
+ points
+
+.. _parameter-composition:
Parameter Composition
-~~~~~~~~~~~~~~~~~~~~~
+^^^^^^^^^^^^^^^^^^^^^
Altair also supports combining multiple parameters using the ``&``, ``|``
and ``~`` for respectively ``AND``, ``OR`` and ``NOT`` logical composition
@@ -462,7 +610,7 @@ selection
alt.Chart(cars).mark_rect().encode(
x='Cylinders:O',
y='Origin:O',
- color=alt.condition(alex | morgan, 'count()', alt.ColorValue("grey"))
+ color=alt.when(alex | morgan).then("count()").otherwise(alt.value("grey")),
).add_params(
alex, morgan
).properties(
@@ -482,3 +630,5 @@ For more information on how to fine-tune selections, including specifying other
mouse and keystroke options, see the `Vega-Lite Selection documentation
`_.
+.. _polars.when:
+ https://docs.pola.rs/py-polars/html/reference/expressions/api/polars.when.html
diff --git a/doc/user_guide/marks/geoshape.rst b/doc/user_guide/marks/geoshape.rst
index 4db48f98c..4c612ca61 100644
--- a/doc/user_guide/marks/geoshape.rst
+++ b/doc/user_guide/marks/geoshape.rst
@@ -529,9 +529,10 @@ populous states. Using an ``alt.selection_point()`` we define a selection parame
# define a pointer selection
click_state = alt.selection_point(fields=["state"])
+ # define a condition on the opacity encoding depending on the selection
+ opacity = alt.when(click_state).then(alt.value(1)).otherwise(alt.value(0.2))
# create a choropleth map using a lookup transform
- # define a condition on the opacity encoding depending on the selection
choropleth = (
alt.Chart(us_states)
.mark_geoshape()
@@ -540,13 +541,13 @@ populous states. Using an ``alt.selection_point()`` we define a selection parame
)
.encode(
color="population:Q",
- opacity=alt.condition(click_state, alt.value(1), alt.value(0.2)),
+ opacity=opacity,
tooltip=["state:N", "population:Q"],
)
.project(type="albersUsa")
)
- # create a bar chart with a similar condition on the opacity encoding.
+ # create a bar chart with the same conditional ``opacity`` encoding.
bars = (
alt.Chart(
us_population.nlargest(15, "population"), title="Top 15 states by population"
@@ -554,7 +555,7 @@ populous states. Using an ``alt.selection_point()`` we define a selection parame
.mark_bar()
.encode(
x="population",
- opacity=alt.condition(click_state, alt.value(1), alt.value(0.2)),
+ opacity=opacity,
color="population",
y=alt.Y("state").sort("-x"),
)
@@ -616,7 +617,7 @@ We use here an elegant way to access the nested point coordinates from the geome
.encode(
longitude="lon:Q",
latitude="lat:Q",
- strokeWidth=alt.condition(hover, alt.value(1, empty=False), alt.value(0)),
+ strokeWidth=alt.when(hover, empty=False).then(alt.value(1)).otherwise(alt.value(0)),
size=alt.Size(
"mag:Q",
scale=alt.Scale(type="pow", range=[1, 1000], domain=[0, 6], exponent=4),
diff --git a/doc/user_guide/marks/line.rst b/doc/user_guide/marks/line.rst
index 13f638f25..feda5bbf5 100644
--- a/doc/user_guide/marks/line.rst
+++ b/doc/user_guide/marks/line.rst
@@ -139,7 +139,7 @@ We can further apply selection to highlight a certain line on hover.
)
lines = base.mark_line().encode(
- size=alt.condition(~highlight, alt.value(1), alt.value(3))
+ size=alt.when(~highlight).then(alt.value(1)).otherwise(alt.value(3))
)
points + lines
diff --git a/doc/user_guide/marks/text.rst b/doc/user_guide/marks/text.rst
index 4bae2f8b5..35d363fce 100644
--- a/doc/user_guide/marks/text.rst
+++ b/doc/user_guide/marks/text.rst
@@ -127,13 +127,10 @@ Text Table Heatmap
.legend(direction="horizontal")
)
+ predicate = alt.datum.num_cars > 100
text = base.mark_text(baseline="middle").encode(
text="num_cars:Q",
- color=alt.condition(
- alt.datum.num_cars > 100,
- alt.value("black"),
- alt.value("white"),
- ),
+ color=alt.when(predicate).then(alt.value("black")).otherwise(alt.value("white")),
)
heatmap + text
diff --git a/doc/user_guide/times_and_dates.rst b/doc/user_guide/times_and_dates.rst
index a8cd47ab3..98ad9390c 100644
--- a/doc/user_guide/times_and_dates.rst
+++ b/doc/user_guide/times_and_dates.rst
@@ -187,12 +187,13 @@ way that Altair expects:
df = pd.DataFrame({'local': ['2018-01-01T00:00:00'],
'utc': ['2018-01-01T00:00:00Z']})
+ when_compliant = alt.when(compliant=True)
alt.Chart(df).transform_calculate(
compliant="hours(datum.local) != hours(datum.utc) ? true : false",
- ).mark_text(size=20, baseline='middle').encode(
- text=alt.condition('datum.compliant', alt.value('OK'), alt.value('not OK')),
- color=alt.condition('datum.compliant', alt.value('green'), alt.value('red'))
+ ).mark_text(size=20, baseline="middle").encode(
+ text=when_compliant.then(alt.value("OK")).otherwise(alt.value("not OK")),
+ color=when_compliant.then(alt.value("green")).otherwise(alt.value("red")),
).properties(width=80, height=50)
If the above output contains a red "not OK":
diff --git a/doc/user_guide/transform/filter.rst b/doc/user_guide/transform/filter.rst
index 3fca3f196..fb4c7420f 100644
--- a/doc/user_guide/transform/filter.rst
+++ b/doc/user_guide/transform/filter.rst
@@ -135,30 +135,24 @@ to select the data to be shown in the top chart:
selection = alt.selection_point(fields=['year'])
- top = alt.Chart().mark_line().encode(
- x='age:O',
- y='sum(people):Q',
- color='year:O'
- ).properties(
- width=600, height=200
+ top = alt.Chart(width=600, height=200).mark_line().encode(
+ x="age:O",
+ y="sum(people):Q",
+ color="year:O"
).transform_filter(
selection
)
- bottom = alt.Chart().mark_bar().encode(
- x='year:O',
- y='sum(people):Q',
- color=alt.condition(selection, alt.value('steelblue'), alt.value('lightgray'))
- ).properties(
- width=600, height=100
+ color = alt.when(selection).then(alt.value("steelblue")).otherwise(alt.value("lightgray"))
+ bottom = alt.Chart(width=600, height=100).mark_bar().encode(
+ x="year:O",
+ y="sum(people):Q",
+ color=color
).add_params(
selection
)
- alt.vconcat(
- top, bottom,
- data=pop
- )
+ alt.vconcat(top, bottom, data=pop)
Logical Operands
^^^^^^^^^^^^^^^^
diff --git a/doc/user_guide/transform/pivot.rst b/doc/user_guide/transform/pivot.rst
index eb3746c73..eb280d1e5 100644
--- a/doc/user_guide/transform/pivot.rst
+++ b/doc/user_guide/transform/pivot.rst
@@ -43,27 +43,27 @@ values on multiple lines:
.. altair-plot::
- import altair as alt
- from vega_datasets import data
+ import altair as alt
+ from vega_datasets import data
- source = data.stocks()
- base = alt.Chart(source).encode(x='date:T')
- columns = sorted(source.symbol.unique())
- selection = alt.selection_point(
- fields=['date'], nearest=True, on='pointerover', empty=False, clear='pointerout'
- )
+ source = data.stocks()
+ base = alt.Chart(source).encode(x='date:T')
+ columns = sorted(source.symbol.unique())
+ selection = alt.selection_point(
+ fields=['date'], nearest=True, on='pointerover', empty=False, clear='pointerout'
+ )
- lines = base.mark_line().encode(y='price:Q', color='symbol:N')
- points = lines.mark_point().transform_filter(selection)
+ lines = base.mark_line().encode(y='price:Q', color='symbol:N')
+ points = lines.mark_point().transform_filter(selection)
rule = base.transform_pivot(
'symbol', value='price', groupby=['date']
).mark_rule().encode(
- opacity=alt.condition(selection, alt.value(0.3), alt.value(0)),
+ opacity=alt.when(selection).then(alt.value(0.3)).otherwise(alt.value(0)),
tooltip=[alt.Tooltip(c, type='quantitative') for c in columns]
).add_params(selection)
- lines + points + rule
+ lines + points + rule
Transform Options
diff --git a/tests/examples_arguments_syntax/bar_chart_with_highlighted_bar.py b/tests/examples_arguments_syntax/bar_chart_with_highlighted_bar.py
index d277bf9f3..1041fb99f 100644
--- a/tests/examples_arguments_syntax/bar_chart_with_highlighted_bar.py
+++ b/tests/examples_arguments_syntax/bar_chart_with_highlighted_bar.py
@@ -9,13 +9,13 @@
source = data.wheat()
+# If the `year` column equals `1810`
+# then, set the bar color to `"orange"`
+# otherwise, use `"steelblue"`
+color = alt.when(year=1810).then(alt.value("orange")).otherwise(alt.value("steelblue"))
+
alt.Chart(source).mark_bar().encode(
- x='year:O',
+ x="year:O",
y="wheat:Q",
- # The highlight will be set on the result of a conditional statement
- color=alt.condition(
- alt.datum.year == 1810, # If the year is 1810 this test returns True,
- alt.value('orange'), # which sets the bar orange.
- alt.value('steelblue') # And if it's not true it sets the bar steelblue.
- )
+ color=color
).properties(width=600)
diff --git a/tests/examples_arguments_syntax/bar_chart_with_negatives.py b/tests/examples_arguments_syntax/bar_chart_with_negatives.py
index 127a16ba4..d3ff3fbc5 100644
--- a/tests/examples_arguments_syntax/bar_chart_with_negatives.py
+++ b/tests/examples_arguments_syntax/bar_chart_with_negatives.py
@@ -9,12 +9,11 @@
source = data.us_employment()
+predicate = alt.datum.nonfarm_change > 0
+color = alt.when(predicate).then(alt.value("steelblue")).otherwise(alt.value("orange"))
+
alt.Chart(source).mark_bar().encode(
x="month:T",
y="nonfarm_change:Q",
- color=alt.condition(
- alt.datum.nonfarm_change > 0,
- alt.value("steelblue"), # The positive color
- alt.value("orange") # The negative color
- )
+ color=color
).properties(width=600)
diff --git a/tests/examples_arguments_syntax/candlestick_chart.py b/tests/examples_arguments_syntax/candlestick_chart.py
index 23b338b8e..4dc524782 100644
--- a/tests/examples_arguments_syntax/candlestick_chart.py
+++ b/tests/examples_arguments_syntax/candlestick_chart.py
@@ -12,9 +12,11 @@
source = data.ohlc()
-open_close_color = alt.condition("datum.open <= datum.close",
- alt.value("#06982d"),
- alt.value("#ae1325"))
+open_close_color = (
+ alt.when("datum.open <= datum.close")
+ .then(alt.value("#06982d"))
+ .otherwise(alt.value("#ae1325"))
+)
base = alt.Chart(source).encode(
alt.X('date:T',
diff --git a/tests/examples_arguments_syntax/dot_dash_plot.py b/tests/examples_arguments_syntax/dot_dash_plot.py
index 72d73d2e8..64c6ef450 100644
--- a/tests/examples_arguments_syntax/dot_dash_plot.py
+++ b/tests/examples_arguments_syntax/dot_dash_plot.py
@@ -12,28 +12,30 @@
# Configure the options common to all layers
brush = alt.selection_interval()
+brush_origin = alt.when(brush).then("Origin")
base = alt.Chart(source).add_params(brush)
# Configure the points
points = base.mark_point().encode(
x=alt.X('Miles_per_Gallon', title=''),
y=alt.Y('Horsepower', title=''),
- color=alt.condition(brush, 'Origin', alt.value('grey'))
+ color=brush_origin.otherwise(alt.value("grey")),
)
# Configure the ticks
tick_axis = alt.Axis(labels=False, domain=False, ticks=False)
+tick_color = brush_origin.otherwise(alt.value("lightgrey"))
x_ticks = base.mark_tick().encode(
alt.X('Miles_per_Gallon', axis=tick_axis),
alt.Y('Origin', title='', axis=tick_axis),
- color=alt.condition(brush, 'Origin', alt.value('lightgrey'))
+ color=tick_color
)
y_ticks = base.mark_tick().encode(
alt.X('Origin', title='', axis=tick_axis),
alt.Y('Horsepower', axis=tick_axis),
- color=alt.condition(brush, 'Origin', alt.value('lightgrey'))
+ color=tick_color
)
# Build the chart
diff --git a/tests/examples_arguments_syntax/interactive_brush.py b/tests/examples_arguments_syntax/interactive_brush.py
index 2cfd66037..bee087c57 100644
--- a/tests/examples_arguments_syntax/interactive_brush.py
+++ b/tests/examples_arguments_syntax/interactive_brush.py
@@ -15,5 +15,5 @@
alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Cylinders:O', alt.value('grey')),
+ color=alt.when(brush).then("Cylinders:O").otherwise(alt.value("grey")),
).add_params(brush)
diff --git a/tests/examples_arguments_syntax/interactive_column_selection.py b/tests/examples_arguments_syntax/interactive_column_selection.py
index 1c82aad8f..0fa4826aa 100644
--- a/tests/examples_arguments_syntax/interactive_column_selection.py
+++ b/tests/examples_arguments_syntax/interactive_column_selection.py
@@ -37,7 +37,7 @@
alt.X('level_0', title=None),
alt.Y('level_1', title=None),
alt.Color('correlation', scale=alt.Scale(domain=[-1, 1], scheme='blueorange')),
- opacity=alt.condition(select_x & select_y, alt.value(1), alt.value(0.4))
+ opacity=alt.when(select_x, select_y).then(alt.value(1)).otherwise(alt.value(0.4)),
).add_params(
select_x, select_y
)
diff --git a/tests/examples_arguments_syntax/interactive_cross_highlight.py b/tests/examples_arguments_syntax/interactive_cross_highlight.py
index 796dc3110..f2b7e2d2a 100644
--- a/tests/examples_arguments_syntax/interactive_cross_highlight.py
+++ b/tests/examples_arguments_syntax/interactive_cross_highlight.py
@@ -34,7 +34,7 @@
bar = alt.Chart(source).mark_bar().encode(
x='Major_Genre:N',
y='count()',
- color=alt.condition(pts, alt.ColorValue("steelblue"), alt.ColorValue("grey"))
+ color=alt.when(pts).then(alt.ColorValue("steelblue")).otherwise(alt.ColorValue("grey"))
).properties(
width=550,
height=200
diff --git a/tests/examples_arguments_syntax/interactive_legend.py b/tests/examples_arguments_syntax/interactive_legend.py
index bd8b14b1a..61e45f44d 100644
--- a/tests/examples_arguments_syntax/interactive_legend.py
+++ b/tests/examples_arguments_syntax/interactive_legend.py
@@ -17,7 +17,7 @@
alt.X('yearmonth(date):T', axis=alt.Axis(domain=False, format='%Y', tickSize=0)),
alt.Y('sum(count):Q', stack='center', axis=None),
alt.Color('series:N', scale=alt.Scale(scheme='category20b')),
- opacity=alt.condition(selection, alt.value(1), alt.value(0.2))
+ opacity=alt.when(selection).then(alt.value(1)).otherwise(alt.value(0.2))
).add_params(
selection
)
diff --git a/tests/examples_arguments_syntax/interactive_reorder_stacked_bars.py b/tests/examples_arguments_syntax/interactive_reorder_stacked_bars.py
index 606bc37a1..2fbed1dca 100644
--- a/tests/examples_arguments_syntax/interactive_reorder_stacked_bars.py
+++ b/tests/examples_arguments_syntax/interactive_reorder_stacked_bars.py
@@ -25,7 +25,7 @@
y='variety:N',
color='site:N',
order='site_order:N',
- opacity=alt.condition(selection, alt.value(0.9), alt.value(0.2))
+ opacity=alt.when(selection).then(alt.value(0.9)).otherwise(alt.value(0.2))
).add_params(
selection
)
diff --git a/tests/examples_arguments_syntax/interval_selection_map_quakes.py b/tests/examples_arguments_syntax/interval_selection_map_quakes.py
index 6ab6bed8d..3a2d71c86 100644
--- a/tests/examples_arguments_syntax/interval_selection_map_quakes.py
+++ b/tests/examples_arguments_syntax/interval_selection_map_quakes.py
@@ -38,7 +38,7 @@
).mark_circle(opacity=0.35, tooltip=True).encode(
longitude="lon:Q",
latitude="lat:Q",
- color=alt.condition(brush, alt.value("goldenrod"), alt.value("steelblue")),
+ color=alt.when(brush).then(alt.value("goldenrod")).otherwise(alt.value("steelblue")),
size=alt.Size("mag:Q", scale=alt.Scale(type="pow", range=[1, 1000], domain=[0, 7], exponent=4)),
).add_params(brush)
diff --git a/tests/examples_arguments_syntax/lasagna_plot.py b/tests/examples_arguments_syntax/lasagna_plot.py
index 6f603b8e1..d3e60ed34 100644
--- a/tests/examples_arguments_syntax/lasagna_plot.py
+++ b/tests/examples_arguments_syntax/lasagna_plot.py
@@ -8,10 +8,10 @@
source = data.stocks()
-color_condition = alt.condition(
- "month(datum.value) == 1 && date(datum.value) == 1",
- alt.value("black"),
- alt.value(None),
+color_condition = (
+ alt.when(alt.expr.month("datum.value") == 1, alt.expr.date("datum.value") == 1)
+ .then(alt.value("black"))
+ .otherwise(alt.value(None))
)
alt.Chart(source, width=300, height=100).transform_filter(
diff --git a/tests/examples_arguments_syntax/layered_heatmap_text.py b/tests/examples_arguments_syntax/layered_heatmap_text.py
index dc912ed8b..7dec0fd26 100644
--- a/tests/examples_arguments_syntax/layered_heatmap_text.py
+++ b/tests/examples_arguments_syntax/layered_heatmap_text.py
@@ -28,14 +28,14 @@
)
)
+color = (
+ alt.when(alt.datum.mean_horsepower > 150)
+ .then(alt.value("black"))
+ .otherwise(alt.value("white"))
+)
# Configure text
text = base.mark_text(baseline='middle').encode(
- text=alt.Text('mean_horsepower:Q', format=".0f"),
- color=alt.condition(
- alt.datum.mean_horsepower > 150,
- alt.value('black'),
- alt.value('white')
- )
+ text=alt.Text('mean_horsepower:Q', format=".0f"), color=color
)
# Draw the chart
diff --git a/tests/examples_arguments_syntax/multiline_highlight.py b/tests/examples_arguments_syntax/multiline_highlight.py
index 5da841516..575c88081 100644
--- a/tests/examples_arguments_syntax/multiline_highlight.py
+++ b/tests/examples_arguments_syntax/multiline_highlight.py
@@ -30,7 +30,7 @@
)
lines = base.mark_line().encode(
- size=alt.condition(~highlight, alt.value(1), alt.value(3))
+ size=alt.when(~highlight).then(alt.value(1)).otherwise(alt.value(3))
)
points + lines
diff --git a/tests/examples_arguments_syntax/multiline_tooltip.py b/tests/examples_arguments_syntax/multiline_tooltip.py
index 12ac92bf0..d2bd7ff8f 100644
--- a/tests/examples_arguments_syntax/multiline_tooltip.py
+++ b/tests/examples_arguments_syntax/multiline_tooltip.py
@@ -41,15 +41,16 @@
).add_params(
nearest
)
+when_near = alt.when(nearest)
# Draw points on the line, and highlight based on selection
points = line.mark_point().encode(
- opacity=alt.condition(nearest, alt.value(1), alt.value(0))
+ opacity=when_near.then(alt.value(1)).otherwise(alt.value(0))
)
# Draw text labels near the points, and highlight based on selection
text = line.mark_text(align="left", dx=5, dy=-5).encode(
- text=alt.condition(nearest, "y:Q", alt.value(" "))
+ text=when_near.then("y:Q").otherwise(alt.value(" "))
)
# Draw a rule at the location of the selection
diff --git a/tests/examples_arguments_syntax/multiline_tooltip_standard.py b/tests/examples_arguments_syntax/multiline_tooltip_standard.py
index 990aa2015..bbab79d46 100644
--- a/tests/examples_arguments_syntax/multiline_tooltip_standard.py
+++ b/tests/examples_arguments_syntax/multiline_tooltip_standard.py
@@ -28,10 +28,11 @@
y="y:Q",
color="category:N"
)
+when_near = alt.when(nearest)
# Draw points on the line, and highlight based on selection
points = line.mark_point().encode(
- opacity=alt.condition(nearest, alt.value(1), alt.value(0))
+ opacity=when_near.then(alt.value(1)).otherwise(alt.value(0))
)
# Draw a rule at the location of the selection
@@ -41,7 +42,7 @@
groupby=["x"]
).mark_rule(color="gray").encode(
x="x:Q",
- opacity=alt.condition(nearest, alt.value(0.3), alt.value(0)),
+ opacity=when_near.then(alt.value(0.3)).otherwise(alt.value(0)),
tooltip=[alt.Tooltip(c, type="quantitative") for c in columns],
).add_params(nearest)
diff --git a/tests/examples_arguments_syntax/multiple_interactions.py b/tests/examples_arguments_syntax/multiple_interactions.py
index 8fbc4281e..96bfb8fed 100644
--- a/tests/examples_arguments_syntax/multiple_interactions.py
+++ b/tests/examples_arguments_syntax/multiple_interactions.py
@@ -61,32 +61,32 @@
rating_radio = alt.binding_radio(options=ratings, name="Rating")
rating_select = alt.selection_point(fields=['MPAA_Rating'], bind=rating_radio)
-rating_color_condition = alt.condition(
- rating_select,
- alt.Color('MPAA_Rating:N', legend=None),
- alt.value('lightgray')
+rating_color = (
+ alt.when(rating_select)
+ .then(alt.Color('MPAA_Rating:N', legend=None))
+ .otherwise(alt.value("lightgray"))
)
highlight_ratings = base.add_params(
rating_select
).encode(
- color=rating_color_condition
+ color=rating_color
).properties(title="Radio Button Highlighting")
# Boolean selection for format changes
input_checkbox = alt.binding_checkbox(name="Big Budget Films ")
checkbox_selection = alt.param(bind=input_checkbox)
-size_checkbox_condition = alt.condition(
- checkbox_selection,
- alt.Size('Hundred_Million_Production:Q'),
- alt.SizeValue(25)
+size_checkbox = (
+ alt.when(checkbox_selection)
+ .then(alt.Size('Big_Budget_Film:N', scale=alt.Scale(range=[25, 150])))
+ .otherwise(alt.value(25))
)
budget_sizing = base.add_params(
checkbox_selection
).encode(
- size=size_checkbox_condition
+ size=size_checkbox
).properties(title="Checkbox Formatting")
-(filter_year | filter_genres) & (highlight_ratings | budget_sizing)
+(filter_year | budget_sizing) & (highlight_ratings | filter_genres)
diff --git a/tests/examples_arguments_syntax/scatter_linked_brush.py b/tests/examples_arguments_syntax/scatter_linked_brush.py
index adf88d34b..b8548fd02 100644
--- a/tests/examples_arguments_syntax/scatter_linked_brush.py
+++ b/tests/examples_arguments_syntax/scatter_linked_brush.py
@@ -14,7 +14,7 @@
base = alt.Chart(source).mark_point().encode(
y='Miles_per_Gallon',
- color=alt.condition(brush, 'Origin', alt.ColorValue('gray')),
+ color=alt.when(brush).then("Origin").otherwise(alt.ColorValue("gray")),
).add_params(
brush
).properties(
diff --git a/tests/examples_arguments_syntax/scatter_linked_table.py b/tests/examples_arguments_syntax/scatter_linked_table.py
index 93777b751..e17c4dbb0 100644
--- a/tests/examples_arguments_syntax/scatter_linked_table.py
+++ b/tests/examples_arguments_syntax/scatter_linked_table.py
@@ -18,7 +18,7 @@
points = alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, alt.value('steelblue'), alt.value('grey'))
+ color=alt.when(brush).then(alt.value("steelblue")).otherwise(alt.value("grey"))
).add_params(brush)
# Base chart for data tables
diff --git a/tests/examples_arguments_syntax/scatter_point_paths_hover.py b/tests/examples_arguments_syntax/scatter_point_paths_hover.py
index ee755b9e0..aea0960f6 100644
--- a/tests/examples_arguments_syntax/scatter_point_paths_hover.py
+++ b/tests/examples_arguments_syntax/scatter_point_paths_hover.py
@@ -53,14 +53,15 @@
"datum.country !== 'North Korea' && datum.country !== 'South Korea'"
)
+search_matches = alt.expr.test(alt.expr.regexp(search_box, "i"), alt.datum.country)
+opacity = (
+ alt.when(hover_point_opacity, search_matches)
+ .then(alt.value(0.8))
+ .otherwise(alt.value(0.1))
+)
# Points that are always visible (filtered by slider and search)
visible_points = base.mark_circle(size=100).encode(
- opacity=alt.condition(
- hover_point_opacity
- & alt.expr.test(alt.expr.regexp(search_box, 'i'), alt.datum.country),
- alt.value(0.8),
- alt.value(0.1)
- )
+ opacity=opacity
).transform_filter(
x_select
).add_params(
@@ -69,6 +70,7 @@
x_select
)
+when_hover = alt.when(hover)
hover_line = alt.layer(
# Line layer
base.mark_trail().encode(
@@ -81,12 +83,12 @@
scale=alt.Scale(domain=[1955, 2005], range=[1, 12]),
legend=None
),
- opacity=alt.condition(hover, alt.value(0.3), alt.value(0)),
+ opacity=when_hover.then(alt.value(0.3)).otherwise(alt.value(0)),
color=alt.value('#222222')
),
# Point layer
base.mark_point(size=50).encode(
- opacity=alt.condition(hover, alt.value(0.8), alt.value(0)),
+ opacity=when_hover.then(alt.value(0.8)).otherwise(alt.value(0)),
)
)
@@ -108,7 +110,7 @@
y='life_expect:Q',
text='country:N',
color=alt.value('black'),
- opacity=alt.condition(hover, alt.value(1), alt.value(0))
+ opacity=when_hover.then(alt.value(1)).otherwise(alt.value(0))
).transform_window(
rank='rank(life_expect)',
sort=[alt.SortField('life_expect', order='descending')],
diff --git a/tests/examples_arguments_syntax/scatter_with_histogram.py b/tests/examples_arguments_syntax/scatter_with_histogram.py
index dda40dec0..40cb65c2b 100644
--- a/tests/examples_arguments_syntax/scatter_with_histogram.py
+++ b/tests/examples_arguments_syntax/scatter_with_histogram.py
@@ -42,7 +42,7 @@
mag = alt.Chart().mark_bar().encode(
x='mbin:N',
y="count()",
- color=alt.condition(pts, alt.value("black"), alt.value("lightgray"))
+ color=alt.when(pts).then(alt.value("black")).otherwise(alt.value("lightgray"))
).properties(
width=300,
height=300
diff --git a/tests/examples_arguments_syntax/scatter_with_layered_histogram.py b/tests/examples_arguments_syntax/scatter_with_layered_histogram.py
index 2268b055c..087d9b405 100644
--- a/tests/examples_arguments_syntax/scatter_with_layered_histogram.py
+++ b/tests/examples_arguments_syntax/scatter_with_layered_histogram.py
@@ -30,7 +30,11 @@
color_scale = alt.Scale(domain=['M', 'F'],
range=['#1FC3AA', '#8624F5'])
-
+color = (
+ alt.when(selector)
+ .then(alt.Color("gender:N", scale=color_scale))
+ .otherwise(alt.value("lightgray"))
+)
base = alt.Chart(source).properties(
width=250,
height=250
@@ -39,11 +43,7 @@
points = base.mark_point(filled=True, size=200).encode(
x=alt.X('mean(height):Q', scale=alt.Scale(domain=[0,84])),
y=alt.Y('mean(weight):Q', scale=alt.Scale(domain=[0,250])),
- color=alt.condition(
- selector,
- 'gender:N',
- alt.value('lightgray'),
- scale=color_scale),
+ color=color,
)
hists = base.mark_bar(opacity=0.5, thickness=100).encode(
diff --git a/tests/examples_arguments_syntax/scatter_with_minimap.py b/tests/examples_arguments_syntax/scatter_with_minimap.py
index a18a599cd..df8a9fd44 100644
--- a/tests/examples_arguments_syntax/scatter_with_minimap.py
+++ b/tests/examples_arguments_syntax/scatter_with_minimap.py
@@ -21,7 +21,7 @@
.encode(
x="date:T",
y="temp_max:Q",
- color=alt.condition(zoom, "weather", alt.value("lightgray")),
+ color=alt.when(zoom).then("weather").otherwise(alt.value("lightgray")),
)
.properties(
width=200,
diff --git a/tests/examples_arguments_syntax/seattle_weather_interactive.py b/tests/examples_arguments_syntax/seattle_weather_interactive.py
index 798cc4780..63e93d011 100644
--- a/tests/examples_arguments_syntax/seattle_weather_interactive.py
+++ b/tests/examples_arguments_syntax/seattle_weather_interactive.py
@@ -28,7 +28,7 @@
title='Maximum Daily Temperature (C)',
scale=alt.Scale(domain=[-5, 40])
),
- color=alt.condition(brush, color, alt.value('lightgray')),
+ color=alt.when(brush).then(color).otherwise(alt.value("lightgray")),
size=alt.Size('precipitation:Q', scale=alt.Scale(range=[5, 200]))
).properties(
width=550,
@@ -43,7 +43,7 @@
bars = alt.Chart().mark_bar().encode(
x='count()',
y='weather:N',
- color=alt.condition(click, color, alt.value('lightgray')),
+ color=alt.when(click).then(color).otherwise(alt.value("lightgray")),
).transform_filter(
brush
).properties(
diff --git a/tests/examples_arguments_syntax/select_detail.py b/tests/examples_arguments_syntax/select_detail.py
index 500668c4f..9165e727f 100644
--- a/tests/examples_arguments_syntax/select_detail.py
+++ b/tests/examples_arguments_syntax/select_detail.py
@@ -42,6 +42,11 @@
# Data is prepared, now make a chart
selector = alt.selection_point(fields=['id'])
+color = (
+ alt.when(selector)
+ .then(alt.Color("id:O", legend=None))
+ .otherwise(alt.value("lightgray"))
+)
base = alt.Chart(data).properties(
width=250,
@@ -51,7 +56,7 @@
points = base.mark_point(filled=True, size=200).encode(
x='mean(x)',
y='mean(y)',
- color=alt.condition(selector, 'id:O', alt.value('lightgray'), legend=None),
+ color=color,
)
line = base.mark_line().encode(
diff --git a/tests/examples_arguments_syntax/selection_histogram.py b/tests/examples_arguments_syntax/selection_histogram.py
index dc0ccab8b..155b9fc68 100644
--- a/tests/examples_arguments_syntax/selection_histogram.py
+++ b/tests/examples_arguments_syntax/selection_histogram.py
@@ -16,7 +16,7 @@
points = alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, 'Origin:N', alt.value('lightgray'))
+ color=alt.when(brush).then("Origin:N").otherwise(alt.value("lightgray"))
).add_params(
brush
)
diff --git a/tests/examples_arguments_syntax/selection_layer_bar_month.py b/tests/examples_arguments_syntax/selection_layer_bar_month.py
index 43f4e97d2..e97914765 100644
--- a/tests/examples_arguments_syntax/selection_layer_bar_month.py
+++ b/tests/examples_arguments_syntax/selection_layer_bar_month.py
@@ -15,7 +15,7 @@
bars = alt.Chart().mark_bar().encode(
x='month(date):O',
y='mean(precipitation):Q',
- opacity=alt.condition(brush, alt.OpacityValue(1), alt.OpacityValue(0.7)),
+ opacity = alt.when(brush).then(alt.value(1)).otherwise(alt.value(0.7)),
).add_params(
brush
)
diff --git a/tests/examples_arguments_syntax/selection_zorder.py b/tests/examples_arguments_syntax/selection_zorder.py
index c8e3bd84a..6f6d7c93d 100644
--- a/tests/examples_arguments_syntax/selection_zorder.py
+++ b/tests/examples_arguments_syntax/selection_zorder.py
@@ -16,18 +16,19 @@
cars = data.cars.url
hover = alt.selection_point(on='pointerover', nearest=True, empty=False)
+when_hover = alt.when(hover)
chart = alt.Chart(cars, title='Selection obscured by other points').mark_circle(opacity=1).encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(hover, alt.value('coral'), alt.value('lightgray')),
- size=alt.condition(hover, alt.value(300), alt.value(30))
+ color=when_hover.then(alt.value("coral")).otherwise(alt.value("lightgray")),
+ size=when_hover.then(alt.value(300)).otherwise(alt.value(30))
).add_params(
hover
)
chart | chart.encode(
- order=alt.condition(hover, alt.value(1), alt.value(0))
+ order=when_hover.then(alt.value(1)).otherwise(alt.value(0))
).properties(
title='Selection brought to front'
)
diff --git a/tests/examples_arguments_syntax/slider_cutoff.py b/tests/examples_arguments_syntax/slider_cutoff.py
index 19db77493..786268aeb 100644
--- a/tests/examples_arguments_syntax/slider_cutoff.py
+++ b/tests/examples_arguments_syntax/slider_cutoff.py
@@ -17,14 +17,12 @@
slider = alt.binding_range(min=0, max=100, step=1)
cutoff = alt.param(bind=slider, value=50)
+predicate = alt.datum.xval < cutoff
alt.Chart(df).mark_point().encode(
x='xval',
y='yval',
- color=alt.condition(
- alt.datum.xval < cutoff,
- alt.value('red'), alt.value('blue')
- )
+ color=alt.when(predicate).then(alt.value("red")).otherwise(alt.value("blue")),
).add_params(
cutoff
)
\ No newline at end of file
diff --git a/tests/examples_arguments_syntax/us_employment.py b/tests/examples_arguments_syntax/us_employment.py
index 51f56998f..2b084290e 100644
--- a/tests/examples_arguments_syntax/us_employment.py
+++ b/tests/examples_arguments_syntax/us_employment.py
@@ -21,6 +21,7 @@
"president": "Obama"
}
])
+predicate = alt.datum.nonfarm_change > 0
bars = alt.Chart(
source,
@@ -28,11 +29,7 @@
).mark_bar().encode(
x=alt.X("month:T", title=""),
y=alt.Y("nonfarm_change:Q", title="Change in non-farm employment (in thousands)"),
- color=alt.condition(
- alt.datum.nonfarm_change > 0,
- alt.value("steelblue"),
- alt.value("orange")
- )
+ color=alt.when(predicate).then(alt.value("steelblue")).otherwise(alt.value("orange")),
)
rule = alt.Chart(presidents).mark_rule(
diff --git a/tests/examples_arguments_syntax/us_state_capitals.py b/tests/examples_arguments_syntax/us_state_capitals.py
index ad83b8a23..7598dd54c 100644
--- a/tests/examples_arguments_syntax/us_state_capitals.py
+++ b/tests/examples_arguments_syntax/us_state_capitals.py
@@ -32,12 +32,12 @@
text = base.mark_text(dy=-5, align='right').encode(
alt.Text('city', type='nominal'),
- opacity=alt.condition(~hover, alt.value(0), alt.value(1))
+ opacity=alt.when(~hover).then(alt.value(0)).otherwise(alt.value(1))
)
points = base.mark_point().encode(
color=alt.value('black'),
- size=alt.condition(~hover, alt.value(30), alt.value(100))
+ size=alt.when(~hover).then(alt.value(30)).otherwise(alt.value(100))
).add_params(hover)
background + points + text
diff --git a/tests/examples_arguments_syntax/waterfall_chart.py b/tests/examples_arguments_syntax/waterfall_chart.py
index 50f8718f4..bc01e04d4 100644
--- a/tests/examples_arguments_syntax/waterfall_chart.py
+++ b/tests/examples_arguments_syntax/waterfall_chart.py
@@ -27,36 +27,43 @@
]
source = pd.DataFrame(data)
+# Define frequently referenced fields
+amount = alt.datum.amount
+label = alt.datum.label
+window_lead_label = alt.datum.window_lead_label
+window_sum_amount = alt.datum.window_sum_amount
+
+# Define frequently referenced/long expressions
+calc_prev_sum = alt.expr.if_(label == "End", 0, window_sum_amount - amount)
+calc_amount = alt.expr.if_(label == "End", window_sum_amount, amount)
+calc_text_amount = (
+ alt.expr.if_((label != "Begin") & (label != "End") & calc_amount > 0, "+", "")
+ + calc_amount
+)
+
# The "base_chart" defines the transform_window, transform_calculate, and X axis
base_chart = alt.Chart(source).transform_window(
window_sum_amount="sum(amount)",
window_lead_label="lead(label)",
).transform_calculate(
- calc_lead="datum.window_lead_label === null ? datum.label : datum.window_lead_label",
- calc_prev_sum="datum.label === 'End' ? 0 : datum.window_sum_amount - datum.amount",
- calc_amount="datum.label === 'End' ? datum.window_sum_amount : datum.amount",
- calc_text_amount="(datum.label !== 'Begin' && datum.label !== 'End' && datum.calc_amount > 0 ? '+' : '') + datum.calc_amount",
- calc_center="(datum.window_sum_amount + datum.calc_prev_sum) / 2",
- calc_sum_dec="datum.window_sum_amount < datum.calc_prev_sum ? datum.window_sum_amount : ''",
- calc_sum_inc="datum.window_sum_amount > datum.calc_prev_sum ? datum.window_sum_amount : ''",
+ calc_lead=alt.expr.if_((window_lead_label == None), label, window_lead_label),
+ calc_prev_sum=calc_prev_sum,
+ calc_amount=calc_amount,
+ calc_text_amount=calc_text_amount,
+ calc_center=(window_sum_amount + calc_prev_sum) / 2,
+ calc_sum_dec=alt.expr.if_(window_sum_amount < calc_prev_sum, window_sum_amount, ""),
+ calc_sum_inc=alt.expr.if_(window_sum_amount > calc_prev_sum, window_sum_amount, ""),
).encode(
- x=alt.X(
- "label:O",
- axis=alt.Axis(title="Months", labelAngle=0),
- sort=None,
- )
+ x=alt.X("label:O", axis=alt.Axis(title="Months", labelAngle=0), sort=None)
)
-# alt.condition does not support multiple if else conditions which is why
-# we use a dictionary instead. See https://stackoverflow.com/a/66109641
-# for more information
-color_coding = {
- "condition": [
- {"test": "datum.label === 'Begin' || datum.label === 'End'", "value": "#878d96"},
- {"test": "datum.calc_amount < 0", "value": "#24a148"},
- ],
- "value": "#fa4d56",
-}
+color_coding = (
+ alt.when((label == "Begin") | (label == "End"))
+ .then(alt.value("#878d96"))
+ .when(calc_amount < 0)
+ .then(alt.value("#24a148"))
+ .otherwise(alt.value("#fa4d56"))
+)
bar = base_chart.mark_bar(size=45).encode(
y=alt.Y("calc_prev_sum:Q", title="Amount"),
@@ -65,28 +72,19 @@
)
# The "rule" chart is for the horizontal lines that connect the bars
-rule = base_chart.mark_rule(
- xOffset=-22.5,
- x2Offset=22.5,
-).encode(
+rule = base_chart.mark_rule(xOffset=-22.5, x2Offset=22.5).encode(
y="window_sum_amount:Q",
x2="calc_lead",
)
# Add values as text
-text_pos_values_top_of_bar = base_chart.mark_text(
- baseline="bottom",
- dy=-4
-).encode(
+text_pos_values_top_of_bar = base_chart.mark_text(baseline="bottom", dy=-4).encode(
text=alt.Text("calc_sum_inc:N"),
- y="calc_sum_inc:Q"
+ y="calc_sum_inc:Q",
)
-text_neg_values_bot_of_bar = base_chart.mark_text(
- baseline="top",
- dy=4
-).encode(
+text_neg_values_bot_of_bar = base_chart.mark_text(baseline="top", dy=4).encode(
text=alt.Text("calc_sum_dec:N"),
- y="calc_sum_dec:Q"
+ y="calc_sum_dec:Q",
)
text_bar_values_mid_of_bar = base_chart.mark_text(baseline="middle").encode(
text=alt.Text("calc_text_amount:N"),
diff --git a/tests/examples_methods_syntax/candlestick_chart.py b/tests/examples_methods_syntax/candlestick_chart.py
index 47e713abb..c001f7ddf 100644
--- a/tests/examples_methods_syntax/candlestick_chart.py
+++ b/tests/examples_methods_syntax/candlestick_chart.py
@@ -12,12 +12,11 @@
source = data.ohlc()
-open_close_color = alt.condition(
- "datum.open <= datum.close",
- alt.value("#06982d"),
- alt.value("#ae1325")
+open_close_color = (
+ alt.when("datum.open <= datum.close")
+ .then(alt.value("#06982d"))
+ .otherwise(alt.value("#ae1325"))
)
-
base = alt.Chart(source).encode(
alt.X('date:T')
.axis(format='%m/%d', labelAngle=-45)
diff --git a/tests/examples_methods_syntax/interactive_column_selection.py b/tests/examples_methods_syntax/interactive_column_selection.py
index a74fba609..d202f433d 100644
--- a/tests/examples_methods_syntax/interactive_column_selection.py
+++ b/tests/examples_methods_syntax/interactive_column_selection.py
@@ -37,7 +37,7 @@
alt.X('level_0').title(None),
alt.Y('level_1').title(None),
alt.Color('correlation').scale(domain=[-1, 1], scheme='blueorange'),
- opacity=alt.condition(select_x & select_y, alt.value(1), alt.value(0.4))
+ opacity=alt.when(select_x, select_y).then(alt.value(1)).otherwise(alt.value(0.4)),
).add_params(
select_x, select_y
)
diff --git a/tests/examples_methods_syntax/interactive_cross_highlight.py b/tests/examples_methods_syntax/interactive_cross_highlight.py
index 860a385c2..97dccb314 100644
--- a/tests/examples_methods_syntax/interactive_cross_highlight.py
+++ b/tests/examples_methods_syntax/interactive_cross_highlight.py
@@ -29,7 +29,7 @@
bar = alt.Chart(source, width=550, height=200).mark_bar().encode(
x='Major_Genre:N',
y='count()',
- color=alt.condition(pts, alt.ColorValue("steelblue"), alt.ColorValue("grey"))
+ color=alt.when(pts).then(alt.ColorValue("steelblue")).otherwise(alt.ColorValue("grey"))
).add_params(pts)
alt.vconcat(
diff --git a/tests/examples_methods_syntax/interactive_legend.py b/tests/examples_methods_syntax/interactive_legend.py
index 80c47cf11..e6a6e36f7 100644
--- a/tests/examples_methods_syntax/interactive_legend.py
+++ b/tests/examples_methods_syntax/interactive_legend.py
@@ -17,7 +17,7 @@
alt.X('yearmonth(date):T').axis(domain=False, format='%Y', tickSize=0),
alt.Y('sum(count):Q').stack('center').axis(None),
alt.Color('series:N').scale(scheme='category20b'),
- opacity=alt.condition(selection, alt.value(1), alt.value(0.2))
+ opacity=alt.when(selection).then(alt.value(1)).otherwise(alt.value(0.2))
).add_params(
selection
)
diff --git a/tests/examples_methods_syntax/interval_selection_map_quakes.py b/tests/examples_methods_syntax/interval_selection_map_quakes.py
index b45afe8da..f4e89ad65 100644
--- a/tests/examples_methods_syntax/interval_selection_map_quakes.py
+++ b/tests/examples_methods_syntax/interval_selection_map_quakes.py
@@ -38,7 +38,7 @@
).mark_circle(opacity=0.35, tooltip=True).encode(
longitude="lon:Q",
latitude="lat:Q",
- color=alt.condition(brush, alt.value("goldenrod"), alt.value("steelblue")),
+ color=alt.when(brush).then(alt.value("goldenrod")).otherwise(alt.value("steelblue")),
size=alt.Size("mag:Q").scale(type="pow", range=[1, 1000], domain=[0, 7], exponent=4),
).add_params(brush)
diff --git a/tests/examples_methods_syntax/lasagna_plot.py b/tests/examples_methods_syntax/lasagna_plot.py
index 0da7c44fd..31ab3ee40 100644
--- a/tests/examples_methods_syntax/lasagna_plot.py
+++ b/tests/examples_methods_syntax/lasagna_plot.py
@@ -8,10 +8,10 @@
source = data.stocks()
-color_condition = alt.condition(
- "month(datum.value) == 1 && date(datum.value) == 1",
- alt.value("black"),
- alt.value(None),
+color_condition = (
+ alt.when(alt.expr.month("datum.value") == 1, alt.expr.date("datum.value") == 1)
+ .then(alt.value("black"))
+ .otherwise(alt.value(None))
)
alt.Chart(source, width=300, height=100).transform_filter(
diff --git a/tests/examples_methods_syntax/layered_heatmap_text.py b/tests/examples_methods_syntax/layered_heatmap_text.py
index 7a61c08cb..ba56f8539 100644
--- a/tests/examples_methods_syntax/layered_heatmap_text.py
+++ b/tests/examples_methods_syntax/layered_heatmap_text.py
@@ -27,14 +27,15 @@
.title("Mean of Horsepower")
)
+color = (
+ alt.when(alt.datum.mean_horsepower > 150)
+ .then(alt.value("black"))
+ .otherwise(alt.value("white"))
+)
+
# Configure text
text = base.mark_text(baseline='middle').encode(
- alt.Text('mean_horsepower:Q', format=".0f"),
- color=alt.condition(
- alt.datum.mean_horsepower > 150,
- alt.value('black'),
- alt.value('white')
- )
+ alt.Text('mean_horsepower:Q', format=".0f"), color=color
)
# Draw the chart
diff --git a/tests/examples_methods_syntax/multiline_highlight.py b/tests/examples_methods_syntax/multiline_highlight.py
index c23bd0372..bbc7634e8 100644
--- a/tests/examples_methods_syntax/multiline_highlight.py
+++ b/tests/examples_methods_syntax/multiline_highlight.py
@@ -29,7 +29,7 @@
)
lines = base.mark_line().encode(
- size=alt.condition(~highlight, alt.value(1), alt.value(3))
+ size=alt.when(~highlight).then(alt.value(1)).otherwise(alt.value(3))
)
points + lines
diff --git a/tests/examples_methods_syntax/multiline_tooltip.py b/tests/examples_methods_syntax/multiline_tooltip.py
index 12ac92bf0..d2bd7ff8f 100644
--- a/tests/examples_methods_syntax/multiline_tooltip.py
+++ b/tests/examples_methods_syntax/multiline_tooltip.py
@@ -41,15 +41,16 @@
).add_params(
nearest
)
+when_near = alt.when(nearest)
# Draw points on the line, and highlight based on selection
points = line.mark_point().encode(
- opacity=alt.condition(nearest, alt.value(1), alt.value(0))
+ opacity=when_near.then(alt.value(1)).otherwise(alt.value(0))
)
# Draw text labels near the points, and highlight based on selection
text = line.mark_text(align="left", dx=5, dy=-5).encode(
- text=alt.condition(nearest, "y:Q", alt.value(" "))
+ text=when_near.then("y:Q").otherwise(alt.value(" "))
)
# Draw a rule at the location of the selection
diff --git a/tests/examples_methods_syntax/multiline_tooltip_standard.py b/tests/examples_methods_syntax/multiline_tooltip_standard.py
index 990aa2015..bbab79d46 100644
--- a/tests/examples_methods_syntax/multiline_tooltip_standard.py
+++ b/tests/examples_methods_syntax/multiline_tooltip_standard.py
@@ -28,10 +28,11 @@
y="y:Q",
color="category:N"
)
+when_near = alt.when(nearest)
# Draw points on the line, and highlight based on selection
points = line.mark_point().encode(
- opacity=alt.condition(nearest, alt.value(1), alt.value(0))
+ opacity=when_near.then(alt.value(1)).otherwise(alt.value(0))
)
# Draw a rule at the location of the selection
@@ -41,7 +42,7 @@
groupby=["x"]
).mark_rule(color="gray").encode(
x="x:Q",
- opacity=alt.condition(nearest, alt.value(0.3), alt.value(0)),
+ opacity=when_near.then(alt.value(0.3)).otherwise(alt.value(0)),
tooltip=[alt.Tooltip(c, type="quantitative") for c in columns],
).add_params(nearest)
diff --git a/tests/examples_methods_syntax/multiple_interactions.py b/tests/examples_methods_syntax/multiple_interactions.py
index 0d0ff0ef9..cab614148 100644
--- a/tests/examples_methods_syntax/multiple_interactions.py
+++ b/tests/examples_methods_syntax/multiple_interactions.py
@@ -62,32 +62,32 @@
rating_radio = alt.binding_radio(options=ratings, name="Rating")
rating_select = alt.selection_point(fields=['MPAA_Rating'], bind=rating_radio)
-rating_color_condition = alt.condition(
- rating_select,
- alt.Color('MPAA_Rating:N').legend(None),
- alt.value('lightgray')
+rating_color = (
+ alt.when(rating_select)
+ .then(alt.Color("MPAA_Rating:N").legend(None))
+ .otherwise(alt.value("lightgray"))
)
highlight_ratings = base.add_params(
rating_select
).encode(
- color=rating_color_condition
+ color=rating_color
).properties(title="Radio Button Highlighting")
# Boolean selection for format changes
input_checkbox = alt.binding_checkbox(name="Big Budget Films ")
checkbox_selection = alt.param(bind=input_checkbox)
-size_checkbox_condition = alt.condition(
- checkbox_selection,
- alt.Size('Big_Budget_Film:N').scale(range=[25, 150]),
- alt.SizeValue(25)
+size_checkbox = (
+ alt.when(checkbox_selection)
+ .then(alt.Size('Big_Budget_Film:N').scale(range=[25, 150]))
+ .otherwise(alt.value(25))
)
budget_sizing = base.add_params(
checkbox_selection
).encode(
- size=size_checkbox_condition
+ size=size_checkbox
).properties(title="Checkbox Formatting")
(filter_year | budget_sizing) & (highlight_ratings | filter_genres)
diff --git a/tests/examples_methods_syntax/scatter_linked_table.py b/tests/examples_methods_syntax/scatter_linked_table.py
index 99979e074..d2fd3f317 100644
--- a/tests/examples_methods_syntax/scatter_linked_table.py
+++ b/tests/examples_methods_syntax/scatter_linked_table.py
@@ -18,7 +18,7 @@
points = alt.Chart(source).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
- color=alt.condition(brush, alt.value('steelblue'), alt.value('grey'))
+ color=alt.when(brush).then(alt.value("steelblue")).otherwise(alt.value("grey"))
).add_params(brush)
# Base chart for data tables
diff --git a/tests/examples_methods_syntax/scatter_point_paths_hover.py b/tests/examples_methods_syntax/scatter_point_paths_hover.py
index a6cc747c7..c6a9c5f19 100644
--- a/tests/examples_methods_syntax/scatter_point_paths_hover.py
+++ b/tests/examples_methods_syntax/scatter_point_paths_hover.py
@@ -53,14 +53,15 @@
"datum.country !== 'North Korea' && datum.country !== 'South Korea'"
)
+search_matches = alt.expr.test(alt.expr.regexp(search_box, "i"), alt.datum.country)
+opacity = (
+ alt.when(hover_point_opacity, search_matches)
+ .then(alt.value(0.8))
+ .otherwise(alt.value(0.1))
+)
# Points that are always visible (filtered by slider and search)
visible_points = base.mark_circle(size=100).encode(
- opacity=alt.condition(
- hover_point_opacity
- & alt.expr.test(alt.expr.regexp(search_box, 'i'), alt.datum.country),
- alt.value(0.8),
- alt.value(0.1)
- )
+ opacity=opacity
).transform_filter(
x_select
).add_params(
@@ -69,17 +70,18 @@
x_select
)
+when_hover = alt.when(hover)
hover_line = alt.layer(
# Line layer
base.mark_trail().encode(
alt.Order('year:Q').sort('ascending'),
alt.Size('year:Q').scale(domain=[1955, 2005], range=[1, 12]).legend(None),
- opacity=alt.condition(hover, alt.value(0.3), alt.value(0)),
+ opacity=when_hover.then(alt.value(0.3)).otherwise(alt.value(0)),
color=alt.value('#222222')
),
# Point layer
base.mark_point(size=50).encode(
- opacity=alt.condition(hover, alt.value(0.8), alt.value(0)),
+ opacity=when_hover.then(alt.value(0.8)).otherwise(alt.value(0)),
)
)
@@ -101,7 +103,7 @@
y='life_expect:Q',
text='country:N',
color=alt.value('black'),
- opacity=alt.condition(hover, alt.value(1), alt.value(0))
+ opacity=when_hover.then(alt.value(1)).otherwise(alt.value(0))
).transform_window(
rank='rank(life_expect)',
sort=[alt.SortField('life_expect', order='descending')],
diff --git a/tests/examples_methods_syntax/scatter_with_layered_histogram.py b/tests/examples_methods_syntax/scatter_with_layered_histogram.py
index 2cec75902..ce928f338 100644
--- a/tests/examples_methods_syntax/scatter_with_layered_histogram.py
+++ b/tests/examples_methods_syntax/scatter_with_layered_histogram.py
@@ -30,7 +30,11 @@
color_scale = alt.Scale(domain=['M', 'F'],
range=['#1FC3AA', '#8624F5'])
-
+color = (
+ alt.when(selector)
+ .then(alt.Color("gender:N").scale(color_scale))
+ .otherwise(alt.value("lightgray"))
+)
base = alt.Chart(source).properties(
width=250,
height=250
@@ -39,11 +43,7 @@
points = base.mark_point(filled=True, size=200).encode(
alt.X('mean(height):Q').scale(domain=[0,84]),
alt.Y('mean(weight):Q').scale(domain=[0,250]),
- color=alt.condition(
- selector,
- 'gender:N',
- alt.value('lightgray'),
- scale=color_scale),
+ color=color,
)
hists = base.mark_bar(opacity=0.5, thickness=100).encode(
diff --git a/tests/examples_methods_syntax/scatter_with_minimap.py b/tests/examples_methods_syntax/scatter_with_minimap.py
index 0ad0c634c..9faafa720 100644
--- a/tests/examples_methods_syntax/scatter_with_minimap.py
+++ b/tests/examples_methods_syntax/scatter_with_minimap.py
@@ -21,7 +21,7 @@
.encode(
x="date:T",
y="temp_max:Q",
- color=alt.condition(zoom, "weather", alt.value("lightgray")),
+ color=alt.when(zoom).then("weather").otherwise(alt.value("lightgray")),
)
.properties(
width=200,
diff --git a/tests/examples_methods_syntax/seattle_weather_interactive.py b/tests/examples_methods_syntax/seattle_weather_interactive.py
index 8c59a83d9..83c7f3e6b 100644
--- a/tests/examples_methods_syntax/seattle_weather_interactive.py
+++ b/tests/examples_methods_syntax/seattle_weather_interactive.py
@@ -29,7 +29,7 @@
.title('Maximum Daily Temperature (C)')
.scale(domain=[-5, 40]),
alt.Size('precipitation:Q').scale(range=[5, 200]),
- color=alt.condition(brush, color, alt.value('lightgray')),
+ color=alt.when(brush).then(color).otherwise(alt.value("lightgray")),
).properties(
width=550,
height=300
@@ -43,7 +43,7 @@
bars = alt.Chart().mark_bar().encode(
x='count()',
y='weather:N',
- color=alt.condition(click, color, alt.value('lightgray')),
+ color=alt.when(click).then(color).otherwise(alt.value("lightgray")),
).transform_filter(
brush
).properties(
diff --git a/tests/examples_methods_syntax/select_detail.py b/tests/examples_methods_syntax/select_detail.py
index 58bdb9dfd..10140bae8 100644
--- a/tests/examples_methods_syntax/select_detail.py
+++ b/tests/examples_methods_syntax/select_detail.py
@@ -42,6 +42,11 @@
# Data is prepared, now make a chart
selector = alt.selection_point(fields=['id'])
+color = (
+ alt.when(selector)
+ .then(alt.Color("id:O").legend(None))
+ .otherwise(alt.value("lightgray"))
+)
base = alt.Chart(data).properties(
width=250,
@@ -51,7 +56,7 @@
points = base.mark_point(filled=True, size=200).encode(
x='mean(x)',
y='mean(y)',
- color=alt.condition(selector, 'id:O', alt.value('lightgray'), legend=None),
+ color=color,
)
line = base.mark_line().encode(
diff --git a/tests/examples_methods_syntax/us_employment.py b/tests/examples_methods_syntax/us_employment.py
index 775973abf..24272d44d 100644
--- a/tests/examples_methods_syntax/us_employment.py
+++ b/tests/examples_methods_syntax/us_employment.py
@@ -21,6 +21,7 @@
"president": "Obama"
}
])
+predicate = alt.datum.nonfarm_change > 0
bars = alt.Chart(
source,
@@ -28,11 +29,7 @@
).mark_bar().encode(
alt.X("month:T").title(""),
alt.Y("nonfarm_change:Q").title("Change in non-farm employment (in thousands)"),
- color=alt.condition(
- alt.datum.nonfarm_change > 0,
- alt.value("steelblue"),
- alt.value("orange")
- )
+ color=alt.when(predicate).then(alt.value("steelblue")).otherwise(alt.value("orange")),
)
rule = alt.Chart(presidents).mark_rule(
diff --git a/tests/examples_methods_syntax/us_state_capitals.py b/tests/examples_methods_syntax/us_state_capitals.py
index d9f1390a2..9803cafc5 100644
--- a/tests/examples_methods_syntax/us_state_capitals.py
+++ b/tests/examples_methods_syntax/us_state_capitals.py
@@ -32,12 +32,12 @@
text = base.mark_text(dy=-5, align='right').encode(
alt.Text('city:N'),
- opacity=alt.condition(~hover, alt.value(0), alt.value(1))
+ opacity=alt.when(~hover).then(alt.value(0)).otherwise(alt.value(1))
)
points = base.mark_point().encode(
color=alt.value('black'),
- size=alt.condition(~hover, alt.value(30), alt.value(100))
+ size=alt.when(~hover).then(alt.value(30)).otherwise(alt.value(100))
).add_params(hover)
background + points + text
From 613b6e48db7651dd8977bb8344fa1d029650234b Mon Sep 17 00:00:00 2001
From: Marco Edward Gorelli
Date: Sun, 3 Nov 2024 16:05:06 +0000
Subject: [PATCH 06/53] chore: use more robust dtype comparisons, use Narwhals
stable API in tests (#3670)
---
altair/utils/core.py | 7 +++++--
tests/test_transformed_data.py | 2 +-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/altair/utils/core.py b/altair/utils/core.py
index acc7c2810..9143a1ec5 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -709,11 +709,14 @@ def infer_vegalite_type_for_narwhals(
and not (categories := column.cat.get_categories()).is_empty()
):
return "ordinal", categories.to_list()
- if dtype in {nw.String, nw.Categorical, nw.Boolean}:
+ if dtype == nw.String or dtype == nw.Categorical or dtype == nw.Boolean: # noqa: PLR1714
return "nominal"
elif dtype.is_numeric():
return "quantitative"
- elif dtype in {nw.Datetime, nw.Date}:
+ elif dtype == nw.Datetime or dtype == nw.Date: # noqa: PLR1714
+ # We use `== nw.Datetime` to check for any kind of Datetime, regardless of time
+ # unit and time zone. Prefer this over `dtype in {nw.Datetime, nw.Date}`,
+ # see https://narwhals-dev.github.io/narwhals/backcompat.
return "temporal"
else:
msg = f"Unexpected DtypeKind: {dtype}"
diff --git a/tests/test_transformed_data.py b/tests/test_transformed_data.py
index ee689ff68..1196c7b07 100644
--- a/tests/test_transformed_data.py
+++ b/tests/test_transformed_data.py
@@ -7,7 +7,7 @@
import altair as alt
from altair.utils.execeval import eval_block
from tests import examples_methods_syntax, slow, ignore_DataFrameGroupBy
-import narwhals as nw
+import narwhals.stable.v1 as nw
try:
import vegafusion as vf
From c28dbb9a7afeb7903d5c282cf7ac53b5524b2fd4 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Sun, 3 Nov 2024 16:20:52 +0000
Subject: [PATCH 07/53] fix: Resolve `alt.binding` signature/docstring issues
(#3671)
---
altair/vegalite/v5/api.py | 48 ++++++++++++++++++++++++++++++++---
tests/vegalite/v5/test_api.py | 37 +++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 4 deletions(-)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index 51d3f2cac..d4868cf1b 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -105,6 +105,7 @@
AnyMark,
BindCheckbox,
Binding,
+ BindInput,
BindRadioSelect,
BindRange,
BinParams,
@@ -1751,10 +1752,49 @@ def selection_single(**kwargs: Any) -> Parameter:
return _selection(type="point", **kwargs)
-@utils.use_signature(core.Binding)
-def binding(input: Any, **kwargs: Any) -> Binding:
- """A generic binding."""
- return core.Binding(input=input, **kwargs)
+def binding(
+ input: str,
+ *,
+ autocomplete: Optional[str] = Undefined,
+ debounce: Optional[float] = Undefined,
+ element: Optional[str] = Undefined,
+ name: Optional[str] = Undefined,
+ placeholder: Optional[str] = Undefined,
+) -> BindInput:
+ """
+ A generic binding.
+
+ Parameters
+ ----------
+ input : str
+ The type of input element to use. The valid values are ``"checkbox"``, ``"radio"``,
+ ``"range"``, ``"select"``, and any other legal `HTML form input type
+ `__.
+ autocomplete : str
+ A hint for form autofill. See the `HTML autocomplete attribute
+ `__ for
+ additional information.
+ debounce : float
+ If defined, delays event handling until the specified milliseconds have elapsed
+ since the last event was fired.
+ element : str
+ An optional CSS selector string indicating the parent element to which the input
+ element should be added. By default, all input elements are added within the parent
+ container of the Vega view.
+ name : str
+ By default, the signal name is used to label input elements. This ``name`` property
+ can be used instead to specify a custom label for the bound signal.
+ placeholder : str
+ Text that appears in the form control when it has no value set.
+ """
+ return core.BindInput(
+ autocomplete=autocomplete,
+ debounce=debounce,
+ element=element,
+ input=input,
+ name=name,
+ placeholder=placeholder,
+ )
@utils.use_signature(core.BindCheckbox)
diff --git a/tests/vegalite/v5/test_api.py b/tests/vegalite/v5/test_api.py
index ac184f86c..f6cd4ee6d 100644
--- a/tests/vegalite/v5/test_api.py
+++ b/tests/vegalite/v5/test_api.py
@@ -24,10 +24,13 @@
from packaging.version import Version
import altair as alt
+from altair.utils.core import use_signature
from altair.utils.schemapi import Optional, SchemaValidationError, Undefined
from tests import skip_requires_vl_convert, slow
if TYPE_CHECKING:
+ from typing import Any
+
from altair.vegalite.v5.api import _Conditional, _Conditions
from altair.vegalite.v5.schema._typing import Map
@@ -1654,3 +1657,37 @@ def test_ibis_with_vegafusion(monkeypatch: pytest.MonkeyPatch):
{"a": 2, "b": "2020-01-02T00:00:00.000"},
{"a": 3, "b": "2020-01-03T00:00:00.000"},
]
+
+
+def test_binding() -> None:
+ @use_signature(alt.Binding)
+ def old_binding(input: Any, **kwargs: Any) -> alt.Binding:
+ """A generic binding."""
+ return alt.Binding(input=input, **kwargs)
+
+ # NOTE: `mypy` doesn't complain, but `pyright` does
+ old = old_binding(input="search", placeholder="Country", name="Search") # pyright: ignore[reportCallIssue]
+ old_positional = old_binding("search", placeholder="Country", name="Search")
+
+ new = alt.binding(input="search", placeholder="Country", name="Search")
+ new_positional = alt.binding("search", placeholder="Country", name="Search")
+
+ assert (
+ old.to_dict()
+ == old_positional.to_dict()
+ == new.to_dict()
+ == new_positional.to_dict()
+ )
+ assert all(
+ isinstance(x, alt.Binding) for x in (old, old_positional, new, new_positional)
+ )
+
+ MISSING_INPUT = r"missing 1 required positional argument: 'input"
+
+ # NOTE: `mypy` doesn't complain, but `pyright` does (Again)
+ with pytest.raises(TypeError, match=MISSING_INPUT):
+ old_binding(placeholder="Country", name="Search") # pyright: ignore[reportCallIssue]
+
+ # NOTE: Both type checkers can detect the issue on the new signature
+ with pytest.raises(TypeError, match=MISSING_INPUT):
+ alt.binding(placeholder="Country", name="Search") # type: ignore[call-arg]
From c5d3bdfdd6200002f81f8aea20fb762bc76b6b22 Mon Sep 17 00:00:00 2001
From: Marco Edward Gorelli
Date: Sun, 3 Nov 2024 20:21:42 +0000
Subject: [PATCH 08/53] ci: use duckdb instead of ibis to test interchange-only
support (#3672)
Co-authored-by: dangotbanned <125183946+dangotbanned@users.noreply.github.com>
---
altair/utils/data.py | 5 +-
pyproject.toml | 2 +-
tests/__init__.py | 60 ++++++++++++++++-----
tests/utils/test_to_values_narwhals.py | 20 +------
tests/utils/test_utils.py | 4 --
tests/vegalite/v5/test_api.py | 75 ++++++++++++++++----------
6 files changed, 101 insertions(+), 65 deletions(-)
diff --git a/altair/utils/data.py b/altair/utils/data.py
index 91ed54a51..89ec31f1f 100644
--- a/altair/utils/data.py
+++ b/altair/utils/data.py
@@ -65,8 +65,9 @@ class SupportsGeoInterface(Protocol):
def is_data_type(obj: Any) -> TypeIs[DataType]:
- return _is_pandas_dataframe(obj) or isinstance(
- obj, (dict, DataFrameLike, SupportsGeoInterface, nw.DataFrame)
+ return isinstance(obj, (dict, SupportsGeoInterface)) or isinstance(
+ nw.from_native(obj, eager_or_interchange_only=True, strict=False),
+ nw.DataFrame,
)
diff --git a/pyproject.toml b/pyproject.toml
index 21c1a1342..5b5da88f9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -69,7 +69,7 @@ all = [
dev = [
"hatch",
"ruff>=0.6.0",
- "ibis-framework[polars]",
+ "duckdb>=1.0",
"ipython[kernel]",
"pandas>=1.1.3",
"pytest",
diff --git a/tests/__init__.py b/tests/__init__.py
index de79de20b..1cda56438 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -2,16 +2,17 @@
import pkgutil
import re
+import sys
from importlib.util import find_spec
-from typing import TYPE_CHECKING
+from pathlib import Path
+from typing import TYPE_CHECKING, Any
import pytest
from tests import examples_arguments_syntax, examples_methods_syntax
if TYPE_CHECKING:
- import sys
- from collections.abc import Collection, Iterator, Mapping
+ from collections.abc import Callable, Collection, Iterator, Mapping
from re import Pattern
if sys.version_info >= (3, 11):
@@ -24,6 +25,21 @@
"pytest.MarkDecorator | Collection[pytest.MarkDecorator | pytest.Mark]"
)
+
+def windows_has_tzdata() -> bool:
+ """
+ From PyArrow: python/pyarrow/tests/util.py.
+
+ This is the default location where tz.cpp will look for (until we make
+ this configurable at run-time)
+
+ Skip test on Windows when the tz database is not configured.
+
+ See https://github.com/vega/altair/issues/3050.
+ """
+ return (Path.home() / "Downloads" / "tzdata").exists()
+
+
slow: pytest.MarkDecorator = pytest.mark.slow()
"""
Custom ``pytest.mark`` decorator.
@@ -69,17 +85,37 @@
"""
-skip_requires_pyarrow: pytest.MarkDecorator = pytest.mark.skipif(
- find_spec("pyarrow") is None, reason="`pyarrow` not installed."
-)
-"""
-``pytest.mark.skipif`` decorator.
+def skip_requires_pyarrow(
+ fn: Callable[..., Any] | None = None, /, *, requires_tzdata: bool = False
+) -> Callable[..., Any]:
+ """
+ ``pytest.mark.skipif`` decorator.
-Applies when `pyarrow`_ import would fail.
+ Applies when `pyarrow`_ import would fail.
-.. _pyarrow:
- https://pypi.org/project/pyarrow/
-"""
+ Additionally, we mark as expected to fail on `Windows`.
+
+ https://github.com/vega/altair/issues/3050
+
+ .. _pyarrow:
+ https://pypi.org/project/pyarrow/
+ """
+ composed = pytest.mark.skipif(
+ find_spec("pyarrow") is None, reason="`pyarrow` not installed."
+ )
+ if requires_tzdata:
+ composed = pytest.mark.xfail(
+ sys.platform == "win32" and not windows_has_tzdata(),
+ reason="Timezone database is not installed on Windows",
+ )(composed)
+
+ def wrap(test_fn: Callable[..., Any], /) -> Callable[..., Any]:
+ return composed(test_fn)
+
+ if fn is None:
+ return wrap
+ else:
+ return wrap(fn)
def id_func_str_only(val) -> str:
diff --git a/tests/utils/test_to_values_narwhals.py b/tests/utils/test_to_values_narwhals.py
index 81cc5d348..2c7b3c7de 100644
--- a/tests/utils/test_to_values_narwhals.py
+++ b/tests/utils/test_to_values_narwhals.py
@@ -1,7 +1,5 @@
import re
-import sys
from datetime import datetime
-from pathlib import Path
import narwhals.stable.v1 as nw
import pandas as pd
@@ -11,23 +9,7 @@
from tests import skip_requires_pyarrow
-def windows_has_tzdata():
- """
- From PyArrow: python/pyarrow/tests/util.py.
-
- This is the default location where tz.cpp will look for (until we make
- this configurable at run-time)
- """
- return Path.home().joinpath("Downloads", "tzdata").exists()
-
-
-# Skip test on Windows when the tz database is not configured.
-# See https://github.com/vega/altair/issues/3050.
-@pytest.mark.skipif(
- sys.platform == "win32" and not windows_has_tzdata(),
- reason="Timezone database is not installed on Windows",
-)
-@skip_requires_pyarrow
+@skip_requires_pyarrow(requires_tzdata=True)
def test_arrow_timestamp_conversion():
"""Test that arrow timestamp values are converted to ISO-8601 strings."""
import pyarrow as pa
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index f83f76528..4b542f0c3 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -1,6 +1,5 @@
import io
import json
-import sys
import narwhals.stable.v1 as nw
import numpy as np
@@ -121,9 +120,6 @@ def test_sanitize_dataframe_arrow_columns():
@skip_requires_pyarrow
-@pytest.mark.xfail(
- sys.platform == "win32", reason="Timezone database is not installed on Windows"
-)
def test_sanitize_pyarrow_table_columns() -> None:
import pyarrow as pa
diff --git a/tests/vegalite/v5/test_api.py b/tests/vegalite/v5/test_api.py
index f6cd4ee6d..7c4b6a151 100644
--- a/tests/vegalite/v5/test_api.py
+++ b/tests/vegalite/v5/test_api.py
@@ -15,7 +15,7 @@
from importlib.util import find_spec
from typing import TYPE_CHECKING
-import ibis
+import duckdb
import jsonschema
import narwhals.stable.v1 as nw
import pandas as pd
@@ -26,7 +26,7 @@
import altair as alt
from altair.utils.core import use_signature
from altair.utils.schemapi import Optional, SchemaValidationError, Undefined
-from tests import skip_requires_vl_convert, slow
+from tests import skip_requires_pyarrow, skip_requires_vl_convert, slow
if TYPE_CHECKING:
from typing import Any
@@ -1607,20 +1607,15 @@ def test_polars_with_pandas_nor_pyarrow(monkeypatch: pytest.MonkeyPatch):
assert "numpy" not in sys.modules
-@pytest.mark.skipif(
- Version("1.5") > PANDAS_VERSION,
- reason="A warning is thrown on old pandas versions",
-)
-@pytest.mark.xfail(
- sys.platform == "win32", reason="Timezone database is not installed on Windows"
-)
-def test_ibis_with_date_32():
- ibis.set_backend("polars")
- df = pl.DataFrame(
+@skip_requires_pyarrow(requires_tzdata=True)
+def test_interchange_with_date_32():
+ # Test that objects which Narwhals only supports at the interchange
+ # level can be plotted when they contain date32 columns.
+ df = pl.DataFrame( # noqa: F841
{"a": [1, 2, 3], "b": [date(2020, 1, 1), date(2020, 1, 2), date(2020, 1, 3)]}
)
- tbl = ibis.memtable(df)
- result = alt.Chart(tbl).mark_line().encode(x="a", y="b").to_dict()
+ rel = duckdb.sql("select * from df")
+ result = alt.Chart(rel).mark_line().encode(x="a", y="b").to_dict()
assert next(iter(result["datasets"].values())) == [
{"a": 1, "b": "2020-01-01T00:00:00"},
{"a": 2, "b": "2020-01-02T00:00:00"},
@@ -1628,30 +1623,56 @@ def test_ibis_with_date_32():
]
-@pytest.mark.skipif(
- Version("1.5") > PANDAS_VERSION,
- reason="A warning is thrown on old pandas versions",
-)
-@pytest.mark.xfail(
- sys.platform == "win32", reason="Timezone database is not installed on Windows"
-)
-def test_ibis_with_vegafusion(monkeypatch: pytest.MonkeyPatch):
- ibis.set_backend("polars")
- df = pl.DataFrame(
+@skip_requires_pyarrow(requires_tzdata=True)
+def test_interchange_with_vegafusion(monkeypatch: pytest.MonkeyPatch):
+ # Test that objects which Narwhals only supports at the interchange
+ # level don't get converted to PyArrow unnecessarily when plotted
+ # with the vegafusion transformer.
+ # TODO: this test can be drastically simplified when some level of
+ # DuckDB support in VegaFusion, as it can then just be `alt.Chart(rel_df)`
+ # without DuckDBWithInterchangeSupport.
+ df = pl.DataFrame( # noqa: F841
{
"a": [1, 2, 3],
"b": [datetime(2020, 1, 1), datetime(2020, 1, 2), datetime(2020, 1, 3)],
}
)
- tbl = ibis.memtable(df)
+ rel = duckdb.sql("select * from df")
+
+ class DuckDBWithInterchangeSupport:
+ """
+ DuckDB doesn't (yet?) support the interchange protocol.
+
+ So, we create duckdb wrapper which defers to PyArrow's
+ implementation of the protocol.
+ """
+
+ def __init__(self, rel: duckdb.DuckDBPyRelation) -> None:
+ self._rel = rel
+
+ def __dataframe__(self, allow_copy: bool = True) -> object:
+ return self._rel.to_arrow_table().__dataframe__()
+
+ rel_df = DuckDBWithInterchangeSupport(rel)
# "poison" `arrow_table_from_dfi_dataframe` to check that it does not get called
# if we use the vegafusion transformer
monkeypatch.setattr(
"altair.utils.data.arrow_table_from_dfi_dataframe", lambda x: 1 / 0
)
- tbl = ibis.memtable(df)
+
+ # Narwhals doesn't fully support our custom DuckDBWithInterchangeSupport,
+ # so we need to overwrite `to_native`
+ def to_native(df, strict):
+ if isinstance(df, nw.DataFrame):
+ return rel_df
+ return df
+
+ monkeypatch.setattr("narwhals.stable.v1.to_native", to_native)
+
with alt.data_transformers.enable("vegafusion"):
- result = alt.Chart(tbl).mark_line().encode(x="a", y="b").to_dict(format="vega")
+ result = (
+ alt.Chart(rel_df).mark_line().encode(x="a", y="b").to_dict(format="vega")
+ )
assert next(iter(result["data"]))["values"] == [
{"a": 1, "b": "2020-01-01T00:00:00.000"},
{"a": 2, "b": "2020-01-02T00:00:00.000"},
From 64b2d33e13d5bdfd4b59b1cd0d44936815fbe5fa Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Sun, 3 Nov 2024 20:56:56 +0000
Subject: [PATCH 09/53] feat: Support `&`, `|`, `~` on all `...Predicate`
classes (#3668)
Co-authored-by: Mattijn van Hoek
---
altair/vegalite/v5/api.py | 26 +++++--------
altair/vegalite/v5/schema/core.py | 9 +++++
doc/user_guide/transform/filter.rst | 46 +++++++++++++---------
tests/vegalite/v5/test_api.py | 55 +++++++++++++++++++++++++++
tools/generate_schema_wrapper.py | 59 ++++++++++++++++++++++++++++-
tools/schemapi/codegen.py | 14 ++++---
6 files changed, 167 insertions(+), 42 deletions(-)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index d4868cf1b..14d47064c 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -410,25 +410,25 @@ def to_dict(self) -> dict[str, str | dict[str, Any]]:
msg = f"Unrecognized parameter type: {self.param_type}"
raise ValueError(msg)
- def __invert__(self) -> SelectionPredicateComposition | Any:
+ def __invert__(self) -> PredicateComposition | Any:
if self.param_type == "selection":
- return SelectionPredicateComposition({"not": {"param": self.name}})
+ return core.PredicateComposition({"not": {"param": self.name}})
else:
return _expr_core.OperatorMixin.__invert__(self)
- def __and__(self, other: Any) -> SelectionPredicateComposition | Any:
+ def __and__(self, other: Any) -> PredicateComposition | Any:
if self.param_type == "selection":
if isinstance(other, Parameter):
other = {"param": other.name}
- return SelectionPredicateComposition({"and": [{"param": self.name}, other]})
+ return core.PredicateComposition({"and": [{"param": self.name}, other]})
else:
return _expr_core.OperatorMixin.__and__(self, other)
- def __or__(self, other: Any) -> SelectionPredicateComposition | Any:
+ def __or__(self, other: Any) -> PredicateComposition | Any:
if self.param_type == "selection":
if isinstance(other, Parameter):
other = {"param": other.name}
- return SelectionPredicateComposition({"or": [{"param": self.name}, other]})
+ return core.PredicateComposition({"or": [{"param": self.name}, other]})
else:
return _expr_core.OperatorMixin.__or__(self, other)
@@ -458,15 +458,7 @@ def __getitem__(self, field_name: str) -> GetItemExpression:
# Enables use of ~, &, | with compositions of selection objects.
-class SelectionPredicateComposition(core.PredicateComposition):
- def __invert__(self) -> SelectionPredicateComposition:
- return SelectionPredicateComposition({"not": self.to_dict()})
-
- def __and__(self, other: SchemaBase) -> SelectionPredicateComposition:
- return SelectionPredicateComposition({"and": [self.to_dict(), other.to_dict()]})
-
- def __or__(self, other: SchemaBase) -> SelectionPredicateComposition:
- return SelectionPredicateComposition({"or": [self.to_dict(), other.to_dict()]})
+SelectionPredicateComposition = core.PredicateComposition
class ParameterExpression(_expr_core.OperatorMixin):
@@ -532,7 +524,7 @@ def check_fields_and_encodings(parameter: Parameter, field_name: str) -> bool:
"""Permitted types for `predicate`."""
_ComposablePredicateType: TypeAlias = Union[
- _expr_core.OperatorMixin, SelectionPredicateComposition
+ _expr_core.OperatorMixin, core.PredicateComposition
]
"""Permitted types for `&` reduced predicates."""
@@ -764,7 +756,7 @@ def _validate_composables(
predicates: Iterable[Any], /
) -> Iterator[_ComposablePredicateType]:
for p in predicates:
- if isinstance(p, (_expr_core.OperatorMixin, SelectionPredicateComposition)):
+ if isinstance(p, (_expr_core.OperatorMixin, core.PredicateComposition)):
yield p
else:
msg = (
diff --git a/altair/vegalite/v5/schema/core.py b/altair/vegalite/v5/schema/core.py
index 17ba53d10..51ae8ab5d 100644
--- a/altair/vegalite/v5/schema/core.py
+++ b/altair/vegalite/v5/schema/core.py
@@ -16153,6 +16153,15 @@ class PredicateComposition(VegaLiteSchema):
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
+ def __invert__(self) -> PredicateComposition:
+ return PredicateComposition({"not": self.to_dict()})
+
+ def __and__(self, other: SchemaBase) -> PredicateComposition:
+ return PredicateComposition({"and": [self.to_dict(), other.to_dict()]})
+
+ def __or__(self, other: SchemaBase) -> PredicateComposition:
+ return PredicateComposition({"or": [self.to_dict(), other.to_dict()]})
+
class LogicalAndPredicate(PredicateComposition):
"""
diff --git a/doc/user_guide/transform/filter.rst b/doc/user_guide/transform/filter.rst
index fb4c7420f..39c268210 100644
--- a/doc/user_guide/transform/filter.rst
+++ b/doc/user_guide/transform/filter.rst
@@ -157,35 +157,45 @@ to select the data to be shown in the top chart:
Logical Operands
^^^^^^^^^^^^^^^^
At times it is useful to combine several types of predicates into a single
-selection. This can be accomplished using the various logical operand classes:
+selection. We can use ``&``, ``|`` and ``~`` for respectively
+``AND``, ``OR`` and ``NOT`` logical composition operands.
-- :class:`~LogicalOrPredicate`
-- :class:`~LogicalAndPredicate`
-- :class:`~LogicalNotPredicate`
+For example, here we wish to plot US population distributions for all data *except* the years *1950-1960*.
-These are not yet part of the Altair interface
-(see `Issue 695 `_)
-but can be constructed explicitly; for example, here we plot US population
-distributions for all data *except* the years 1950-1960,
-by applying a ``LogicalNotPredicate`` schema to a ``FieldRangePredicate``:
+First, we use a :class:`~FieldRangePredicate` to select *1950-1960*:
.. altair-plot::
-
+ :output: none
+
import altair as alt
from vega_datasets import data
- pop = data.population.url
-
- alt.Chart(pop).mark_line().encode(
- x='age:O',
- y='sum(people):Q',
- color='year:O'
+ source = data.population.url
+ chart = alt.Chart(source).mark_line().encode(
+ x="age:O",
+ y="sum(people):Q",
+ color="year:O"
).properties(
width=600, height=200
- ).transform_filter(
- {'not': alt.FieldRangePredicate(field='year', range=[1950, 1960])}
)
+ between_1950_60 = alt.FieldRangePredicate(field="year", range=[1950, 1960])
+
+Then, we can *invert* this selection using ``~``:
+
+.. altair-plot::
+
+ # NOT between 1950-1960
+ chart.transform_filter(~between_1950_60)
+
+We can further refine our filter by *composing* multiple predicates together.
+In this case, using ``alt.datum``:
+
+.. altair-plot::
+
+ chart.transform_filter(~between_1950_60 & (alt.datum.age <= 70))
+
+
Transform Options
^^^^^^^^^^^^^^^^^
The :meth:`~Chart.transform_filter` method is built on the :class:`~FilterTransform`
diff --git a/tests/vegalite/v5/test_api.py b/tests/vegalite/v5/test_api.py
index 7c4b6a151..98b30a9b6 100644
--- a/tests/vegalite/v5/test_api.py
+++ b/tests/vegalite/v5/test_api.py
@@ -10,6 +10,7 @@
import re
import sys
import tempfile
+from collections.abc import Mapping
from datetime import date, datetime
from importlib.metadata import version as importlib_version
from importlib.util import find_spec
@@ -1192,6 +1193,60 @@ def test_filter_transform_selection_predicates():
]
+def test_predicate_composition() -> None:
+ columns = ["Drought", "Epidemic", "Earthquake", "Flood"]
+ field_one_of = alt.FieldOneOfPredicate(field="Entity", oneOf=columns)
+ field_range = alt.FieldRangePredicate(field="Year", range=[1900, 2000])
+ fields_and = field_one_of & field_range
+ expected_and = {
+ "and": [
+ {"field": "Entity", "oneOf": columns},
+ {"field": "Year", "range": [1900, 2000]},
+ ]
+ }
+ assert isinstance(fields_and, alt.PredicateComposition)
+ actual_and = fields_and.to_dict()
+
+ # NOTE: Extra guarantee that something hasn't overloaded `__eq__` or `to_dict`
+ assert isinstance(actual_and, Mapping)
+ assert isinstance(actual_and == expected_and, bool)
+
+ assert actual_and == expected_and
+
+ actual_when = (
+ alt.when(field_one_of, field_range).then(alt.value(0)).otherwise(alt.value(1))
+ )
+ expected_when = {"condition": [{"test": fields_and, "value": 0}], "value": 1}
+ assert actual_when == expected_when
+
+ field_range = alt.FieldRangePredicate(field="year", range=[1950, 1960])
+ field_range_not = ~field_range
+ expected_not = {"not": {"field": "year", "range": [1950, 1960]}}
+ assert isinstance(field_range_not, alt.PredicateComposition)
+ actual_not = field_range_not.to_dict()
+ assert actual_not == expected_not
+
+ expected_or = alt.LogicalOrPredicate(
+ **{"or": [field_range, field_one_of]}
+ ).to_dict()
+ actual_or = (field_range | field_one_of).to_dict()
+ assert actual_or == expected_or
+
+ param_pred = alt.ParameterPredicate(param="dummy_1", empty=True)
+ field_eq = alt.FieldEqualPredicate(equal=999, field="measure")
+ field_gt = alt.FieldGTPredicate(gt=4, field="measure 2")
+ expected_multi = alt.LogicalOrPredicate(
+ **{
+ "or": [
+ alt.LogicalNotPredicate(**{"not": param_pred}),
+ alt.LogicalAndPredicate(**{"and": [field_eq, field_gt]}),
+ ]
+ }
+ ).to_dict()
+ actual_multi = (~param_pred | (field_eq & field_gt)).to_dict()
+ assert actual_multi == expected_multi
+
+
def test_resolve_methods():
chart = alt.LayerChart().resolve_axis(x="shared", y="independent")
assert chart.resolve == alt.Resolve(
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index e7307078a..70c3980e4 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -12,9 +12,14 @@
from itertools import chain
from operator import attrgetter
from pathlib import Path
-from typing import TYPE_CHECKING, Any, Final, Literal
+from typing import TYPE_CHECKING, Any, Final, Generic, Literal, TypedDict, TypeVar
from urllib import request
+if sys.version_info >= (3, 14):
+ from typing import TypedDict
+else:
+ from typing_extensions import TypedDict
+
import vl_convert as vlc
sys.path.insert(0, str(Path.cwd()))
@@ -317,6 +322,18 @@ def encode(self, *args: Any, {method_args}) -> Self:
return copy
'''
+# Enables use of ~, &, | with compositions of selection objects.
+DUNDER_PREDICATE_COMPOSITION = """
+ def __invert__(self) -> PredicateComposition:
+ return PredicateComposition({"not": self.to_dict()})
+
+ def __and__(self, other: SchemaBase) -> PredicateComposition:
+ return PredicateComposition({"and": [self.to_dict(), other.to_dict()]})
+
+ def __or__(self, other: SchemaBase) -> PredicateComposition:
+ return PredicateComposition({"or": [self.to_dict(), other.to_dict()]})
+"""
+
# NOTE: Not yet reasonable to generalize `TypeAliasType`, `TypeVar`
# Revisit if this starts to become more common
@@ -431,6 +448,37 @@ class {classname}({basename}):
)
+class MethodSchemaGenerator(SchemaGenerator):
+ """Base template w/ an extra slot `{method_code}` after `{init_code}`."""
+
+ schema_class_template = textwrap.dedent(
+ '''
+ class {classname}({basename}):
+ """{docstring}"""
+ _schema = {schema!r}
+
+ {init_code}
+
+ {method_code}
+ '''
+ )
+
+
+SchGen = TypeVar("SchGen", bound=SchemaGenerator)
+
+
+class OverridesItem(TypedDict, Generic[SchGen]):
+ tp: type[SchGen]
+ kwds: dict[str, Any]
+
+
+CORE_OVERRIDES: dict[str, OverridesItem[SchemaGenerator]] = {
+ "PredicateComposition": OverridesItem(
+ tp=MethodSchemaGenerator, kwds={"method_code": DUNDER_PREDICATE_COMPOSITION}
+ )
+}
+
+
class FieldSchemaGenerator(SchemaGenerator):
schema_class_template = textwrap.dedent(
'''
@@ -656,13 +704,20 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> str:
defschema = {"$ref": "#/definitions/" + name}
defschema_repr = {"$ref": "#/definitions/" + name}
name = get_valid_identifier(name)
- definitions[name] = SchemaGenerator(
+ if overrides := CORE_OVERRIDES.get(name):
+ tp = overrides["tp"]
+ kwds = overrides["kwds"]
+ else:
+ tp = SchemaGenerator
+ kwds = {}
+ definitions[name] = tp(
name,
schema=defschema,
schemarepr=defschema_repr,
rootschema=rootschema,
basename=basename,
rootschemarepr=CodeSnippet(f"{basename}._rootschema"),
+ **kwds,
)
for name, schema in definitions.items():
graph[name] = []
diff --git a/tools/schemapi/codegen.py b/tools/schemapi/codegen.py
index 47d96dcd7..37d512087 100644
--- a/tools/schemapi/codegen.py
+++ b/tools/schemapi/codegen.py
@@ -260,16 +260,20 @@ def schema_class(self) -> str:
basename = self.basename
else:
basename = ", ".join(self.basename)
+ docstring = self.docstring(indent=4)
+ init_code = self.init_code(indent=4)
+ if type(self).haspropsetters:
+ method_code = self.overload_code(indent=4)
+ else:
+ method_code = self.kwargs.pop("method_code", None)
return self.schema_class_template.format(
classname=self.classname,
basename=basename,
schema=schemarepr,
rootschema=rootschemarepr,
- docstring=self.docstring(indent=4),
- init_code=self.init_code(indent=4),
- method_code=(
- self.overload_code(indent=4) if type(self).haspropsetters else None
- ),
+ docstring=docstring,
+ init_code=init_code,
+ method_code=method_code,
**self.kwargs,
)
From 8fdd5379ccf87dd43a4190ad1b1583b99934f778 Mon Sep 17 00:00:00 2001
From: dsmedia <63077097+dsmedia@users.noreply.github.com>
Date: Sun, 3 Nov 2024 16:09:33 -0500
Subject: [PATCH 10/53] docs: Add initial date range to interval selection
example (#3667)
---
.../interval_selection.py | 15 ++++++++++-----
.../examples_methods_syntax/interval_selection.py | 15 ++++++++++-----
2 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/tests/examples_arguments_syntax/interval_selection.py b/tests/examples_arguments_syntax/interval_selection.py
index e32ba3f7a..3065a8732 100644
--- a/tests/examples_arguments_syntax/interval_selection.py
+++ b/tests/examples_arguments_syntax/interval_selection.py
@@ -1,17 +1,22 @@
"""
-Interval Selection
-==================
+Interval Selection with Initial Date Range
+==========================================
This is an example of creating a stacked chart for which the domain of the
-top chart can be selected by interacting with the bottom chart.
+top chart can be selected by interacting with the bottom chart. The initial
+selection range is set using Python's native datetime objects.
"""
-# category: area charts
+# category: interactive charts
import altair as alt
from vega_datasets import data
+import datetime as dt
source = data.sp500.url
-brush = alt.selection_interval(encodings=['x'])
+date_range = (dt.date(2007, 6, 30), dt.date(2009, 6, 30))
+
+brush = alt.selection_interval(encodings=['x'],
+ value={'x': date_range})
base = alt.Chart(source).mark_area().encode(
x = 'date:T',
diff --git a/tests/examples_methods_syntax/interval_selection.py b/tests/examples_methods_syntax/interval_selection.py
index b77f83b57..811384717 100644
--- a/tests/examples_methods_syntax/interval_selection.py
+++ b/tests/examples_methods_syntax/interval_selection.py
@@ -1,17 +1,22 @@
"""
-Interval Selection
-==================
+Interval Selection with Initial Date Range
+==========================================
This is an example of creating a stacked chart for which the domain of the
-top chart can be selected by interacting with the bottom chart.
+top chart can be selected by interacting with the bottom chart. The initial
+selection range is set using Python's native datetime objects.
"""
-# category: area charts
+# category: interactive charts
import altair as alt
from vega_datasets import data
+import datetime as dt
source = data.sp500.url
-brush = alt.selection_interval(encodings=['x'])
+date_range = (dt.date(2007, 6, 30), dt.date(2009, 6, 30))
+
+brush = alt.selection_interval(encodings=['x'],
+ value={'x': date_range})
base = alt.Chart(source, width=600, height=200).mark_area().encode(
x = 'date:T',
From ed40320f0fa709d9f096c94cc0b69aab9272aa48 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 4 Nov 2024 09:15:25 +0000
Subject: [PATCH 11/53] test: Add missing
`@skip_requires_pyarrow(requires_tzdata=True)` (#3674)
---
tests/utils/test_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index 4b542f0c3..bb2d049c3 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -119,7 +119,7 @@ def test_sanitize_dataframe_arrow_columns():
json.dumps(records)
-@skip_requires_pyarrow
+@skip_requires_pyarrow(requires_tzdata=True)
def test_sanitize_pyarrow_table_columns() -> None:
import pyarrow as pa
From 78f50e521f3e326490769eb202340d30e073b3cc Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 4 Nov 2024 21:16:55 +0000
Subject: [PATCH 12/53] ci: Support Python 3.13 (#3591)
* ci: Support Python 3.13
Minimal/fallback support for `3.13`.
Ideally I'd like to minimise hard dependencies we have on `typing_extensions` before October 2024.
However, this would be the simpler option if it passes CI
Resolves https://github.com/vega/altair/issues/3587
* ci: Bump `hatch>=1.13.0`
Adds `python=3.13.*` support
https://github.com/pypa/hatch/releases/tag/hatch-v1.13.0
* ci: Disable `allow-prereleases`
Basising this off of https://github.com/narwhals-dev/narwhals/pull/1094/commits/97ebe2c74d529b6c8fb74bc45dfa17a752268e17
* ci: Bump `pyarrow`, remove `pillow` upper bound
Seems to be able to build (sometimes) with these changes.
Still fails a good chunk of the tests
* revert: (7f11fafe33c1bf483401cc7c903dec67e4b077cf)
---
.github/workflows/build.yml | 2 +-
pyproject.toml | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index e22134769..4b72165af 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- python-version: ["3.9", "3.10", "3.11", "3.12"]
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
jsonschema-version: ["3.0", "latest"]
name: py ${{ matrix.python-version }} js ${{ matrix.jsonschema-version }}
steps:
diff --git a/pyproject.toml b/pyproject.toml
index 5b5da88f9..a9fe93f8e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -45,6 +45,7 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
"Typing :: Typed",
]
@@ -67,7 +68,7 @@ all = [
"altair_tiles>=0.3.0"
]
dev = [
- "hatch",
+ "hatch>=1.13.0",
"ruff>=0.6.0",
"duckdb>=1.0",
"ipython[kernel]",
@@ -147,7 +148,7 @@ features = ["all", "dev", "doc"]
default-args = ["--numprocesses=logical","--doctest-modules", "tests", "altair", "tools"]
parallel = true
[[tool.hatch.envs.hatch-test.matrix]]
-python = ["3.9", "3.10", "3.11", "3.12"]
+python = ["3.9", "3.10", "3.11", "3.12", "3.13"]
[tool.hatch.envs.hatch-test.scripts]
run = [
"ruff check .",
From 085a6b637e9baf37baf62dac760a069cf09abe95 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Tue, 5 Nov 2024 16:03:33 +0000
Subject: [PATCH 13/53] chore(typing): Resolve or ignore `pyright`-only
warnings (#3676)
---
altair/_magics.py | 35 ++++----
altair/utils/_dfi_types.py | 6 ++
altair/utils/core.py | 10 +--
altair/vegalite/v5/display.py | 8 +-
pyproject.toml | 18 ++--
sphinxext/altairgallery.py | 6 +-
sphinxext/code_ref.py | 22 ++---
sphinxext/schematable.py | 15 ++--
sphinxext/utils.py | 12 +--
tests/__init__.py | 11 +++
tests/test_magics.py | 114 +++++++++++++-----------
tests/utils/test_compiler.py | 4 +-
tests/utils/test_core.py | 2 +-
tests/utils/test_data.py | 16 +++-
tests/utils/test_html.py | 4 +-
tests/utils/test_mimebundle.py | 13 ++-
tests/utils/test_plugin_registry.py | 16 +++-
tests/utils/test_schemapi.py | 30 +++----
tests/utils/test_utils.py | 2 +-
tests/vegalite/v5/test_geo_interface.py | 31 ++++---
20 files changed, 212 insertions(+), 163 deletions(-)
diff --git a/altair/_magics.py b/altair/_magics.py
index 05186367e..8f40080db 100644
--- a/altair/_magics.py
+++ b/altair/_magics.py
@@ -1,23 +1,18 @@
"""Magic functions for rendering vega-lite specifications."""
-__all__ = ["vegalite"]
+from __future__ import annotations
import json
import warnings
+from importlib.util import find_spec
+from typing import Any
-import IPython
from IPython.core import magic_arguments
from narwhals.dependencies import is_pandas_dataframe as _is_pandas_dataframe
from altair.vegalite import v5 as vegalite_v5
-try:
- import yaml
-
- YAML_AVAILABLE = True
-except ImportError:
- YAML_AVAILABLE = False
-
+__all__ = ["vegalite"]
RENDERERS = {
"vega-lite": {
@@ -48,19 +43,21 @@ def _prepare_data(data, data_transformers):
return data
-def _get_variable(name):
+def _get_variable(name: str) -> Any:
"""Get a variable from the notebook namespace."""
- ip = IPython.get_ipython()
- if ip is None:
+ from IPython.core.getipython import get_ipython
+
+ if ip := get_ipython():
+ if name not in ip.user_ns:
+ msg = f"argument '{name}' does not match the name of any defined variable"
+ raise NameError(msg)
+ return ip.user_ns[name]
+ else:
msg = (
"Magic command must be run within an IPython "
"environment, in which get_ipython() is defined."
)
raise ValueError(msg)
- if name not in ip.user_ns:
- msg = f"argument '{name}' does not match the name of any defined variable"
- raise NameError(msg)
- return ip.user_ns[name]
@magic_arguments.magic_arguments()
@@ -71,7 +68,7 @@ def _get_variable(name):
)
@magic_arguments.argument("-v", "--version", dest="version", default="v5")
@magic_arguments.argument("-j", "--json", dest="json", action="store_true")
-def vegalite(line, cell):
+def vegalite(line, cell) -> vegalite_v5.VegaLite:
"""
Cell magic for displaying vega-lite visualizations in CoLab.
@@ -91,7 +88,7 @@ def vegalite(line, cell):
if args.json:
spec = json.loads(cell)
- elif not YAML_AVAILABLE:
+ elif not find_spec("yaml"):
try:
spec = json.loads(cell)
except json.JSONDecodeError as err:
@@ -101,6 +98,8 @@ def vegalite(line, cell):
)
raise ValueError(msg) from err
else:
+ import yaml
+
spec = yaml.load(cell, Loader=yaml.SafeLoader)
if args.data is not None:
diff --git a/altair/utils/_dfi_types.py b/altair/utils/_dfi_types.py
index 086db6800..1b47ddd08 100644
--- a/altair/utils/_dfi_types.py
+++ b/altair/utils/_dfi_types.py
@@ -79,6 +79,7 @@ def dtype(self) -> tuple[Any, int, str, str]:
- Data types not included: complex, Arrow-style null, binary, decimal,
and nested (list, struct, map, union) dtypes.
"""
+ ...
# Have to use a generic Any return type as not all libraries who implement
# the dataframe interchange protocol implement the TypedDict that is usually
@@ -106,6 +107,7 @@ def describe_categorical(self) -> Any:
TBD: are there any other in-memory representations that are needed?
"""
+ ...
class DataFrame(Protocol):
@@ -137,12 +139,15 @@ def __dataframe__(
necessary if a library supports strided buffers, given that this protocol
specifies contiguous buffers.
"""
+ ...
def column_names(self) -> Iterable[str]:
"""Return an iterator yielding the column names."""
+ ...
def get_column_by_name(self, name: str) -> Column:
"""Return the column whose name is the indicated name."""
+ ...
def get_chunks(self, n_chunks: int | None = None) -> Iterable[DataFrame]:
"""
@@ -156,3 +161,4 @@ def get_chunks(self, n_chunks: int | None = None) -> Iterable[DataFrame]:
Note that the producer must ensure that all columns are chunked the
same way.
"""
+ ...
diff --git a/altair/utils/core.py b/altair/utils/core.py
index 9143a1ec5..669b81a06 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -222,7 +222,7 @@ def __dataframe__(
def infer_vegalite_type_for_pandas(
- data: object,
+ data: Any,
) -> InferredVegaLiteType | tuple[InferredVegaLiteType, list[Any]]:
"""
From an array-like input, infer the correct vega typecode.
@@ -231,7 +231,7 @@ def infer_vegalite_type_for_pandas(
Parameters
----------
- data: object
+ data: Any
"""
# This is safe to import here, as this function is only called on pandas input.
from pandas.api.types import infer_dtype
@@ -738,10 +738,10 @@ def use_signature(tp: Callable[P, Any], /):
"""
@overload
- def decorate(cb: WrapsMethod[T, R], /) -> WrappedMethod[T, P, R]: ...
+ def decorate(cb: WrapsMethod[T, R], /) -> WrappedMethod[T, P, R]: ... # pyright: ignore[reportOverlappingOverload]
@overload
- def decorate(cb: WrapsFunc[R], /) -> WrappedFunc[P, R]: ...
+ def decorate(cb: WrapsFunc[R], /) -> WrappedFunc[P, R]: ... # pyright: ignore[reportOverlappingOverload]
def decorate(cb: WrapsFunc[R], /) -> WrappedMethod[T, P, R] | WrappedFunc[P, R]:
"""
@@ -857,7 +857,7 @@ def from_cache(cls) -> _ChannelCache:
cached = _CHANNEL_CACHE
except NameError:
cached = cls.__new__(cls)
- cached.channel_to_name = _init_channel_to_name()
+ cached.channel_to_name = _init_channel_to_name() # pyright: ignore[reportAttributeAccessIssue]
cached.name_to_channel = _invert_group_channels(cached.channel_to_name)
_CHANNEL_CACHE = cached
return _CHANNEL_CACHE
diff --git a/altair/vegalite/v5/display.py b/altair/vegalite/v5/display.py
index 5d71a2934..dcc506958 100644
--- a/altair/vegalite/v5/display.py
+++ b/altair/vegalite/v5/display.py
@@ -125,10 +125,6 @@ def browser_renderer(
vegalite_version=VEGALITE_VERSION,
**metadata,
)
-
- if isinstance(mimebundle, tuple):
- mimebundle = mimebundle[0]
-
html = mimebundle["text/html"]
open_html_in_browser(html, using=using, port=port)
return {}
@@ -162,7 +158,9 @@ def browser_renderer(
renderers.register("json", json_renderer)
renderers.register("png", png_renderer)
renderers.register("svg", svg_renderer)
-renderers.register("jupyter", jupyter_renderer)
+# FIXME: Caused by upstream # type: ignore[unreachable]
+# https://github.com/manzt/anywidget/blob/b7961305a7304f4d3def1fafef0df65db56cf41e/anywidget/widget.py#L80-L81
+renderers.register("jupyter", jupyter_renderer) # pyright: ignore[reportArgumentType]
renderers.register("browser", browser_renderer)
renderers.register("olli", olli_renderer)
renderers.enable("default")
diff --git a/pyproject.toml b/pyproject.toml
index a9fe93f8e..ae15a8a4b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -457,18 +457,12 @@ include=[
"./doc/*.py",
"./tests/**/*.py",
"./tools/**/*.py",
+ "./sphinxext/**/*.py",
]
ignore=[
- "./altair/vegalite/v5/display.py",
- "./altair/vegalite/v5/schema/",
- "./altair/utils/core.py",
- "./altair/utils/_dfi_types.py",
- "./altair/_magics.py",
- "./altair/jupyter/",
- "./sphinxext/",
- "./tests/test_jupyter_chart.py",
- "./tests/utils/",
- "./tests/test_magics.py",
- "./tests/vegalite/v5/test_geo_interface.py",
- "../../../**/Lib", # stdlib
+ "./altair/vegalite/v5/schema/channels.py", # 716 warns
+ "./altair/vegalite/v5/schema/mixins.py", # 1001 warns
+ "./altair/jupyter/", # Mostly untyped
+ "./tests/test_jupyter_chart.py", # Based on untyped module
+ "../../../**/Lib", # stdlib
]
diff --git a/sphinxext/altairgallery.py b/sphinxext/altairgallery.py
index 062807d61..ea3a17837 100644
--- a/sphinxext/altairgallery.py
+++ b/sphinxext/altairgallery.py
@@ -14,7 +14,7 @@
from docutils import nodes
from docutils.parsers.rst import Directive
from docutils.parsers.rst.directives import flag
-from docutils.statemachine import ViewList
+from docutils.statemachine import StringList
from sphinx.util.nodes import nested_parse_with_titles
from altair.utils.execeval import eval_block
@@ -184,7 +184,7 @@ def save_example_pngs(
else:
# the file changed or the image file does not exist. Generate it.
print(f"-> saving {image_file!s}")
- chart = eval_block(code)
+ chart = eval_block(code, strict=True)
try:
chart.save(image_file)
hashes[filename] = example_hash
@@ -303,7 +303,7 @@ def run(self) -> list[Node]:
)
# parse and return documentation
- result = ViewList()
+ result = StringList()
for line in include.split("\n"):
result.append(line, "")
node = nodes.paragraph()
diff --git a/sphinxext/code_ref.py b/sphinxext/code_ref.py
index 8f5f4da0e..2eba68a6a 100644
--- a/sphinxext/code_ref.py
+++ b/sphinxext/code_ref.py
@@ -108,7 +108,7 @@ def gen() -> Iterator[nodes.Node]:
def theme_names() -> tuple[Sequence[str], Sequence[str]]:
- names: set[VegaThemes] = set(get_args(VegaThemes))
+ names: set[str] = set(get_args(VegaThemes))
carbon = {nm for nm in names if nm.startswith("carbon")}
return ["default", *sorted(names - carbon)], sorted(carbon)
@@ -180,8 +180,8 @@ class ThemeDirective(SphinxDirective):
https://pyscript.net/
"""
- has_content: ClassVar[Literal[False]] = False
- required_arguments: ClassVar[Literal[1]] = 1
+ has_content: ClassVar[bool] = False
+ required_arguments: ClassVar[int] = 1
option_spec = {
"packages": validate_packages,
"dropdown-label": directives.unchanged,
@@ -226,14 +226,16 @@ def run(self) -> Sequence[nodes.Node]:
)
results.append(raw_html("
\n"))
return maybe_details(
- results, self.options, default_summary="Show Vega-Altair Theme Test"
+ results,
+ self.options, # pyright: ignore[reportArgumentType]
+ default_summary="Show Vega-Altair Theme Test",
)
class PyScriptDirective(SphinxDirective):
"""Placeholder for non-theme related directive."""
- has_content: ClassVar[Literal[False]] = False
+ has_content: ClassVar[bool] = False
option_spec = {"packages": directives.unchanged}
def run(self) -> Sequence[nodes.Node]:
@@ -282,9 +284,9 @@ class CodeRefDirective(SphinxDirective):
https://github.com/vega/sphinxext-altair
"""
- has_content: ClassVar[Literal[False]] = False
- required_arguments: ClassVar[Literal[1]] = 1
- option_spec: ClassVar[dict[_Option, Callable[[str], Any]]] = {
+ has_content: ClassVar[bool] = False
+ required_arguments: ClassVar[int] = 1
+ option_spec: ClassVar[dict[_Option, Callable[[str], Any]]] = { # pyright: ignore[reportIncompatibleVariableOverride]
"output": validate_output,
"fold": directives.flag,
"summary": directives.unchanged_required,
@@ -302,8 +304,8 @@ def __init__(
state: RSTState,
state_machine: RSTStateMachine,
) -> None:
- super().__init__(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine) # fmt: skip
- self.options: dict[_Option, Any]
+ super().__init__(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine) # fmt: skip # pyright: ignore[reportArgumentType]
+ self.options: dict[_Option, Any] # pyright: ignore[reportIncompatibleVariableOverride]
def run(self) -> Sequence[nodes.Node]:
qual_name = self.arguments[0]
diff --git a/sphinxext/schematable.py b/sphinxext/schematable.py
index 5daaba4c5..323f8dfe7 100644
--- a/sphinxext/schematable.py
+++ b/sphinxext/schematable.py
@@ -8,7 +8,7 @@
from docutils import frontend, nodes, utils
from docutils.parsers.rst import Directive
from docutils.parsers.rst.directives import flag
-from myst_parser.docutils_ import Parser
+from myst_parser.parsers.docutils_ import Parser
from sphinx import addnodes
from tools.schemapi.utils import SchemaInfo, fix_docstring_issues
@@ -95,7 +95,7 @@ def add_text(node: nodes.paragraph, text: str) -> nodes.paragraph:
for part in reCode.split(text):
if part:
if is_text:
- node += nodes.Text(part, part)
+ node += nodes.Text(part, part) # pyright: ignore[reportCallIssue]
else:
node += nodes.literal(part, part)
@@ -108,7 +108,7 @@ def build_row(
item: tuple[str, dict[str, Any]], rootschema: dict[str, Any] | None
) -> nodes.row:
"""Return nodes.row with property description."""
- prop, propschema, _ = item
+ prop, propschema = item
row = nodes.row()
# Property
@@ -165,17 +165,16 @@ def build_schema_table(
def select_items_from_schema(
schema: dict[str, Any], props: list[str] | None = None
-) -> Iterator[tuple[Any, Any, bool] | tuple[str, Any, bool]]:
- """Return iterator (prop, schema.item, required) on prop, return all in None."""
+) -> Iterator[tuple[Any, Any] | tuple[str, Any]]:
+ """Return iterator (prop, schema.item) on prop, return all in None."""
properties = schema.get("properties", {})
- required = schema.get("required", [])
if not props:
for prop, item in properties.items():
- yield prop, item, prop in required
+ yield prop, item
else:
for prop in props:
try:
- yield prop, properties[prop], prop in required
+ yield prop, properties[prop]
except KeyError as err:
msg = f"Can't find property: {prop}"
raise Exception(msg) from err
diff --git a/sphinxext/utils.py b/sphinxext/utils.py
index a27e4d340..743cf0913 100644
--- a/sphinxext/utils.py
+++ b/sphinxext/utils.py
@@ -46,7 +46,7 @@ def create_generic_image(
arr = np.zeros((shape[0], shape[1], 3))
if gradient:
# gradient from gray to white
- arr += np.linspace(128, 255, shape[1])[:, None]
+ arr += np.linspace(128, 255, shape[1])[:, None] # pyright: ignore[reportCallIssue,reportArgumentType]
im = Image.fromarray(arr.astype("uint8"))
im.save(filename)
@@ -138,12 +138,12 @@ def get_docstring_and_rest(filename: str) -> tuple[str, str | None, str, int]:
try:
# In python 3.7 module knows its docstring.
# Everything else will raise an attribute error
- docstring = node.docstring
+ docstring = node.docstring # pyright: ignore[reportAttributeAccessIssue]
import tokenize
from io import BytesIO
- ts = tokenize.tokenize(BytesIO(content).readline)
+ ts = tokenize.tokenize(BytesIO(content).readline) # pyright: ignore[reportArgumentType]
ds_lines = 0
# find the first string according to the tokenizer and get
# it's end row
@@ -163,7 +163,7 @@ def get_docstring_and_rest(filename: str) -> tuple[str, str | None, str, int]:
and isinstance(node.body[0].value, (ast.Str, ast.Constant))
):
docstring_node = node.body[0]
- docstring = docstring_node.value.s
+ docstring = docstring_node.value.s # pyright: ignore[reportAttributeAccessIssue]
# python2.7: Code was read in bytes needs decoding to utf-8
# unless future unicode_literals is imported in source which
# make ast output unicode strings
@@ -203,8 +203,8 @@ def dict_hash(dct: dict[Any, Any]) -> Any:
serialized = json.dumps(dct, sort_keys=True)
try:
- m = hashlib.sha256(serialized)[:32]
+ m = hashlib.sha256(serialized)[:32] # pyright: ignore[reportArgumentType,reportIndexIssue]
except TypeError:
- m = hashlib.sha256(serialized.encode())[:32]
+ m = hashlib.sha256(serialized.encode())[:32] # pyright: ignore[reportIndexIssue]
return m.hexdigest()
diff --git a/tests/__init__.py b/tests/__init__.py
index 1cda56438..617cfca80 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -59,6 +59,17 @@ def windows_has_tzdata() -> bool:
>>> hatch run test-slow --durations=25 # doctest: +SKIP
"""
+skip_requires_ipython: pytest.MarkDecorator = pytest.mark.skipif(
+ find_spec("IPython") is None, reason="`IPython` not installed."
+)
+"""
+``pytest.mark.skipif`` decorator.
+
+Applies when `IPython`_ import would fail.
+
+.. _IPython:
+ https://github.com/ipython/ipython
+"""
skip_requires_vl_convert: pytest.MarkDecorator = pytest.mark.skipif(
find_spec("vl_convert") is None, reason="`vl_convert` not installed."
diff --git a/tests/test_magics.py b/tests/test_magics.py
index e1775aaf5..f88c83dbb 100644
--- a/tests/test_magics.py
+++ b/tests/test_magics.py
@@ -1,68 +1,76 @@
+from __future__ import annotations
+
import json
+from typing import TYPE_CHECKING, Any
import pytest
-try:
- from IPython import InteractiveShell
-
- IPYTHON_AVAILABLE = True
-except ImportError:
- IPYTHON_AVAILABLE = False
-
-from altair.vegalite.v5 import VegaLite
-
-DATA_RECORDS = [
- {"amount": 28, "category": "A"},
- {"amount": 55, "category": "B"},
- {"amount": 43, "category": "C"},
- {"amount": 91, "category": "D"},
- {"amount": 81, "category": "E"},
- {"amount": 53, "category": "F"},
- {"amount": 19, "category": "G"},
- {"amount": 87, "category": "H"},
-]
-
-if IPYTHON_AVAILABLE:
- _ipshell = InteractiveShell.instance()
- _ipshell.run_cell("%load_ext altair")
- _ipshell.run_cell(
- f"""
-import pandas as pd
-table = pd.DataFrame.from_records({DATA_RECORDS})
-the_data = table
-"""
- )
+from altair.vegalite.v5.display import VegaLite
+from tests import skip_requires_ipython
+
+if TYPE_CHECKING:
+ from IPython.core.interactiveshell import InteractiveShell
+
+
+@pytest.fixture
+def records() -> list[dict[str, Any]]:
+ return [
+ {"amount": 28, "category": "A"},
+ {"amount": 55, "category": "B"},
+ {"amount": 43, "category": "C"},
+ {"amount": 91, "category": "D"},
+ {"amount": 81, "category": "E"},
+ {"amount": 53, "category": "F"},
+ {"amount": 19, "category": "G"},
+ {"amount": 87, "category": "H"},
+ ]
-VEGALITE_SPEC = {
- "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
- "data": {"values": DATA_RECORDS},
- "description": "A simple bar chart with embedded data.",
- "encoding": {
- "x": {"field": "category", "type": "ordinal"},
- "y": {"field": "amount", "type": "quantitative"},
- },
- "mark": {"type": "bar"},
-}
+@pytest.fixture
+def vl_spec(records) -> dict[str, Any]:
+ return {
+ "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
+ "data": {"values": records},
+ "description": "A simple bar chart with embedded data.",
+ "encoding": {
+ "x": {"field": "category", "type": "ordinal"},
+ "y": {"field": "amount", "type": "quantitative"},
+ },
+ "mark": {"type": "bar"},
+ }
+
+
+@pytest.fixture
+def ipshell(records) -> InteractiveShell:
+ from IPython.core.interactiveshell import InteractiveShell
+
+ shell = InteractiveShell.instance()
+ shell.run_cell("%load_ext altair")
+ shell.run_cell(
+ f"import pandas as pd\n"
+ f"table = pd.DataFrame.from_records({records})\n"
+ f"the_data = table"
+ )
+ return shell
-@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython")
-def test_vegalite_magic_data_included():
- result = _ipshell.run_cell("%%vegalite\n" + json.dumps(VEGALITE_SPEC))
+@skip_requires_ipython
+def test_vegalite_magic_data_included(ipshell, vl_spec) -> None:
+ result = ipshell.run_cell("%%vegalite\n" + json.dumps(vl_spec))
assert isinstance(result.result, VegaLite)
- assert result.result.spec == VEGALITE_SPEC
+ assert result.result.spec == vl_spec
-@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython")
-def test_vegalite_magic_json_flag():
- result = _ipshell.run_cell("%%vegalite --json\n" + json.dumps(VEGALITE_SPEC))
+@skip_requires_ipython
+def test_vegalite_magic_json_flag(ipshell, vl_spec) -> None:
+ result = ipshell.run_cell("%%vegalite --json\n" + json.dumps(vl_spec))
assert isinstance(result.result, VegaLite)
- assert result.result.spec == VEGALITE_SPEC
+ assert result.result.spec == vl_spec
-@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython")
-def test_vegalite_magic_pandas_data():
- spec = {key: val for key, val in VEGALITE_SPEC.items() if key != "data"}
- result = _ipshell.run_cell("%%vegalite table\n" + json.dumps(spec))
+@skip_requires_ipython
+def test_vegalite_magic_pandas_data(ipshell, vl_spec) -> None:
+ spec = {key: val for key, val in vl_spec.items() if key != "data"}
+ result = ipshell.run_cell("%%vegalite table\n" + json.dumps(spec))
assert isinstance(result.result, VegaLite)
- assert result.result.spec == VEGALITE_SPEC
+ assert result.result.spec == vl_spec
diff --git a/tests/utils/test_compiler.py b/tests/utils/test_compiler.py
index fb5521175..49ee31506 100644
--- a/tests/utils/test_compiler.py
+++ b/tests/utils/test_compiler.py
@@ -29,7 +29,9 @@ def assert_is_vega_spec(vega_spec):
@skip_requires_vl_convert
def test_vegalite_compiler(chart):
vegalite_spec = chart.to_dict()
- vega_spec = vegalite_compilers.get()(vegalite_spec)
+ fn = vegalite_compilers.get()
+ assert fn is not None
+ vega_spec = fn(vegalite_spec)
assert_is_vega_spec(vega_spec)
diff --git a/tests/utils/test_core.py b/tests/utils/test_core.py
index d43f88dd8..95bed54c1 100644
--- a/tests/utils/test_core.py
+++ b/tests/utils/test_core.py
@@ -279,7 +279,7 @@ def channels_cached(channels) -> core._ChannelCache:
"""Previously ``_ChannelCache.from_channels``."""
cached = core._ChannelCache.__new__(core._ChannelCache)
cached.channel_to_name = {
- c: c._encoding_name
+ c: c._encoding_name # pyright: ignore[reportAttributeAccessIssue]
for c in channels.__dict__.values()
if isinstance(c, type)
and issubclass(c, alt.SchemaBase)
diff --git a/tests/utils/test_data.py b/tests/utils/test_data.py
index 30b5b7f8e..b4d16d3dd 100644
--- a/tests/utils/test_data.py
+++ b/tests/utils/test_data.py
@@ -100,6 +100,7 @@ def test_dataframe_to_json():
- make certain the filename is deterministic
- make certain the file contents match the data.
"""
+ filename = ""
data = _create_dataframe(10)
try:
result1 = _pipe(data, to_json)
@@ -107,7 +108,8 @@ def test_dataframe_to_json():
filename = result1["url"]
output = pd.read_json(filename)
finally:
- Path(filename).unlink()
+ if filename:
+ Path(filename).unlink()
assert result1 == result2
assert output.equals(data)
@@ -120,6 +122,7 @@ def test_dict_to_json():
- make certain the filename is deterministic
- make certain the file contents match the data.
"""
+ filename = ""
data = _create_data_with_values(10)
try:
result1 = _pipe(data, to_json)
@@ -127,7 +130,8 @@ def test_dict_to_json():
filename = result1["url"]
output = pd.read_json(filename).to_dict(orient="records")
finally:
- Path(filename).unlink()
+ if filename:
+ Path(filename).unlink()
assert result1 == result2
assert data == {"values": output}
@@ -141,6 +145,7 @@ def test_dataframe_to_csv(tp: type[Any]) -> None:
- make certain the filename is deterministic
- make certain the file contents match the data.
"""
+ filename: str = ""
data = _create_dataframe(10, tp=tp)
try:
result1 = _pipe(data, to_csv)
@@ -148,7 +153,8 @@ def test_dataframe_to_csv(tp: type[Any]) -> None:
filename = result1["url"]
output = tp(pd.read_csv(filename))
finally:
- Path(filename).unlink()
+ if filename:
+ Path(filename).unlink()
assert result1 == result2
assert output.equals(data)
@@ -161,6 +167,7 @@ def test_dict_to_csv():
- make certain the filename is deterministic
- make certain the file contents match the data.
"""
+ filename = ""
data = _create_data_with_values(10)
try:
result1 = _pipe(data, to_csv)
@@ -168,7 +175,8 @@ def test_dict_to_csv():
filename = result1["url"]
output = pd.read_csv(filename).to_dict(orient="records")
finally:
- Path(filename).unlink()
+ if filename:
+ Path(filename).unlink()
assert result1 == result2
assert data == {"values": output}
diff --git a/tests/utils/test_html.py b/tests/utils/test_html.py
index 1ce63445f..121215145 100644
--- a/tests/utils/test_html.py
+++ b/tests/utils/test_html.py
@@ -20,8 +20,8 @@ def spec():
def test_spec_to_html(requirejs, fullhtml, spec):
# We can't test that the html actually renders, but we'll test aspects of
# it to make certain that the keywords are respected.
- vegaembed_version = ("3.12",)
- vegalite_version = ("3.0",)
+ vegaembed_version = "3.12"
+ vegalite_version = "3.0"
vega_version = "4.0"
html = spec_to_html(
diff --git a/tests/utils/test_mimebundle.py b/tests/utils/test_mimebundle.py
index 2688ff79c..bdb0b3cea 100644
--- a/tests/utils/test_mimebundle.py
+++ b/tests/utils/test_mimebundle.py
@@ -1,3 +1,7 @@
+from __future__ import annotations
+
+from typing import Any
+
import pytest
import altair as alt
@@ -7,7 +11,7 @@
@pytest.fixture
-def vegalite_spec():
+def vegalite_spec() -> dict[str, Any]:
return {
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"description": "A simple bar chart with embedded data.",
@@ -187,15 +191,15 @@ def test_spec_to_vegalite_mimebundle(vegalite_spec):
def test_spec_to_vega_mimebundle(vega_spec):
# ValueError: mode must be 'vega-lite'
with pytest.raises(ValueError): # noqa: PT011
- spec_to_mimebundle(
+ spec_to_mimebundle( # pyright: ignore[reportCallIssue]
spec=vega_spec,
- mode="vega",
+ mode="vega", # pyright: ignore[reportArgumentType]
format="vega",
vega_version=alt.VEGA_VERSION,
)
-def test_spec_to_json_mimebundle():
+def test_spec_to_json_mimebundle(vegalite_spec):
bundle = spec_to_mimebundle(
spec=vegalite_spec,
mode="vega-lite",
@@ -240,5 +244,6 @@ def test_vegafusion_chart_to_vega_mime_bundle(vegalite_spec):
chart = alt.Chart.from_dict(vegalite_spec)
with alt.data_transformers.enable("vegafusion"), alt.renderers.enable("json"):
bundle = chart._repr_mimebundle_()
+ assert isinstance(bundle, tuple)
vega_spec = bundle[0]["application/json"]
check_pre_transformed_vega_spec(vega_spec)
diff --git a/tests/utils/test_plugin_registry.py b/tests/utils/test_plugin_registry.py
index bd741d2eb..051d2cdcf 100644
--- a/tests/utils/test_plugin_registry.py
+++ b/tests/utils/test_plugin_registry.py
@@ -38,7 +38,9 @@ def test_plugin_registry():
plugins.enable("new_plugin")
assert plugins.names() == ["new_plugin"]
assert plugins.active == "new_plugin"
- assert plugins.get()(3) == 9
+ fn = plugins.get()
+ assert fn is not None
+ assert fn(3) == 9
assert repr(plugins) == (
"TypedCallableRegistry(active='new_plugin', " "registered=['new_plugin'])"
)
@@ -49,16 +51,22 @@ def test_plugin_registry_extra_options():
plugins.register("metadata_plugin", lambda x, p=2: x**p)
plugins.enable("metadata_plugin")
- assert plugins.get()(3) == 9
+ fn = plugins.get()
+ assert fn is not None
+ assert fn(3) == 9
plugins.enable("metadata_plugin", p=3)
assert plugins.active == "metadata_plugin"
- assert plugins.get()(3) == 27
+ fn = plugins.get()
+ assert fn is not None
+ assert fn(3) == 27
# enabling without changing name
plugins.enable(p=2)
assert plugins.active == "metadata_plugin"
- assert plugins.get()(3) == 9
+ fn = plugins.get()
+ assert fn is not None
+ assert fn(3) == 9
def test_plugin_registry_global_settings():
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index fa5e83aff..8772f8196 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -251,15 +251,15 @@ def test_simple_type():
def test_simple_array():
assert SimpleArray([4, 5, "six"]).to_dict() == [4, 5, "six"]
- assert SimpleArray.from_dict(list("abc")).to_dict() == list("abc")
+ assert SimpleArray.from_dict(list("abc")).to_dict() == list("abc") # pyright: ignore[reportArgumentType]
def test_definition_union():
- obj = DefinitionUnion.from_dict("A")
+ obj = DefinitionUnion.from_dict("A") # pyright: ignore[reportArgumentType]
assert isinstance(obj, Bar)
assert obj.to_dict() == "A"
- obj = DefinitionUnion.from_dict("B")
+ obj = DefinitionUnion.from_dict("B") # pyright: ignore[reportArgumentType]
assert isinstance(obj, Bar)
assert obj.to_dict() == "B"
@@ -445,7 +445,7 @@ def chart_error_example__hconcat():
alt.Chart(source)
.mark_text()
.encode(
- alt.Text("Horsepower:N", title={"text": "Horsepower", "align": "right"})
+ alt.Text("Horsepower:N", title={"text": "Horsepower", "align": "right"}) # pyright: ignore[reportArgumentType]
)
)
@@ -460,7 +460,7 @@ def chart_error_example__invalid_y_option_value_unknown_x_option():
.mark_bar()
.encode(
x=alt.X("variety", unknown=2),
- y=alt.Y("sum(yield)", stack="asdf"),
+ y=alt.Y("sum(yield)", stack="asdf"), # pyright: ignore[reportArgumentType]
)
)
@@ -472,7 +472,7 @@ def chart_error_example__invalid_y_option_value():
.mark_bar()
.encode(
x=alt.X("variety"),
- y=alt.Y("sum(yield)", stack="asdf"),
+ y=alt.Y("sum(yield)", stack="asdf"), # pyright: ignore[reportArgumentType]
)
)
@@ -486,7 +486,7 @@ def chart_error_example__invalid_y_option_value_with_condition():
.mark_bar()
.encode(
x="variety",
- y=alt.Y("sum(yield)", stack="asdf"),
+ y=alt.Y("sum(yield)", stack="asdf"), # pyright: ignore[reportArgumentType]
opacity=alt.condition("datum.yield > 0", alt.value(1), alt.value(0.2)),
)
)
@@ -494,7 +494,7 @@ def chart_error_example__invalid_y_option_value_with_condition():
def chart_error_example__invalid_timeunit_value():
# Error: Invalid value for Angle.timeUnit
- return alt.Chart().encode(alt.Angle().timeUnit("invalid_value"))
+ return alt.Chart().encode(alt.Angle().timeUnit("invalid_value")) # pyright: ignore[reportArgumentType]
def chart_error_example__invalid_sort_value():
@@ -507,13 +507,13 @@ def chart_error_example__invalid_bandposition_value():
return (
alt.Chart(data.cars())
.mark_text(align="right")
- .encode(alt.Text("Horsepower:N", bandPosition="4"))
+ .encode(alt.Text("Horsepower:N", bandPosition="4")) # pyright: ignore[reportArgumentType]
)
def chart_error_example__invalid_type():
# Error: Invalid value for type
- return alt.Chart().encode(alt.X(type="unknown"))
+ return alt.Chart().encode(alt.X(type="unknown")) # pyright: ignore[reportArgumentType]
def chart_error_example__additional_datum_argument():
@@ -539,21 +539,21 @@ def chart_error_example__wrong_tooltip_type_in_faceted_chart():
return (
alt.Chart(pd.DataFrame({"a": [1]}))
.mark_point()
- .encode(tooltip=[{"wrong"}])
+ .encode(tooltip=[{"wrong"}]) # pyright: ignore[reportArgumentType]
.facet()
)
def chart_error_example__wrong_tooltip_type_in_layered_chart():
# Error: Wrong data type to pass to tooltip
- return alt.layer(alt.Chart().mark_point().encode(tooltip=[{"wrong"}]))
+ return alt.layer(alt.Chart().mark_point().encode(tooltip=[{"wrong"}])) # pyright: ignore[reportArgumentType]
def chart_error_example__two_errors_in_layered_chart():
# Error 1: Wrong data type to pass to tooltip
# Error 2: `Color` has no parameter named 'invalidArgument'
return alt.layer(
- alt.Chart().mark_point().encode(tooltip=[{"wrong"}]),
+ alt.Chart().mark_point().encode(tooltip=[{"wrong"}]), # pyright: ignore[reportArgumentType]
alt.Chart().mark_line().encode(alt.Color(invalidArgument="unknown")),
)
@@ -595,7 +595,7 @@ def chart_error_example__two_errors_with_one_in_nested_layered_chart():
blue_bars = (
alt.Chart(source)
- .encode(alt.X("Day:O").scale(invalidOption=10), alt.Y("Value:Q"))
+ .encode(alt.X("Day:O").scale(invalidOption=10), alt.Y("Value:Q")) # pyright: ignore[reportCallIssue]
.mark_bar()
)
red_bars = (
@@ -635,7 +635,7 @@ def chart_error_example__four_errors_hide_fourth():
.mark_bar()
.encode(
x=alt.X("variety", unknown=2),
- y=alt.Y("sum(yield)", stack="asdf"),
+ y=alt.Y("sum(yield)", stack="asdf"), # pyright: ignore[reportArgumentType]
color=alt.Color("variety", another_unknown=2),
opacity=alt.Opacity("variety", fourth_error=1),
)
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index bb2d049c3..c3b329cf0 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -75,7 +75,7 @@ def test_sanitize_dataframe():
if str(df[col].dtype).startswith("datetime"):
# astype(datetime) introduces time-zone issues:
# to_datetime() does not.
- utc = isinstance(df[col].dtype, pd.core.dtypes.dtypes.DatetimeTZDtype)
+ utc = isinstance(df[col].dtype, pd.DatetimeTZDtype)
df2[col] = pd.to_datetime(df2[col], utc=utc)
else:
df2[col] = df2[col].astype(df[col].dtype)
diff --git a/tests/vegalite/v5/test_geo_interface.py b/tests/vegalite/v5/test_geo_interface.py
index 6a689a5d5..eca901e26 100644
--- a/tests/vegalite/v5/test_geo_interface.py
+++ b/tests/vegalite/v5/test_geo_interface.py
@@ -1,11 +1,20 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
import pytest
import altair.vegalite.v5 as alt
+if TYPE_CHECKING:
+ from collections.abc import MutableMapping
+
+ from altair.utils.data import SupportsGeoInterface
-def geom_obj(geom):
+
+def geom_obj(geom: dict[str, Any]) -> SupportsGeoInterface:
class Geom:
- pass
+ __geo_interface__: MutableMapping[str, Any]
geom_obj = Geom()
geom_obj.__geo_interface__ = geom
@@ -13,8 +22,8 @@ class Geom:
# correct translation of Polygon geometry to Feature type
-def test_geo_interface_polygon_feature():
- geom = {
+def test_geo_interface_polygon_feature() -> None:
+ geom: dict[str, Any] = {
"coordinates": [[(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]],
"type": "Polygon",
}
@@ -26,7 +35,7 @@ def test_geo_interface_polygon_feature():
# merge geometry with empty properties dictionary
-def test_geo_interface_removal_empty_properties():
+def test_geo_interface_removal_empty_properties() -> None:
geom = {
"geometry": {
"coordinates": [
@@ -46,7 +55,7 @@ def test_geo_interface_removal_empty_properties():
# only register metadata in the properties member
-def test_geo_interface_register_foreign_member():
+def test_geo_interface_register_foreign_member() -> None:
geom = {
"geometry": {
"coordinates": [
@@ -68,7 +77,7 @@ def test_geo_interface_register_foreign_member():
# correct serializing of arrays and nested tuples
-def test_geo_interface_serializing_arrays_tuples():
+def test_geo_interface_serializing_arrays_tuples() -> None:
import array as arr
geom = {
@@ -96,7 +105,7 @@ def test_geo_interface_serializing_arrays_tuples():
# overwrite existing 'type' value in properties with `Feature`
-def test_geo_interface_reserved_members():
+def test_geo_interface_reserved_members() -> None:
geom = {
"geometry": {
"coordinates": [
@@ -116,7 +125,7 @@ def test_geo_interface_reserved_members():
# an empty FeatureCollection is valid
-def test_geo_interface_empty_feature_collection():
+def test_geo_interface_empty_feature_collection() -> None:
geom = {"type": "FeatureCollection", "features": []}
feat = geom_obj(geom)
@@ -126,7 +135,7 @@ def test_geo_interface_empty_feature_collection():
# Features in a FeatureCollection only keep properties and geometry
-def test_geo_interface_feature_collection():
+def test_geo_interface_feature_collection() -> None:
geom = {
"type": "FeatureCollection",
"features": [
@@ -170,7 +179,7 @@ def test_geo_interface_feature_collection():
# notic that the index value is registerd as a commonly used identifier
# with the name "id" (in this case 49). Similar to serialization of a
# pandas DataFrame is the index not included in the output
-def test_geo_interface_feature_collection_gdf():
+def test_geo_interface_feature_collection_gdf() -> None:
geom = {
"bbox": (19.89, -26.82, 29.43, -17.66),
"features": [
From 7b3d47975dfb0af5c935780bebdb6455eba9c09e Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 6 Nov 2024 05:59:33 +0000
Subject: [PATCH 14/53] feat: Generate docstrings for `mark_` methods (#3675)
---
altair/vegalite/v5/schema/mixins.py | 3611 +++++++--------------------
tools/generate_schema_wrapper.py | 44 +-
tools/schemapi/codegen.py | 17 +-
3 files changed, 888 insertions(+), 2784 deletions(-)
diff --git a/altair/vegalite/v5/schema/mixins.py b/altair/vegalite/v5/schema/mixins.py
index 990e193d5..f156a2aae 100644
--- a/altair/vegalite/v5/schema/mixins.py
+++ b/altair/vegalite/v5/schema/mixins.py
@@ -3,9 +3,9 @@
from __future__ import annotations
-from typing import TYPE_CHECKING, Literal
+from typing import TYPE_CHECKING, Any, Literal
-from altair.utils import Undefined, use_signature
+from altair.utils import SchemaBase, Undefined, use_signature
from . import core
@@ -20,2733 +20,479 @@
from typing import Self
else:
from typing_extensions import Self
- from altair import Parameter, SchemaBase
+ from altair import Parameter
from altair.typing import Optional
from ._typing import * # noqa: F403
-class MarkMethodMixin:
- """A mixin class that defines mark methods."""
-
- def mark_arc(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'arc' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="arc", **kwds)
- else:
- copy.mark = "arc"
- return copy
-
- def mark_area(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'area' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="area", **kwds)
- else:
- copy.mark = "area"
- return copy
-
- def mark_bar(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'bar' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="bar", **kwds)
- else:
- copy.mark = "bar"
- return copy
-
- def mark_image(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'image' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="image", **kwds)
- else:
- copy.mark = "image"
- return copy
-
- def mark_line(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'line' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="line", **kwds)
- else:
- copy.mark = "line"
- return copy
-
- def mark_point(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'point' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="point", **kwds)
- else:
- copy.mark = "point"
- return copy
-
- def mark_rect(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'rect' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="rect", **kwds)
- else:
- copy.mark = "rect"
- return copy
-
- def mark_rule(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'rule' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="rule", **kwds)
- else:
- copy.mark = "rule"
- return copy
-
- def mark_text(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'text' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="text", **kwds)
- else:
- copy.mark = "text"
- return copy
-
- def mark_tick(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'tick' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="tick", **kwds)
- else:
- copy.mark = "tick"
- return copy
-
- def mark_trail(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'trail' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="trail", **kwds)
- else:
- copy.mark = "trail"
- return copy
-
- def mark_circle(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'circle' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="circle", **kwds)
- else:
- copy.mark = "circle"
- return copy
-
- def mark_square(
- self,
- align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
- angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- aria: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- ariaRole: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- ariaRoleDescription: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- bandSize: Optional[float] = Undefined,
- baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
- binSpacing: Optional[float] = Undefined,
- blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
- clip: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
- continuousBandSize: Optional[float] = Undefined,
- cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusBottomLeft: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusBottomRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cornerRadiusEnd: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopLeft: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- cornerRadiusTopRight: Optional[
- float | Parameter | SchemaBase | Map
- ] = Undefined,
- cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
- description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
- discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
- dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fill: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- fillOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- filled: Optional[bool] = Undefined,
- font: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- fontStyle: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- fontWeight: Optional[Parameter | SchemaBase | Map | FontWeight_T] = Undefined,
- height: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- href: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- innerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- interpolate: Optional[Parameter | SchemaBase | Map | Interpolate_T] = Undefined,
- invalid: Optional[SchemaBase | MarkInvalidDataMode_T | None] = Undefined,
- limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- line: Optional[bool | SchemaBase | Map] = Undefined,
- lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- order: Optional[bool | None] = Undefined,
- orient: Optional[SchemaBase | Orientation_T] = Undefined,
- outerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- padAngle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- point: Optional[bool | SchemaBase | Literal["transparent"] | Map] = Undefined,
- radius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radius2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- radiusOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- shape: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- size: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- smooth: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
- stroke: Optional[
- str | Parameter | SchemaBase | Map | ColorName_T | None
- ] = Undefined,
- strokeCap: Optional[Parameter | SchemaBase | Map | StrokeCap_T] = Undefined,
- strokeDash: Optional[
- Parameter | SchemaBase | Sequence[float] | Map
- ] = Undefined,
- strokeDashOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeJoin: Optional[Parameter | SchemaBase | Map | StrokeJoin_T] = Undefined,
- strokeMiterLimit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeOpacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- strokeWidth: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- style: Optional[str | Sequence[str]] = Undefined,
- tension: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- text: Optional[str | Parameter | SchemaBase | Sequence[str] | Map] = Undefined,
- theta: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- theta2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thetaOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- thickness: Optional[float] = Undefined,
- timeUnitBandPosition: Optional[float] = Undefined,
- timeUnitBandSize: Optional[float] = Undefined,
- tooltip: Optional[
- str | bool | float | Parameter | SchemaBase | Map | None
- ] = Undefined,
- url: Optional[str | Parameter | SchemaBase | Map] = Undefined,
- width: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- x: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2: Optional[
- float | Parameter | SchemaBase | Literal["width"] | Map
- ] = Undefined,
- x2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- xOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- y: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2: Optional[
- float | Parameter | SchemaBase | Literal["height"] | Map
- ] = Undefined,
- y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
- **kwds,
- ) -> Self:
- """Set the chart's mark to 'square' (see :class:`MarkDef`)."""
- kwds = dict(
- align=align,
- angle=angle,
- aria=aria,
- ariaRole=ariaRole,
- ariaRoleDescription=ariaRoleDescription,
- aspect=aspect,
- bandSize=bandSize,
- baseline=baseline,
- binSpacing=binSpacing,
- blend=blend,
- clip=clip,
- color=color,
- continuousBandSize=continuousBandSize,
- cornerRadius=cornerRadius,
- cornerRadiusBottomLeft=cornerRadiusBottomLeft,
- cornerRadiusBottomRight=cornerRadiusBottomRight,
- cornerRadiusEnd=cornerRadiusEnd,
- cornerRadiusTopLeft=cornerRadiusTopLeft,
- cornerRadiusTopRight=cornerRadiusTopRight,
- cursor=cursor,
- description=description,
- dir=dir,
- discreteBandSize=discreteBandSize,
- dx=dx,
- dy=dy,
- ellipsis=ellipsis,
- fill=fill,
- fillOpacity=fillOpacity,
- filled=filled,
- font=font,
- fontSize=fontSize,
- fontStyle=fontStyle,
- fontWeight=fontWeight,
- height=height,
- href=href,
- innerRadius=innerRadius,
- interpolate=interpolate,
- invalid=invalid,
- limit=limit,
- line=line,
- lineBreak=lineBreak,
- lineHeight=lineHeight,
- minBandSize=minBandSize,
- opacity=opacity,
- order=order,
- orient=orient,
- outerRadius=outerRadius,
- padAngle=padAngle,
- point=point,
- radius=radius,
- radius2=radius2,
- radius2Offset=radius2Offset,
- radiusOffset=radiusOffset,
- shape=shape,
- size=size,
- smooth=smooth,
- stroke=stroke,
- strokeCap=strokeCap,
- strokeDash=strokeDash,
- strokeDashOffset=strokeDashOffset,
- strokeJoin=strokeJoin,
- strokeMiterLimit=strokeMiterLimit,
- strokeOffset=strokeOffset,
- strokeOpacity=strokeOpacity,
- strokeWidth=strokeWidth,
- style=style,
- tension=tension,
- text=text,
- theta=theta,
- theta2=theta2,
- theta2Offset=theta2Offset,
- thetaOffset=thetaOffset,
- thickness=thickness,
- timeUnitBandPosition=timeUnitBandPosition,
- timeUnitBandSize=timeUnitBandSize,
- tooltip=tooltip,
- url=url,
- width=width,
- x=x,
- x2=x2,
- x2Offset=x2Offset,
- xOffset=xOffset,
- y=y,
- y2=y2,
- y2Offset=y2Offset,
- yOffset=yOffset,
- **kwds,
- )
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="square", **kwds)
- else:
- copy.mark = "square"
- return copy
-
- def mark_geoshape(
+class _MarkDef(SchemaBase):
+ """
+ MarkDef schema wrapper.
+
+ Parameters
+ ----------
+ align : dict, :class:`Align`, :class:`ExprRef`, Literal['left', 'center', 'right']
+ The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule).
+ One of ``"left"``, ``"right"``, ``"center"``.
+
+ **Note:** Expression reference is *not* supported for range marks.
+ angle : dict, float, :class:`ExprRef`
+ The rotation angle of the text, in degrees.
+ aria : bool, dict, :class:`ExprRef`
+ A boolean flag indicating if `ARIA attributes
+ `__ should be
+ included (SVG output only). If ``false``, the "aria-hidden" attribute will be set on
+ the output SVG element, removing the mark item from the ARIA accessibility tree.
+ ariaRole : str, dict, :class:`ExprRef`
+ Sets the type of user interface element of the mark item for `ARIA accessibility
+ `__ (SVG output
+ only). If specified, this property determines the "role" attribute. Warning: this
+ property is experimental and may be changed in the future.
+ ariaRoleDescription : str, dict, :class:`ExprRef`
+ A human-readable, author-localized description for the role of the mark item for
+ `ARIA accessibility
+ `__ (SVG output
+ only). If specified, this property determines the "aria-roledescription" attribute.
+ Warning: this property is experimental and may be changed in the future.
+ aspect : bool, dict, :class:`ExprRef`
+ Whether to keep aspect ratio of image marks.
+ bandSize : float
+ The width of the ticks.
+
+ **Default value:** 3/4 of step (width step for horizontal ticks and height step for
+ vertical ticks).
+ baseline : dict, :class:`ExprRef`, :class:`Baseline`, :class:`TextBaseline`, Literal['alphabetic', 'line-bottom', 'line-top', 'top', 'middle', 'bottom']
+ For text marks, the vertical text baseline. One of ``"alphabetic"`` (default),
+ ``"top"``, ``"middle"``, ``"bottom"``, ``"line-top"``, ``"line-bottom"``, or an
+ expression reference that provides one of the valid values. The ``"line-top"`` and
+ ``"line-bottom"`` values operate similarly to ``"top"`` and ``"bottom"``, but are
+ calculated relative to the ``lineHeight`` rather than ``fontSize`` alone.
+
+ For range marks, the vertical alignment of the marks. One of ``"top"``,
+ ``"middle"``, ``"bottom"``.
+
+ **Note:** Expression reference is *not* supported for range marks.
+ binSpacing : float
+ Offset between bars for binned field. The ideal value for this is either 0
+ (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).
+
+ **Default value:** ``1``
+ blend : dict, :class:`Blend`, :class:`ExprRef`, Literal[None, 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity']
+ The color blend mode for drawing an item on its current background. Any valid `CSS
+ mix-blend-mode `__
+ value can be used.
+
+ __Default value:__ ``"source-over"``
+ clip : bool, dict, :class:`ExprRef`
+ Whether a mark be clipped to the enclosing group's width and height.
+ color : str, dict, :class:`Color`, :class:`ExprRef`, :class:`Gradient`, :class:`HexColor`, :class:`ColorName`, :class:`LinearGradient`, :class:`RadialGradient`, Literal['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple']
+ Default color.
+
+ **Default value:** :raw-html:`` ■ :raw-html:``
+ ``"#4682b4"``
+
+ **Note:**
+
+ * This property cannot be used in a `style config
+ `__.
+ * The ``fill`` and ``stroke`` properties have higher precedence than ``color`` and
+ will override ``color``.
+ continuousBandSize : float
+ The default size of the bars on continuous scales.
+
+ **Default value:** ``5``
+ cornerRadius : dict, float, :class:`ExprRef`
+ The radius in pixels of rounded rectangles or arcs' corners.
+
+ **Default value:** ``0``
+ cornerRadiusBottomLeft : dict, float, :class:`ExprRef`
+ The radius in pixels of rounded rectangles' bottom left corner.
+
+ **Default value:** ``0``
+ cornerRadiusBottomRight : dict, float, :class:`ExprRef`
+ The radius in pixels of rounded rectangles' bottom right corner.
+
+ **Default value:** ``0``
+ cornerRadiusEnd : dict, float, :class:`ExprRef`
+ * For vertical bars, top-left and top-right corner radius.
+
+ * For horizontal bars, top-right and bottom-right corner radius.
+ cornerRadiusTopLeft : dict, float, :class:`ExprRef`
+ The radius in pixels of rounded rectangles' top right corner.
+
+ **Default value:** ``0``
+ cornerRadiusTopRight : dict, float, :class:`ExprRef`
+ The radius in pixels of rounded rectangles' top left corner.
+
+ **Default value:** ``0``
+ cursor : dict, :class:`Cursor`, :class:`ExprRef`, Literal['auto', 'default', 'none', 'context-menu', 'help', 'pointer', 'progress', 'wait', 'cell', 'crosshair', 'text', 'vertical-text', 'alias', 'copy', 'move', 'no-drop', 'not-allowed', 'e-resize', 'n-resize', 'ne-resize', 'nw-resize', 's-resize', 'se-resize', 'sw-resize', 'w-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'col-resize', 'row-resize', 'all-scroll', 'zoom-in', 'zoom-out', 'grab', 'grabbing']
+ The mouse cursor used over the mark. Any valid `CSS cursor type
+ `__ can be used.
+ description : str, dict, :class:`ExprRef`
+ A text description of the mark item for `ARIA accessibility
+ `__ (SVG output
+ only). If specified, this property determines the `"aria-label" attribute
+ `__.
+ dir : dict, :class:`ExprRef`, :class:`TextDirection`, Literal['ltr', 'rtl']
+ The direction of the text. One of ``"ltr"`` (left-to-right) or ``"rtl"``
+ (right-to-left). This property determines on which side is truncated in response to
+ the limit parameter.
+
+ **Default value:** ``"ltr"``
+ discreteBandSize : dict, float, :class:`RelativeBandSize`
+ The default size of the bars with discrete dimensions. If unspecified, the default
+ size is ``step-2``, which provides 2 pixel offset between bars.
+ dx : dict, float, :class:`ExprRef`
+ The horizontal offset, in pixels, between the text label and its anchor point. The
+ offset is applied after rotation by the *angle* property.
+ dy : dict, float, :class:`ExprRef`
+ The vertical offset, in pixels, between the text label and its anchor point. The
+ offset is applied after rotation by the *angle* property.
+ ellipsis : str, dict, :class:`ExprRef`
+ The ellipsis string for text truncated in response to the limit parameter.
+
+ **Default value:** ``"…"``
+ fill : str, dict, :class:`Color`, :class:`ExprRef`, :class:`Gradient`, :class:`HexColor`, :class:`ColorName`, :class:`LinearGradient`, :class:`RadialGradient`, Literal['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple'], None
+ Default fill color. This property has higher precedence than ``config.color``. Set
+ to ``null`` to remove fill.
+
+ **Default value:** (None)
+ fillOpacity : dict, float, :class:`ExprRef`
+ The fill opacity (value between [0,1]).
+
+ **Default value:** ``1``
+ filled : bool
+ Whether the mark's color should be used as fill color instead of stroke color.
+
+ **Default value:** ``false`` for all ``point``, ``line``, and ``rule`` marks as well
+ as ``geoshape`` marks for `graticule
+ `__ data sources;
+ otherwise, ``true``.
+
+ **Note:** This property cannot be used in a `style config
+ `__.
+ font : str, dict, :class:`ExprRef`
+ The typeface to set the text in (e.g., ``"Helvetica Neue"``).
+ fontSize : dict, float, :class:`ExprRef`
+ The font size, in pixels.
+
+ **Default value:** ``11``
+ fontStyle : str, dict, :class:`ExprRef`, :class:`FontStyle`
+ The font style (e.g., ``"italic"``).
+ fontWeight : dict, :class:`ExprRef`, :class:`FontWeight`, Literal['normal', 'bold', 'lighter', 'bolder', 100, 200, 300, 400, 500, 600, 700, 800, 900]
+ The font weight. This can be either a string (e.g ``"bold"``, ``"normal"``) or a
+ number (``100``, ``200``, ``300``, ..., ``900`` where ``"normal"`` = ``400`` and
+ ``"bold"`` = ``700``).
+ height : dict, float, :class:`ExprRef`, :class:`RelativeBandSize`
+ Height of the marks. One of:
+
+ * A number representing a fixed pixel height.
+
+ * A relative band size definition. For example, ``{band: 0.5}`` represents half of
+ the band
+ href : str, dict, :class:`URI`, :class:`ExprRef`
+ A URL to load upon mouse click. If defined, the mark acts as a hyperlink.
+ innerRadius : dict, float, :class:`ExprRef`
+ The inner radius in pixels of arc marks. ``innerRadius`` is an alias for
+ ``radius2``.
+
+ **Default value:** ``0``
+ interpolate : dict, :class:`ExprRef`, :class:`Interpolate`, Literal['basis', 'basis-open', 'basis-closed', 'bundle', 'cardinal', 'cardinal-open', 'cardinal-closed', 'catmull-rom', 'linear', 'linear-closed', 'monotone', 'natural', 'step', 'step-before', 'step-after']
+ The line interpolation method to use for line and area marks. One of the following:
+
+ * ``"linear"``: piecewise linear segments, as in a polyline.
+ * ``"linear-closed"``: close the linear segments to form a polygon.
+ * ``"step"``: alternate between horizontal and vertical segments, as in a step
+ function.
+ * ``"step-before"``: alternate between vertical and horizontal segments, as in a
+ step function.
+ * ``"step-after"``: alternate between horizontal and vertical segments, as in a step
+ function.
+ * ``"basis"``: a B-spline, with control point duplication on the ends.
+ * ``"basis-open"``: an open B-spline; may not intersect the start or end.
+ * ``"basis-closed"``: a closed B-spline, as in a loop.
+ * ``"cardinal"``: a Cardinal spline, with control point duplication on the ends.
+ * ``"cardinal-open"``: an open Cardinal spline; may not intersect the start or end,
+ but will intersect other control points.
+ * ``"cardinal-closed"``: a closed Cardinal spline, as in a loop.
+ * ``"bundle"``: equivalent to basis, except the tension parameter is used to
+ straighten the spline.
+ * ``"monotone"``: cubic interpolation that preserves monotonicity in y.
+ invalid : :class:`MarkInvalidDataMode`, Literal['filter', 'break-paths-filter-domains', 'break-paths-show-domains', 'break-paths-show-path-domains', 'show'], None
+ Invalid data mode, which defines how the marks and corresponding scales should
+ represent invalid values (``null`` and ``NaN`` in continuous scales *without*
+ defined output for invalid values).
+
+ * ``"filter"`` — *Exclude* all invalid values from the visualization's *marks* and
+ *scales*. For path marks (for line, area, trail), this option will create paths
+ that connect valid points, as if the data rows with invalid values do not exist.
+
+ * ``"break-paths-filter-domains"`` — Break path marks (for line, area, trail) at
+ invalid values. For non-path marks, this is equivalent to ``"filter"``. All
+ *scale* domains will *exclude* these filtered data points.
+
+ * ``"break-paths-show-domains"`` — Break paths (for line, area, trail) at invalid
+ values. Hide invalid values for non-path marks. All *scale* domains will
+ *include* these filtered data points (for both path and non-path marks).
+
+ * ``"show"`` or ``null`` — Show all data points in the marks and scale domains. Each
+ scale will use the output for invalid values defined in ``config.scale.invalid``
+ or, if unspecified, by default invalid values will produce the same visual values
+ as zero (if the scale includes zero) or the minimum value (if the scale does not
+ include zero).
+
+ * ``"break-paths-show-path-domains"`` (default) — This is equivalent to
+ ``"break-paths-show-domains"`` for path-based marks (line/area/trail) and
+ ``"filter"`` for non-path marks.
+
+ **Note**: If any channel's scale has an output for invalid values defined in
+ ``config.scale.invalid``, all values for the scales will be considered "valid" since
+ they can produce a reasonable output for the scales. Thus, fields for such channels
+ will not be filtered and will not cause path breaks.
+ limit : dict, float, :class:`ExprRef`
+ The maximum length of the text mark in pixels. The text value will be automatically
+ truncated if the rendered size exceeds the limit.
+
+ **Default value:** ``0`` -- indicating no limit
+ line : bool, dict, :class:`OverlayMarkDef`
+ A flag for overlaying line on top of area marks, or an object defining the
+ properties of the overlayed lines.
+
+ * If this value is an empty object (``{}``) or ``true``, lines with default
+ properties will be used.
+
+ * If this value is ``false``, no lines would be automatically added to area marks.
+
+ **Default value:** ``false``.
+ lineBreak : str, dict, :class:`ExprRef`
+ A delimiter, such as a newline character, upon which to break text strings into
+ multiple lines. This property is ignored if the text is array-valued.
+ lineHeight : dict, float, :class:`ExprRef`
+ The line height in pixels (the spacing between subsequent lines of text) for
+ multi-line text marks.
+ minBandSize : dict, float, :class:`ExprRef`
+ The minimum band size for bar and rectangle marks. **Default value:** ``0.25``
+ opacity : dict, float, :class:`ExprRef`
+ The overall opacity (value between [0,1]).
+
+ **Default value:** ``0.7`` for non-aggregate plots with ``point``, ``tick``,
+ ``circle``, or ``square`` marks or layered ``bar`` charts and ``1`` otherwise.
+ order : bool, None
+ For line and trail marks, this ``order`` property can be set to ``null`` or
+ ``false`` to make the lines use the original order in the data sources.
+ orient : :class:`Orientation`, Literal['horizontal', 'vertical']
+ The orientation of a non-stacked bar, tick, area, and line charts. The value is
+ either horizontal (default) or vertical.
+
+ * For bar, rule and tick, this determines whether the size of the bar and tick
+ should be applied to x or y dimension.
+ * For area, this property determines the orient property of the Vega output.
+ * For line and trail marks, this property determines the sort order of the points in
+ the line if ``config.sortLineBy`` is not specified. For stacked charts, this is
+ always determined by the orientation of the stack; therefore explicitly specified
+ value will be ignored.
+ outerRadius : dict, float, :class:`ExprRef`
+ The outer radius in pixels of arc marks. ``outerRadius`` is an alias for ``radius``.
+
+ **Default value:** ``0``
+ padAngle : dict, float, :class:`ExprRef`
+ The angular padding applied to sides of the arc, in radians.
+ point : bool, dict, Literal['transparent'], :class:`OverlayMarkDef`
+ A flag for overlaying points on top of line or area marks, or an object defining the
+ properties of the overlayed points.
+
+ * If this property is ``"transparent"``, transparent points will be used (for
+ enhancing tooltips and selections).
+
+ * If this property is an empty object (``{}``) or ``true``, filled points with
+ default properties will be used.
+
+ * If this property is ``false``, no points would be automatically added to line or
+ area marks.
+
+ **Default value:** ``false``.
+ radius : dict, float, :class:`ExprRef`
+ For arc mark, the primary (outer) radius in pixels.
+
+ For text marks, polar coordinate radial offset, in pixels, of the text from the
+ origin determined by the ``x`` and ``y`` properties.
+
+ **Default value:** ``min(plot_width, plot_height)/2``
+ radius2 : dict, float, :class:`ExprRef`
+ The secondary (inner) radius in pixels of arc marks.
+
+ **Default value:** ``0``
+ radius2Offset : dict, float, :class:`ExprRef`
+ Offset for radius2.
+ radiusOffset : dict, float, :class:`ExprRef`
+ Offset for radius.
+ shape : str, dict, :class:`ExprRef`, :class:`SymbolShape`
+ Shape of the point marks. Supported values include:
+
+ * plotting shapes: ``"circle"``, ``"square"``, ``"cross"``, ``"diamond"``,
+ ``"triangle-up"``, ``"triangle-down"``, ``"triangle-right"``, or
+ ``"triangle-left"``.
+ * the line symbol ``"stroke"``
+ * centered directional shapes ``"arrow"``, ``"wedge"``, or ``"triangle"``
+ * a custom `SVG path string
+ `__ (For correct
+ sizing, custom shape paths should be defined within a square bounding box with
+ coordinates ranging from -1 to 1 along both the x and y dimensions.)
+
+ **Default value:** ``"circle"``
+ size : dict, float, :class:`ExprRef`
+ Default size for marks.
+
+ * For ``point``/``circle``/``square``, this represents the pixel area of the marks.
+ Note that this value sets the area of the symbol; the side lengths will increase
+ with the square root of this value.
+ * For ``bar``, this represents the band size of the bar, in pixels.
+ * For ``text``, this represents the font size, in pixels.
+
+ **Default value:**
+
+ * ``30`` for point, circle, square marks; width/height's ``step``
+ * ``2`` for bar marks with discrete dimensions;
+ * ``5`` for bar marks with continuous dimensions;
+ * ``11`` for text marks.
+ smooth : bool, dict, :class:`ExprRef`
+ A boolean flag (default true) indicating if the image should be smoothed when
+ resized. If false, individual pixels should be scaled directly rather than
+ interpolated with smoothing. For SVG rendering, this option may not work in some
+ browsers due to lack of standardization.
+ stroke : str, dict, :class:`Color`, :class:`ExprRef`, :class:`Gradient`, :class:`HexColor`, :class:`ColorName`, :class:`LinearGradient`, :class:`RadialGradient`, Literal['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple'], None
+ Default stroke color. This property has higher precedence than ``config.color``. Set
+ to ``null`` to remove stroke.
+
+ **Default value:** (None)
+ strokeCap : dict, :class:`ExprRef`, :class:`StrokeCap`, Literal['butt', 'round', 'square']
+ The stroke cap for line ending style. One of ``"butt"``, ``"round"``, or
+ ``"square"``.
+
+ **Default value:** ``"butt"``
+ strokeDash : dict, Sequence[float], :class:`ExprRef`
+ An array of alternating stroke, space lengths for creating dashed or dotted lines.
+ strokeDashOffset : dict, float, :class:`ExprRef`
+ The offset (in pixels) into which to begin drawing with the stroke dash array.
+ strokeJoin : dict, :class:`ExprRef`, :class:`StrokeJoin`, Literal['miter', 'round', 'bevel']
+ The stroke line join method. One of ``"miter"``, ``"round"`` or ``"bevel"``.
+
+ **Default value:** ``"miter"``
+ strokeMiterLimit : dict, float, :class:`ExprRef`
+ The miter limit at which to bevel a line join.
+ strokeOffset : dict, float, :class:`ExprRef`
+ The offset in pixels at which to draw the group stroke and fill. If unspecified, the
+ default behavior is to dynamically offset stroked groups such that 1 pixel stroke
+ widths align with the pixel grid.
+ strokeOpacity : dict, float, :class:`ExprRef`
+ The stroke opacity (value between [0,1]).
+
+ **Default value:** ``1``
+ strokeWidth : dict, float, :class:`ExprRef`
+ The stroke width, in pixels.
+ style : str, Sequence[str]
+ A string or array of strings indicating the name of custom styles to apply to the
+ mark. A style is a named collection of mark property defaults defined within the
+ `style configuration
+ `__. If style is an
+ array, later styles will override earlier styles. Any `mark properties
+ `__ explicitly
+ defined within the ``encoding`` will override a style default.
+
+ **Default value:** The mark's name. For example, a bar mark will have style
+ ``"bar"`` by default. **Note:** Any specified style will augment the default style.
+ For example, a bar mark with ``"style": "foo"`` will receive from
+ ``config.style.bar`` and ``config.style.foo`` (the specified style ``"foo"`` has
+ higher precedence).
+ tension : dict, float, :class:`ExprRef`
+ Depending on the interpolation type, sets the tension parameter (for line and area
+ marks).
+ text : str, dict, :class:`Text`, Sequence[str], :class:`ExprRef`
+ Placeholder text if the ``text`` channel is not specified
+ theta : dict, float, :class:`ExprRef`
+ * For arc marks, the arc length in radians if theta2 is not specified, otherwise the
+ start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
+ clockwise.)
+
+ * For text marks, polar coordinate angle in radians.
+ theta2 : dict, float, :class:`ExprRef`
+ The end angle of arc marks in radians. A value of 0 indicates up or “north”,
+ increasing values proceed clockwise.
+ theta2Offset : dict, float, :class:`ExprRef`
+ Offset for theta2.
+ thetaOffset : dict, float, :class:`ExprRef`
+ Offset for theta.
+ thickness : float
+ Thickness of the tick mark.
+
+ **Default value:** ``1``
+ timeUnitBandPosition : float
+ Default relative band position for a time unit. If set to ``0``, the marks will be
+ positioned at the beginning of the time unit band step. If set to ``0.5``, the marks
+ will be positioned in the middle of the time unit band step.
+ timeUnitBandSize : float
+ Default relative band size for a time unit. If set to ``1``, the bandwidth of the
+ marks will be equal to the time unit band step. If set to ``0.5``, bandwidth of the
+ marks will be half of the time unit band step.
+ tooltip : str, bool, dict, float, :class:`ExprRef`, :class:`TooltipContent`, None
+ The tooltip text string to show upon mouse hover or an object defining which fields
+ should the tooltip be derived from.
+
+ * If ``tooltip`` is ``true`` or ``{"content": "encoding"}``, then all fields from
+ ``encoding`` will be used.
+ * If ``tooltip`` is ``{"content": "data"}``, then all fields that appear in the
+ highlighted data point will be used.
+ * If set to ``null`` or ``false``, then no tooltip will be used.
+
+ See the `tooltip `__
+ documentation for a detailed discussion about tooltip in Vega-Lite.
+
+ **Default value:** ``null``
+ url : str, dict, :class:`URI`, :class:`ExprRef`
+ The URL of the image file for image marks.
+ width : dict, float, :class:`ExprRef`, :class:`RelativeBandSize`
+ Width of the marks. One of:
+
+ * A number representing a fixed pixel width.
+
+ * A relative band size definition. For example, ``{band: 0.5}`` represents half of
+ the band.
+ x : dict, float, :class:`ExprRef`, Literal['width']
+ X coordinates of the marks, or width of horizontal ``"bar"`` and ``"area"`` without
+ specified ``x2`` or ``width``.
+
+ The ``value`` of this channel can be a number or a string ``"width"`` for the width
+ of the plot.
+ x2 : dict, float, :class:`ExprRef`, Literal['width']
+ X2 coordinates for ranged ``"area"``, ``"bar"``, ``"rect"``, and ``"rule"``.
+
+ The ``value`` of this channel can be a number or a string ``"width"`` for the width
+ of the plot.
+ x2Offset : dict, float, :class:`ExprRef`
+ Offset for x2-position.
+ xOffset : dict, float, :class:`ExprRef`
+ Offset for x-position.
+ y : dict, float, :class:`ExprRef`, Literal['height']
+ Y coordinates of the marks, or height of vertical ``"bar"`` and ``"area"`` without
+ specified ``y2`` or ``height``.
+
+ The ``value`` of this channel can be a number or a string ``"height"`` for the
+ height of the plot.
+ y2 : dict, float, :class:`ExprRef`, Literal['height']
+ Y2 coordinates for ranged ``"area"``, ``"bar"``, ``"rect"``, and ``"rule"``.
+
+ The ``value`` of this channel can be a number or a string ``"height"`` for the
+ height of the plot.
+ y2Offset : dict, float, :class:`ExprRef`
+ Offset for y2-position.
+ yOffset : dict, float, :class:`ExprRef`
+ Offset for y-position.
+ """
+
+ _schema = {"$ref": "#/definitions/MarkDef"}
+
+ def __init__(
self,
align: Optional[Parameter | SchemaBase | Map | Align_T] = Undefined,
angle: Optional[float | Parameter | SchemaBase | Map] = Undefined,
@@ -2857,9 +603,8 @@ def mark_geoshape(
y2Offset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
yOffset: Optional[float | Parameter | SchemaBase | Map] = Undefined,
**kwds,
- ) -> Self:
- """Set the chart's mark to 'geoshape' (see :class:`MarkDef`)."""
- kwds = dict(
+ ):
+ super().__init__(
align=align,
angle=angle,
aria=aria,
@@ -2948,14 +693,95 @@ def mark_geoshape(
yOffset=yOffset,
**kwds,
)
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.MarkDef(type="geoshape", **kwds)
- else:
- copy.mark = "geoshape"
- return copy
- def mark_boxplot(
+
+class _BoxPlotDef(SchemaBase):
+ """
+ BoxPlotDef schema wrapper.
+
+ Parameters
+ ----------
+ box : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ clip : bool
+ Whether a composite mark be clipped to the enclosing group's width and height.
+ color : str, dict, :class:`Color`, :class:`ExprRef`, :class:`Gradient`, :class:`HexColor`, :class:`ColorName`, :class:`LinearGradient`, :class:`RadialGradient`, Literal['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple']
+ Default color.
+
+ **Default value:** :raw-html:`` ■ :raw-html:``
+ ``"#4682b4"``
+
+ **Note:**
+
+ * This property cannot be used in a `style config
+ `__.
+ * The ``fill`` and ``stroke`` properties have higher precedence than ``color`` and
+ will override ``color``.
+ extent : float, Literal['min-max']
+ The extent of the whiskers. Available options include:
+
+ * ``"min-max"``: min and max are the lower and upper whiskers respectively.
+ * A number representing multiple of the interquartile range. This number will be
+ multiplied by the IQR to determine whisker boundary, which spans from the smallest
+ data to the largest data within the range *[Q1 - k * IQR, Q3 + k * IQR]* where
+ *Q1* and *Q3* are the first and third quartiles while *IQR* is the interquartile
+ range (*Q3-Q1*).
+
+ **Default value:** ``1.5``.
+ invalid : :class:`MarkInvalidDataMode`, Literal['filter', 'break-paths-filter-domains', 'break-paths-show-domains', 'break-paths-show-path-domains', 'show'], None
+ Invalid data mode, which defines how the marks and corresponding scales should
+ represent invalid values (``null`` and ``NaN`` in continuous scales *without*
+ defined output for invalid values).
+
+ * ``"filter"`` — *Exclude* all invalid values from the visualization's *marks* and
+ *scales*. For path marks (for line, area, trail), this option will create paths
+ that connect valid points, as if the data rows with invalid values do not exist.
+
+ * ``"break-paths-filter-domains"`` — Break path marks (for line, area, trail) at
+ invalid values. For non-path marks, this is equivalent to ``"filter"``. All
+ *scale* domains will *exclude* these filtered data points.
+
+ * ``"break-paths-show-domains"`` — Break paths (for line, area, trail) at invalid
+ values. Hide invalid values for non-path marks. All *scale* domains will
+ *include* these filtered data points (for both path and non-path marks).
+
+ * ``"show"`` or ``null`` — Show all data points in the marks and scale domains. Each
+ scale will use the output for invalid values defined in ``config.scale.invalid``
+ or, if unspecified, by default invalid values will produce the same visual values
+ as zero (if the scale includes zero) or the minimum value (if the scale does not
+ include zero).
+
+ * ``"break-paths-show-path-domains"`` (default) — This is equivalent to
+ ``"break-paths-show-domains"`` for path-based marks (line/area/trail) and
+ ``"filter"`` for non-path marks.
+
+ **Note**: If any channel's scale has an output for invalid values defined in
+ ``config.scale.invalid``, all values for the scales will be considered "valid" since
+ they can produce a reasonable output for the scales. Thus, fields for such channels
+ will not be filtered and will not cause path breaks.
+ median : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ opacity : float
+ The opacity (value between [0,1]) of the mark.
+ orient : :class:`Orientation`, Literal['horizontal', 'vertical']
+ Orientation of the box plot. This is normally automatically determined based on
+ types of fields on x and y channels. However, an explicit ``orient`` be specified
+ when the orientation is ambiguous.
+
+ **Default value:** ``"vertical"``.
+ outliers : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ rule : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ size : float
+ Size of the box and median tick of a box plot
+ ticks : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ """
+
+ _schema = {"$ref": "#/definitions/BoxPlotDef"}
+
+ def __init__(
self,
box: Optional[bool | SchemaBase | Map] = Undefined,
clip: Optional[bool] = Undefined,
@@ -2970,9 +796,8 @@ def mark_boxplot(
size: Optional[float] = Undefined,
ticks: Optional[bool | SchemaBase | Map] = Undefined,
**kwds,
- ) -> Self:
- """Set the chart's mark to 'boxplot' (see :class:`BoxPlotDef`)."""
- kwds = dict(
+ ):
+ super().__init__(
box=box,
clip=clip,
color=color,
@@ -2987,14 +812,57 @@ def mark_boxplot(
ticks=ticks,
**kwds,
)
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.BoxPlotDef(type="boxplot", **kwds)
- else:
- copy.mark = "boxplot"
- return copy
- def mark_errorbar(
+
+class _ErrorBarDef(SchemaBase):
+ """
+ ErrorBarDef schema wrapper.
+
+ Parameters
+ ----------
+ clip : bool
+ Whether a composite mark be clipped to the enclosing group's width and height.
+ color : str, dict, :class:`Color`, :class:`ExprRef`, :class:`Gradient`, :class:`HexColor`, :class:`ColorName`, :class:`LinearGradient`, :class:`RadialGradient`, Literal['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple']
+ Default color.
+
+ **Default value:** :raw-html:`` ■ :raw-html:``
+ ``"#4682b4"``
+
+ **Note:**
+
+ * This property cannot be used in a `style config
+ `__.
+ * The ``fill`` and ``stroke`` properties have higher precedence than ``color`` and
+ will override ``color``.
+ extent : :class:`ErrorBarExtent`, Literal['ci', 'iqr', 'stderr', 'stdev']
+ The extent of the rule. Available options include:
+
+ * ``"ci"``: Extend the rule to the confidence interval of the mean.
+ * ``"stderr"``: The size of rule are set to the value of standard error, extending
+ from the mean.
+ * ``"stdev"``: The size of rule are set to the value of standard deviation,
+ extending from the mean.
+ * ``"iqr"``: Extend the rule to the q1 and q3.
+
+ **Default value:** ``"stderr"``.
+ opacity : float
+ The opacity (value between [0,1]) of the mark.
+ orient : :class:`Orientation`, Literal['horizontal', 'vertical']
+ Orientation of the error bar. This is normally automatically determined, but can be
+ specified when the orientation is ambiguous and cannot be automatically determined.
+ rule : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ size : float
+ Size of the ticks of an error bar
+ thickness : float
+ Thickness of the ticks and the bar of an error bar
+ ticks : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ """
+
+ _schema = {"$ref": "#/definitions/ErrorBarDef"}
+
+ def __init__(
self,
clip: Optional[bool] = Undefined,
color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
@@ -3006,9 +874,8 @@ def mark_errorbar(
thickness: Optional[float] = Undefined,
ticks: Optional[bool | SchemaBase | Map] = Undefined,
**kwds,
- ) -> Self:
- """Set the chart's mark to 'errorbar' (see :class:`ErrorBarDef`)."""
- kwds = dict(
+ ):
+ super().__init__(
clip=clip,
color=color,
extent=extent,
@@ -3020,14 +887,77 @@ def mark_errorbar(
ticks=ticks,
**kwds,
)
- copy = self.copy(deep=False) # type: ignore[attr-defined]
- if any(val is not Undefined for val in kwds.values()):
- copy.mark = core.ErrorBarDef(type="errorbar", **kwds)
- else:
- copy.mark = "errorbar"
- return copy
- def mark_errorband(
+
+class _ErrorBandDef(SchemaBase):
+ """
+ ErrorBandDef schema wrapper.
+
+ Parameters
+ ----------
+ band : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ borders : bool, dict, :class:`BarConfig`, :class:`AreaConfig`, :class:`LineConfig`, :class:`MarkConfig`, :class:`RectConfig`, :class:`TickConfig`, :class:`AnyMarkConfig`
+
+ clip : bool
+ Whether a composite mark be clipped to the enclosing group's width and height.
+ color : str, dict, :class:`Color`, :class:`ExprRef`, :class:`Gradient`, :class:`HexColor`, :class:`ColorName`, :class:`LinearGradient`, :class:`RadialGradient`, Literal['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple']
+ Default color.
+
+ **Default value:** :raw-html:`` ■ :raw-html:``
+ ``"#4682b4"``
+
+ **Note:**
+
+ * This property cannot be used in a `style config
+ `__.
+ * The ``fill`` and ``stroke`` properties have higher precedence than ``color`` and
+ will override ``color``.
+ extent : :class:`ErrorBarExtent`, Literal['ci', 'iqr', 'stderr', 'stdev']
+ The extent of the band. Available options include:
+
+ * ``"ci"``: Extend the band to the confidence interval of the mean.
+ * ``"stderr"``: The size of band are set to the value of standard error, extending
+ from the mean.
+ * ``"stdev"``: The size of band are set to the value of standard deviation,
+ extending from the mean.
+ * ``"iqr"``: Extend the band to the q1 and q3.
+
+ **Default value:** ``"stderr"``.
+ interpolate : :class:`Interpolate`, Literal['basis', 'basis-open', 'basis-closed', 'bundle', 'cardinal', 'cardinal-open', 'cardinal-closed', 'catmull-rom', 'linear', 'linear-closed', 'monotone', 'natural', 'step', 'step-before', 'step-after']
+ The line interpolation method for the error band. One of the following:
+
+ * ``"linear"``: piecewise linear segments, as in a polyline.
+ * ``"linear-closed"``: close the linear segments to form a polygon.
+ * ``"step"``: a piecewise constant function (a step function) consisting of
+ alternating horizontal and vertical lines. The y-value changes at the midpoint of
+ each pair of adjacent x-values.
+ * ``"step-before"``: a piecewise constant function (a step function) consisting of
+ alternating horizontal and vertical lines. The y-value changes before the x-value.
+ * ``"step-after"``: a piecewise constant function (a step function) consisting of
+ alternating horizontal and vertical lines. The y-value changes after the x-value.
+ * ``"basis"``: a B-spline, with control point duplication on the ends.
+ * ``"basis-open"``: an open B-spline; may not intersect the start or end.
+ * ``"basis-closed"``: a closed B-spline, as in a loop.
+ * ``"cardinal"``: a Cardinal spline, with control point duplication on the ends.
+ * ``"cardinal-open"``: an open Cardinal spline; may not intersect the start or end,
+ but will intersect other control points.
+ * ``"cardinal-closed"``: a closed Cardinal spline, as in a loop.
+ * ``"bundle"``: equivalent to basis, except the tension parameter is used to
+ straighten the spline.
+ * ``"monotone"``: cubic interpolation that preserves monotonicity in y.
+ opacity : float
+ The opacity (value between [0,1]) of the mark.
+ orient : :class:`Orientation`, Literal['horizontal', 'vertical']
+ Orientation of the error band. This is normally automatically determined, but can be
+ specified when the orientation is ambiguous and cannot be automatically determined.
+ tension : float
+ The tension parameter for the interpolation type of the error band.
+ """
+
+ _schema = {"$ref": "#/definitions/ErrorBandDef"}
+
+ def __init__(
self,
band: Optional[bool | SchemaBase | Map] = Undefined,
borders: Optional[bool | SchemaBase | Map] = Undefined,
@@ -3039,9 +969,8 @@ def mark_errorband(
orient: Optional[SchemaBase | Orientation_T] = Undefined,
tension: Optional[float] = Undefined,
**kwds,
- ) -> Self:
- """Set the chart's mark to 'errorband' (see :class:`ErrorBandDef`)."""
- kwds = dict(
+ ):
+ super().__init__(
band=band,
borders=borders,
clip=clip,
@@ -3053,6 +982,174 @@ def mark_errorband(
tension=tension,
**kwds,
)
+
+
+class MarkMethodMixin:
+ """A mixin class that defines mark methods."""
+
+ @use_signature(_MarkDef)
+ def mark_arc(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'arc' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="arc", **kwds)
+ else:
+ copy.mark = "arc"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_area(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'area' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="area", **kwds)
+ else:
+ copy.mark = "area"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_bar(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'bar' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="bar", **kwds)
+ else:
+ copy.mark = "bar"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_image(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'image' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="image", **kwds)
+ else:
+ copy.mark = "image"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_line(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'line' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="line", **kwds)
+ else:
+ copy.mark = "line"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_point(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'point' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="point", **kwds)
+ else:
+ copy.mark = "point"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_rect(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'rect' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="rect", **kwds)
+ else:
+ copy.mark = "rect"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_rule(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'rule' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="rule", **kwds)
+ else:
+ copy.mark = "rule"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_text(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'text' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="text", **kwds)
+ else:
+ copy.mark = "text"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_tick(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'tick' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="tick", **kwds)
+ else:
+ copy.mark = "tick"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_trail(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'trail' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="trail", **kwds)
+ else:
+ copy.mark = "trail"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_circle(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'circle' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="circle", **kwds)
+ else:
+ copy.mark = "circle"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_square(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'square' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="square", **kwds)
+ else:
+ copy.mark = "square"
+ return copy
+
+ @use_signature(_MarkDef)
+ def mark_geoshape(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'geoshape' (see :class:`MarkDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.MarkDef(type="geoshape", **kwds)
+ else:
+ copy.mark = "geoshape"
+ return copy
+
+ @use_signature(_BoxPlotDef)
+ def mark_boxplot(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'boxplot' (see :class:`BoxPlotDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.BoxPlotDef(type="boxplot", **kwds)
+ else:
+ copy.mark = "boxplot"
+ return copy
+
+ @use_signature(_ErrorBarDef)
+ def mark_errorbar(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'errorbar' (see :class:`ErrorBarDef`)."""
+ copy = self.copy(deep=False) # type: ignore[attr-defined]
+ if any(val is not Undefined for val in kwds.values()):
+ copy.mark = core.ErrorBarDef(type="errorbar", **kwds)
+ else:
+ copy.mark = "errorbar"
+ return copy
+
+ @use_signature(_ErrorBandDef)
+ def mark_errorband(self, **kwds: Any) -> Self:
+ """Set the chart's mark to 'errorband' (see :class:`ErrorBandDef`)."""
copy = self.copy(deep=False) # type: ignore[attr-defined]
if any(val is not Undefined for val in kwds.values()):
copy.mark = core.ErrorBandDef(type="errorband", **kwds)
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index 70c3980e4..278606551 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -7,7 +7,6 @@
import json
import sys
import textwrap
-from collections import deque
from dataclasses import dataclass
from itertools import chain
from operator import attrgetter
@@ -218,9 +217,10 @@ class MarkMethodMixin:
'''
MARK_METHOD: Final = '''
-def mark_{mark}(self, {method_args}, **kwds) -> Self:
+@use_signature({decorator})
+def mark_{mark}(self, **kwds: Any) -> Self:
"""Set the chart's mark to '{mark}' (see :class:`{mark_def}`)."""
- kwds = dict({dict_args}, **kwds)
+
copy = self.copy(deep=False) # type: ignore[attr-defined]
if any(val is not Undefined for val in kwds.values()):
copy.mark = core.{mark_def}(type="{mark}", **kwds)
@@ -903,32 +903,30 @@ def generate_vegalite_mark_mixin(fp: Path, /, markdefs: dict[str, str]) -> str:
schema = load_schema(fp)
code: list[str] = []
+ it_dummy = (
+ SchemaGenerator(
+ classname=f"_{mark_def}",
+ schema={"$ref": "#/definitions/" + mark_def},
+ rootschema=schema,
+ schemarepr={"$ref": "#/definitions/" + mark_def},
+ exclude_properties={"type"},
+ summary=f"{mark_def} schema wrapper.",
+ ).schema_class()
+ for mark_def in markdefs.values()
+ )
+
for mark_enum, mark_def in markdefs.items():
_def = schema["definitions"][mark_enum]
marks: list[Any] = _def["enum"] if "enum" in _def else [_def["const"]]
- info = SchemaInfo.from_refname(mark_def, rootschema=schema)
- mark_args = generate_mark_args(info)
for mark in marks:
# TODO: only include args relevant to given type?
- mark_method = MARK_METHOD.format(mark=mark, mark_def=mark_def, **mark_args)
+ mark_method = MARK_METHOD.format(
+ decorator=f"_{mark_def}", mark=mark, mark_def=mark_def
+ )
code.append("\n ".join(mark_method.splitlines()))
- return MARK_MIXIN.format(methods="\n".join(code))
-
-
-def generate_mark_args(
- info: SchemaInfo, /
-) -> dict[Literal["method_args", "dict_args"], str]:
- args = codegen.get_args(info)
- method_args: deque[str] = deque()
- dict_args: deque[str] = deque()
- for p, p_info in args.iter_args(arg_required_kwds, exclude="type"):
- dict_args.append(f"{p}={p}")
- method_args.append(
- f"{p}: {p_info.to_type_repr(target='annotation', use_undefined=True)} = Undefined"
- )
- return {"method_args": ", ".join(method_args), "dict_args": ", ".join(dict_args)}
+ return "\n".join(chain(it_dummy, [MARK_MIXIN.format(methods="\n".join(code))]))
def generate_typed_dict(
@@ -1143,7 +1141,7 @@ def vegalite_main(skip_download: bool = False) -> None:
print(f"Generating\n {schemafile!s}\n ->{fp_mixins!s}")
mixins_imports = (
"from typing import Any, Sequence, List, Literal, Union",
- "from altair.utils import use_signature, Undefined",
+ "from altair.utils import use_signature, Undefined, SchemaBase",
"from . import core",
)
@@ -1159,7 +1157,7 @@ def vegalite_main(skip_download: bool = False) -> None:
textwrap.indent(import_typing_extensions((3, 11), "Self"), " "),
"from altair.typing import Optional",
"from ._typing import * # noqa: F403",
- "from altair import Parameter, SchemaBase",
+ "from altair import Parameter",
),
"\n\n\n",
mark_mixin,
diff --git a/tools/schemapi/codegen.py b/tools/schemapi/codegen.py
index 37d512087..dbb3f5974 100644
--- a/tools/schemapi/codegen.py
+++ b/tools/schemapi/codegen.py
@@ -221,6 +221,9 @@ def __init__(
schemarepr: object | None = None,
rootschemarepr: object | None = None,
nodefault: list[str] | None = None,
+ *,
+ exclude_properties: Iterable[str] = (),
+ summary: str | None = None,
**kwargs,
) -> None:
self.classname = classname
@@ -230,6 +233,8 @@ def __init__(
self.schemarepr = schemarepr
self.rootschemarepr = rootschemarepr
self.nodefault = nodefault or ()
+ self.exclude_properties: set[str] = set(exclude_properties)
+ self.summary: str = summary or f"{self.classname} schema wrapper"
self.kwargs = kwargs
def subclasses(self) -> Iterator[str]:
@@ -288,7 +293,7 @@ def arg_info(self) -> ArgInfo:
def docstring(self, indent: int = 0) -> str:
info = self.info
# https://numpydoc.readthedocs.io/en/latest/format.html#short-summary
- doc = [f"{self.classname} schema wrapper"]
+ doc = [self.summary]
if info.description:
# https://numpydoc.readthedocs.io/en/latest/format.html#extended-summary
# Remove condition from description
@@ -309,7 +314,10 @@ def docstring(self, indent: int = 0) -> str:
it = chain.from_iterable(
(f"{p} : {p_info.to_type_repr()}", f" {p_info.deep_description}")
for p, p_info in arg_info.iter_args(
- arg_info.required, arg_kwds, arg_invalid_kwds
+ arg_info.required,
+ arg_kwds,
+ arg_invalid_kwds,
+ exclude=self.exclude_properties,
)
)
doc.extend(chain(["", "Parameters", "----------", ""], it))
@@ -331,10 +339,11 @@ def init_code(self, indent: int = 0) -> str:
def init_args(self) -> tuple[list[str], list[str]]:
info = self.info
arg_info = self.arg_info
+ exclude = self.exclude_properties
nodefault = set(self.nodefault)
- arg_info.required -= nodefault
- arg_info.kwds -= nodefault
+ arg_info.required.difference_update(nodefault, exclude)
+ arg_info.kwds.difference_update(nodefault, exclude)
args: list[str] = ["self"]
super_args: list[str] = []
From 255f7361cac4c88f395b83504a7cbbf5b91d80f2 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 11 Nov 2024 17:13:14 +0000
Subject: [PATCH 15/53] refactor: `alt.themes` -> `alt.theme` (#3618)
---
altair/__init__.py | 38 +-
altair/theme.py | 321 +++++++++++++
altair/typing/__init__.py | 4 -
altair/typing/theme.py | 1 -
altair/utils/deprecation.py | 87 +++-
altair/utils/plugin_registry.py | 16 +-
altair/utils/theme.py | 52 ---
altair/vegalite/v5/__init__.py | 644 +++++++++++++++++++++++++-
altair/vegalite/v5/api.py | 8 +-
altair/vegalite/v5/schema/__init__.py | 569 ++++++++++++++++++++++-
altair/vegalite/v5/schema/_config.py | 134 +++---
altair/vegalite/v5/theme.py | 145 +++---
doc/user_guide/api.rst | 102 +++-
doc/user_guide/customization.rst | 54 +--
tests/utils/test_deprecation.py | 24 +
tests/vegalite/test_common.py | 13 +-
tests/vegalite/v5/test_api.py | 8 +-
tests/vegalite/v5/test_theme.py | 81 +++-
tools/generate_api_docs.py | 43 +-
tools/generate_schema_wrapper.py | 116 ++++-
tools/update_init_file.py | 119 ++++-
21 files changed, 2268 insertions(+), 311 deletions(-)
create mode 100644 altair/theme.py
delete mode 100644 altair/typing/theme.py
delete mode 100644 altair/utils/theme.py
diff --git a/altair/__init__.py b/altair/__init__.py
index d4e20f02f..cbc2c3b52 100644
--- a/altair/__init__.py
+++ b/altair/__init__.py
@@ -617,7 +617,6 @@
"mixins",
"param",
"parse_shorthand",
- "register_theme",
"renderers",
"repeat",
"sample",
@@ -627,7 +626,6 @@
"sequence",
"sphere",
"theme",
- "themes",
"to_csv",
"to_json",
"to_values",
@@ -653,10 +651,44 @@ def __dir__():
from altair.jupyter import JupyterChart
from altair.expr import expr
from altair.utils import AltairDeprecationWarning, parse_shorthand, Undefined
-from altair import typing
+from altair import typing, theme
def load_ipython_extension(ipython):
from altair._magics import vegalite
ipython.register_magic_function(vegalite, "cell")
+
+
+def __getattr__(name: str):
+ from altair.utils.deprecation import deprecated_warn
+
+ if name == "themes":
+ deprecated_warn(
+ "Most cases require only the following change:\n\n"
+ " # Deprecated\n"
+ " alt.themes.enable('quartz')\n\n"
+ " # Updated\n"
+ " alt.theme.enable('quartz')\n\n"
+ "If your code registers a theme, make the following change:\n\n"
+ " # Deprecated\n"
+ " def custom_theme():\n"
+ " return {'height': 400, 'width': 700}\n"
+ " alt.themes.register('theme_name', custom_theme)\n"
+ " alt.themes.enable('theme_name')\n\n"
+ " # Updated\n"
+ " @alt.theme.register('theme_name', enable=True)\n"
+ " def custom_theme() -> alt.theme.ThemeConfig:\n"
+ " return {'height': 400, 'width': 700}\n\n"
+ "See the updated User Guide for further details:\n"
+ " https://altair-viz.github.io/user_guide/api.html#theme\n"
+ " https://altair-viz.github.io/user_guide/customization.html#chart-themes",
+ version="5.5.0",
+ alternative="altair.theme",
+ stacklevel=3,
+ action="once",
+ )
+ return theme._themes
+ else:
+ msg = f"module {__name__!r} has no attribute {name!r}"
+ raise AttributeError(msg)
diff --git a/altair/theme.py b/altair/theme.py
new file mode 100644
index 000000000..e77a95eb8
--- /dev/null
+++ b/altair/theme.py
@@ -0,0 +1,321 @@
+"""Customizing chart configuration defaults."""
+
+from __future__ import annotations
+
+from functools import wraps as _wraps
+from typing import TYPE_CHECKING, Any
+from typing import overload as _overload
+
+from altair.vegalite.v5.schema._config import (
+ AreaConfigKwds,
+ AutoSizeParamsKwds,
+ AxisConfigKwds,
+ AxisResolveMapKwds,
+ BarConfigKwds,
+ BindCheckboxKwds,
+ BindDirectKwds,
+ BindInputKwds,
+ BindRadioSelectKwds,
+ BindRangeKwds,
+ BoxPlotConfigKwds,
+ BrushConfigKwds,
+ CompositionConfigKwds,
+ ConfigKwds,
+ DateTimeKwds,
+ DerivedStreamKwds,
+ ErrorBandConfigKwds,
+ ErrorBarConfigKwds,
+ FeatureGeometryGeoJsonPropertiesKwds,
+ FormatConfigKwds,
+ GeoJsonFeatureCollectionKwds,
+ GeoJsonFeatureKwds,
+ GeometryCollectionKwds,
+ GradientStopKwds,
+ HeaderConfigKwds,
+ IntervalSelectionConfigKwds,
+ IntervalSelectionConfigWithoutTypeKwds,
+ LegendConfigKwds,
+ LegendResolveMapKwds,
+ LegendStreamBindingKwds,
+ LinearGradientKwds,
+ LineConfigKwds,
+ LineStringKwds,
+ LocaleKwds,
+ MarkConfigKwds,
+ MergedStreamKwds,
+ MultiLineStringKwds,
+ MultiPointKwds,
+ MultiPolygonKwds,
+ NumberLocaleKwds,
+ OverlayMarkDefKwds,
+ PaddingKwds,
+ PointKwds,
+ PointSelectionConfigKwds,
+ PointSelectionConfigWithoutTypeKwds,
+ PolygonKwds,
+ ProjectionConfigKwds,
+ ProjectionKwds,
+ RadialGradientKwds,
+ RangeConfigKwds,
+ RectConfigKwds,
+ ResolveKwds,
+ RowColKwds,
+ ScaleConfigKwds,
+ ScaleInvalidDataConfigKwds,
+ ScaleResolveMapKwds,
+ SelectionConfigKwds,
+ StepKwds,
+ StyleConfigIndexKwds,
+ ThemeConfig,
+ TickConfigKwds,
+ TimeIntervalStepKwds,
+ TimeLocaleKwds,
+ TitleConfigKwds,
+ TitleParamsKwds,
+ TooltipContentKwds,
+ TopLevelSelectionParameterKwds,
+ VariableParameterKwds,
+ ViewBackgroundKwds,
+ ViewConfigKwds,
+)
+from altair.vegalite.v5.theme import themes as _themes
+
+if TYPE_CHECKING:
+ import sys
+ from typing import Any, Callable, Literal
+
+ 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 ParamSpec
+ else:
+ from typing_extensions import ParamSpec
+
+ from altair.utils.plugin_registry import Plugin
+
+ P = ParamSpec("P")
+
+__all__ = [
+ "AreaConfigKwds",
+ "AutoSizeParamsKwds",
+ "AxisConfigKwds",
+ "AxisResolveMapKwds",
+ "BarConfigKwds",
+ "BindCheckboxKwds",
+ "BindDirectKwds",
+ "BindInputKwds",
+ "BindRadioSelectKwds",
+ "BindRangeKwds",
+ "BoxPlotConfigKwds",
+ "BrushConfigKwds",
+ "CompositionConfigKwds",
+ "ConfigKwds",
+ "DateTimeKwds",
+ "DerivedStreamKwds",
+ "ErrorBandConfigKwds",
+ "ErrorBarConfigKwds",
+ "FeatureGeometryGeoJsonPropertiesKwds",
+ "FormatConfigKwds",
+ "GeoJsonFeatureCollectionKwds",
+ "GeoJsonFeatureKwds",
+ "GeometryCollectionKwds",
+ "GradientStopKwds",
+ "HeaderConfigKwds",
+ "IntervalSelectionConfigKwds",
+ "IntervalSelectionConfigWithoutTypeKwds",
+ "LegendConfigKwds",
+ "LegendResolveMapKwds",
+ "LegendStreamBindingKwds",
+ "LineConfigKwds",
+ "LineStringKwds",
+ "LinearGradientKwds",
+ "LocaleKwds",
+ "MarkConfigKwds",
+ "MergedStreamKwds",
+ "MultiLineStringKwds",
+ "MultiPointKwds",
+ "MultiPolygonKwds",
+ "NumberLocaleKwds",
+ "OverlayMarkDefKwds",
+ "PaddingKwds",
+ "PointKwds",
+ "PointSelectionConfigKwds",
+ "PointSelectionConfigWithoutTypeKwds",
+ "PolygonKwds",
+ "ProjectionConfigKwds",
+ "ProjectionKwds",
+ "RadialGradientKwds",
+ "RangeConfigKwds",
+ "RectConfigKwds",
+ "ResolveKwds",
+ "RowColKwds",
+ "ScaleConfigKwds",
+ "ScaleInvalidDataConfigKwds",
+ "ScaleResolveMapKwds",
+ "SelectionConfigKwds",
+ "StepKwds",
+ "StyleConfigIndexKwds",
+ "ThemeConfig",
+ "TickConfigKwds",
+ "TimeIntervalStepKwds",
+ "TimeLocaleKwds",
+ "TitleConfigKwds",
+ "TitleParamsKwds",
+ "TooltipContentKwds",
+ "TopLevelSelectionParameterKwds",
+ "VariableParameterKwds",
+ "ViewBackgroundKwds",
+ "ViewConfigKwds",
+ "active",
+ "enable",
+ "get",
+ "names",
+ "options",
+ "register",
+ "unregister",
+]
+
+
+def register(
+ name: LiteralString, *, enable: bool
+) -> Callable[[Plugin[ThemeConfig]], Plugin[ThemeConfig]]:
+ """
+ Decorator for registering a theme function.
+
+ Parameters
+ ----------
+ name
+ Unique name assigned in registry.
+ enable
+ Auto-enable the wrapped theme.
+
+ Examples
+ --------
+ Register and enable a theme::
+
+ import altair as alt
+ from altair import theme
+
+
+ @theme.register("param_font_size", enable=True)
+ def custom_theme() -> theme.ThemeConfig:
+ sizes = 12, 14, 16, 18, 20
+ return {
+ "autosize": {"contains": "content", "resize": True},
+ "background": "#F3F2F1",
+ "config": {
+ "axisX": {"labelFontSize": sizes[1], "titleFontSize": sizes[1]},
+ "axisY": {"labelFontSize": sizes[1], "titleFontSize": sizes[1]},
+ "font": "'Lato', 'Segoe UI', Tahoma, Verdana, sans-serif",
+ "headerColumn": {"labelFontSize": sizes[1]},
+ "headerFacet": {"labelFontSize": sizes[1]},
+ "headerRow": {"labelFontSize": sizes[1]},
+ "legend": {"labelFontSize": sizes[0], "titleFontSize": sizes[1]},
+ "text": {"fontSize": sizes[0]},
+ "title": {"fontSize": sizes[-1]},
+ },
+ "height": {"step": 28},
+ "width": 350,
+ }
+
+ We can then see the ``name`` parameter displayed when checking::
+
+ theme.active
+ "param_font_size"
+
+ Until another theme has been enabled, all charts will use defaults set in ``custom_theme()``::
+
+ from vega_datasets import data
+
+ source = data.stocks()
+ lines = (
+ alt.Chart(source, title=alt.Title("Stocks"))
+ .mark_line()
+ .encode(x="date:T", y="price:Q", color="symbol:N")
+ )
+ lines.interactive(bind_y=False)
+
+ """
+
+ # HACK: See for `LiteralString` requirement in `name`
+ # https://github.com/vega/altair/pull/3526#discussion_r1743350127
+ def decorate(func: Plugin[ThemeConfig], /) -> Plugin[ThemeConfig]:
+ _register(name, func)
+ if enable:
+ _themes.enable(name)
+
+ @_wraps(func)
+ def wrapper(*args: P.args, **kwargs: P.kwargs) -> ThemeConfig:
+ return func(*args, **kwargs)
+
+ return wrapper
+
+ return decorate
+
+
+def unregister(name: LiteralString) -> Plugin[ThemeConfig]:
+ """
+ Remove and return a previously registered theme.
+
+ Parameters
+ ----------
+ name
+ Unique name assigned during ``alt.theme.register``.
+
+ Raises
+ ------
+ TypeError
+ When ``name`` has not been registered.
+ """
+ plugin = _register(name, None)
+ if plugin is None:
+ msg = (
+ f"Found no theme named {name!r} in registry.\n"
+ f"Registered themes:\n"
+ f"{names()!r}"
+ )
+ raise TypeError(msg)
+ else:
+ return plugin
+
+
+enable = _themes.enable
+get = _themes.get
+names = _themes.names
+active: str
+"""Return the name of the currently active theme."""
+options: dict[str, Any]
+"""Return the current themes options dictionary."""
+
+
+def __dir__() -> list[str]:
+ return __all__
+
+
+@_overload
+def __getattr__(name: Literal["active"]) -> str: ... # type: ignore[misc]
+@_overload
+def __getattr__(name: Literal["options"]) -> dict[str, Any]: ... # type: ignore[misc]
+def __getattr__(name: str) -> Any:
+ if name == "active":
+ return _themes.active
+ elif name == "options":
+ return _themes.options
+ else:
+ msg = f"module {__name__!r} has no attribute {name!r}"
+ raise AttributeError(msg)
+
+
+def _register(
+ name: LiteralString, fn: Plugin[ThemeConfig] | None, /
+) -> Plugin[ThemeConfig] | None:
+ if fn is None:
+ return _themes._plugins.pop(name, None)
+ elif _themes.plugin_type(fn):
+ _themes._plugins[name] = fn
+ return fn
+ else:
+ msg = f"{type(fn).__name__!r} is not a callable theme\n\n{fn!r}"
+ raise TypeError(msg)
diff --git a/altair/typing/__init__.py b/altair/typing/__init__.py
index d80469f35..cd8cb1489 100644
--- a/altair/typing/__init__.py
+++ b/altair/typing/__init__.py
@@ -46,13 +46,9 @@
"ChartType",
"EncodeKwds",
"Optional",
- "ThemeConfig",
"is_chart_type",
- "theme",
]
-from altair.typing import theme
-from altair.typing.theme import ThemeConfig
from altair.utils.schemapi import Optional
from altair.vegalite.v5.api import ChartType, is_chart_type
from altair.vegalite.v5.schema.channels import (
diff --git a/altair/typing/theme.py b/altair/typing/theme.py
deleted file mode 100644
index 17f9a7fd2..000000000
--- a/altair/typing/theme.py
+++ /dev/null
@@ -1 +0,0 @@
-from altair.vegalite.v5.schema._config import * # noqa: F403
diff --git a/altair/utils/deprecation.py b/altair/utils/deprecation.py
index f11dd1a41..2b07a229e 100644
--- a/altair/utils/deprecation.py
+++ b/altair/utils/deprecation.py
@@ -1,8 +1,9 @@
from __future__ import annotations
import sys
+import threading
import warnings
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, Literal
if sys.version_info >= (3, 13):
from warnings import deprecated as _deprecated
@@ -16,6 +17,13 @@
else:
from typing_extensions import LiteralString
+__all__ = [
+ "AltairDeprecationWarning",
+ "deprecated",
+ "deprecated_static_only",
+ "deprecated_warn",
+]
+
class AltairDeprecationWarning(DeprecationWarning): ...
@@ -26,7 +34,7 @@ def _format_message(
message: LiteralString | None,
/,
) -> LiteralString:
- output = f"Deprecated in `altair={version}`."
+ output = f"\nDeprecated since `altair={version}`."
if alternative:
output = f"{output} Use {alternative} instead."
return f"{output}\n{message}" if message else output
@@ -81,6 +89,7 @@ def deprecated_warn(
alternative: LiteralString | None = None,
category: type[AltairDeprecationWarning] = AltairDeprecationWarning,
stacklevel: int = 2,
+ action: Literal["once"] | None = None,
) -> None:
"""
Indicate that the current code path is deprecated.
@@ -112,4 +121,76 @@ def deprecated_warn(
[warnings.warn](https://docs.python.org/3/library/warnings.html#warnings.warn)
"""
msg = _format_message(version, alternative, message)
- warnings.warn(msg, category=category, stacklevel=stacklevel)
+ if action is None:
+ warnings.warn(msg, category=category, stacklevel=stacklevel)
+ elif action == "once":
+ _warn_once(msg, category=category, stacklevel=stacklevel)
+ else:
+ raise NotImplementedError(action)
+
+
+deprecated_static_only = _deprecated
+"""
+Using this decorator **exactly as described**, ensures ``message`` is displayed to a static type checker.
+
+**BE CAREFUL USING THIS**.
+
+See screenshots in `comment`_ for motivation.
+
+Every use should look like::
+
+ @deprecated_static_only(
+ "Deprecated since `altair=5.5.0`. Use altair.other instead.",
+ category=None,
+ )
+ def old_function(*args): ...
+
+If a runtime warning is desired, use `@alt.utils.deprecated` instead.
+
+Parameters
+----------
+message : LiteralString
+ - **Not** a variable
+ - **Not** use placeholders
+ - **Not** use concatenation
+ - **Do not use anything that could be considered dynamic**
+
+category : None
+ You **need** to explicitly pass ``None``
+
+.. _comment:
+ https://github.com/vega/altair/pull/3618#issuecomment-2423991968
+---
+"""
+
+
+class _WarningsMonitor:
+ def __init__(self) -> None:
+ self._warned: dict[LiteralString, Literal[True]] = {}
+ self._lock = threading.Lock()
+
+ def __contains__(self, key: LiteralString, /) -> bool:
+ with self._lock:
+ return key in self._warned
+
+ def hit(self, key: LiteralString, /) -> None:
+ with self._lock:
+ self._warned[key] = True
+
+ def clear(self) -> None:
+ with self._lock:
+ self._warned.clear()
+
+
+_warnings_monitor = _WarningsMonitor()
+
+
+def _warn_once(
+ msg: LiteralString, /, *, category: type[AltairDeprecationWarning], stacklevel: int
+) -> None:
+ global _warnings_monitor
+ if msg in _warnings_monitor:
+ return
+ else:
+ _warnings_monitor.hit(msg)
+ warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
diff --git a/altair/utils/plugin_registry.py b/altair/utils/plugin_registry.py
index b2723396a..b4505fd9f 100644
--- a/altair/utils/plugin_registry.py
+++ b/altair/utils/plugin_registry.py
@@ -39,7 +39,7 @@ def __str__(self):
return f"No {self.name!r} entry point found in group {self.group!r}"
-class PluginEnabler:
+class PluginEnabler(Generic[PluginT, R]):
"""
Context manager for enabling plugins.
@@ -51,21 +51,23 @@ class PluginEnabler:
# plugins back to original state
"""
- def __init__(self, registry: PluginRegistry, name: str, **options):
- self.registry: PluginRegistry = registry
+ def __init__(
+ self, registry: PluginRegistry[PluginT, R], name: str, **options: Any
+ ) -> None:
+ self.registry: PluginRegistry[PluginT, R] = registry
self.name: str = name
self.options: dict[str, Any] = options
self.original_state: dict[str, Any] = registry._get_state()
self.registry._enable(name, **options)
- def __enter__(self) -> PluginEnabler:
+ def __enter__(self) -> PluginEnabler[PluginT, R]:
return self
def __exit__(self, typ: type, value: Exception, traceback: TracebackType) -> None:
self.registry._set_state(self.original_state)
def __repr__(self) -> str:
- return f"{self.registry.__class__.__name__}.enable({self.name!r})"
+ return f"{type(self.registry).__name__}.enable({self.name!r})"
class PluginRegistry(Generic[PluginT, R]):
@@ -211,7 +213,9 @@ def _enable(self, name: str, **options) -> None:
self._global_settings[key] = options.pop(key)
self._options = options
- def enable(self, name: str | None = None, **options) -> PluginEnabler:
+ def enable(
+ self, name: str | None = None, **options: Any
+ ) -> PluginEnabler[PluginT, R]:
"""
Enable a plugin by name.
diff --git a/altair/utils/theme.py b/altair/utils/theme.py
deleted file mode 100644
index bbb7247bc..000000000
--- a/altair/utils/theme.py
+++ /dev/null
@@ -1,52 +0,0 @@
-"""Utilities for registering and working with themes."""
-
-from __future__ import annotations
-
-import sys
-from typing import TYPE_CHECKING
-
-from altair.utils.plugin_registry import Plugin, PluginRegistry
-from altair.vegalite.v5.schema._config import ThemeConfig
-
-if sys.version_info >= (3, 11):
- from typing import LiteralString
-else:
- from typing_extensions import LiteralString
-
-if TYPE_CHECKING:
- from altair.utils.plugin_registry import PluginEnabler
- from altair.vegalite.v5.theme import AltairThemes, VegaThemes
-
-ThemeType = Plugin[ThemeConfig]
-
-
-# HACK: See for `LiteralString` requirement in `name`
-# https://github.com/vega/altair/pull/3526#discussion_r1743350127
-class ThemeRegistry(PluginRegistry[ThemeType, ThemeConfig]):
- def enable(
- self, name: LiteralString | AltairThemes | VegaThemes | None = None, **options
- ) -> PluginEnabler:
- """
- Enable a theme by name.
-
- This can be either called directly, or used as a context manager.
-
- Parameters
- ----------
- name : string (optional)
- The name of the theme to enable. If not specified, then use the
- current active name.
- **options :
- Any additional parameters will be passed to the theme as keyword
- arguments
-
- Returns
- -------
- PluginEnabler:
- An object that allows enable() to be used as a context manager
-
- Notes
- -----
- Default `vega` themes can be previewed at https://vega.github.io/vega-themes/
- """
- return super().enable(name, **options)
diff --git a/altair/vegalite/v5/__init__.py b/altair/vegalite/v5/__init__.py
index a18be6e11..d8d794b2a 100644
--- a/altair/vegalite/v5/__init__.py
+++ b/altair/vegalite/v5/__init__.py
@@ -1,9 +1,9 @@
-# ruff: noqa: F401, F403
+# ruff: noqa: F401, F403, F405
from altair.expr.core import datum
-
-from .api import *
-from .compiler import vegalite_compilers
-from .data import (
+from altair.vegalite.v5 import api, compiler, schema
+from altair.vegalite.v5.api import *
+from altair.vegalite.v5.compiler import vegalite_compilers
+from altair.vegalite.v5.data import (
MaxRowsError,
data_transformers,
default_data_transformer,
@@ -13,12 +13,640 @@
to_json,
to_values,
)
-from .display import (
+from altair.vegalite.v5.display import (
VEGA_VERSION,
VEGAEMBED_VERSION,
VEGALITE_VERSION,
VegaLite,
renderers,
)
-from .schema import *
-from .theme import register_theme, themes
+from altair.vegalite.v5.schema import *
+
+# The content of __all__ is automatically written by
+# tools/update_init_file.py. Do not modify directly.
+
+__all__ = [
+ "SCHEMA_URL",
+ "SCHEMA_VERSION",
+ "TOPLEVEL_ONLY_KEYS",
+ "URI",
+ "VEGAEMBED_VERSION",
+ "VEGALITE_VERSION",
+ "VEGA_VERSION",
+ "X2",
+ "Y2",
+ "Aggregate",
+ "AggregateOp",
+ "AggregateTransform",
+ "AggregatedFieldDef",
+ "Align",
+ "AllSortString",
+ "Angle",
+ "AngleDatum",
+ "AngleValue",
+ "AnyMark",
+ "AnyMarkConfig",
+ "AreaConfig",
+ "ArgmaxDef",
+ "ArgminDef",
+ "AutoSizeParams",
+ "AutosizeType",
+ "Axis",
+ "AxisConfig",
+ "AxisOrient",
+ "AxisResolveMap",
+ "BBox",
+ "BarConfig",
+ "BaseTitleNoValueRefs",
+ "Baseline",
+ "Bin",
+ "BinExtent",
+ "BinParams",
+ "BinTransform",
+ "BindCheckbox",
+ "BindDirect",
+ "BindInput",
+ "BindRadioSelect",
+ "BindRange",
+ "Binding",
+ "BinnedTimeUnit",
+ "Blend",
+ "BoxPlot",
+ "BoxPlotConfig",
+ "BoxPlotDef",
+ "BrushConfig",
+ "CalculateTransform",
+ "Categorical",
+ "ChainedWhen",
+ "Chart",
+ "ChartDataType",
+ "Color",
+ "ColorDatum",
+ "ColorDef",
+ "ColorName",
+ "ColorScheme",
+ "ColorValue",
+ "Column",
+ "CompositeMark",
+ "CompositeMarkDef",
+ "CompositionConfig",
+ "ConcatChart",
+ "ConcatSpecGenericSpec",
+ "ConditionalAxisColor",
+ "ConditionalAxisLabelAlign",
+ "ConditionalAxisLabelBaseline",
+ "ConditionalAxisLabelFontStyle",
+ "ConditionalAxisLabelFontWeight",
+ "ConditionalAxisNumber",
+ "ConditionalAxisNumberArray",
+ "ConditionalAxisPropertyAlignnull",
+ "ConditionalAxisPropertyColornull",
+ "ConditionalAxisPropertyFontStylenull",
+ "ConditionalAxisPropertyFontWeightnull",
+ "ConditionalAxisPropertyTextBaselinenull",
+ "ConditionalAxisPropertynumberArraynull",
+ "ConditionalAxisPropertynumbernull",
+ "ConditionalAxisPropertystringnull",
+ "ConditionalAxisString",
+ "ConditionalMarkPropFieldOrDatumDef",
+ "ConditionalMarkPropFieldOrDatumDefTypeForShape",
+ "ConditionalParameterMarkPropFieldOrDatumDef",
+ "ConditionalParameterMarkPropFieldOrDatumDefTypeForShape",
+ "ConditionalParameterStringFieldDef",
+ "ConditionalParameterValueDefGradientstringnullExprRef",
+ "ConditionalParameterValueDefTextExprRef",
+ "ConditionalParameterValueDefnumber",
+ "ConditionalParameterValueDefnumberArrayExprRef",
+ "ConditionalParameterValueDefnumberExprRef",
+ "ConditionalParameterValueDefstringExprRef",
+ "ConditionalParameterValueDefstringnullExprRef",
+ "ConditionalPredicateMarkPropFieldOrDatumDef",
+ "ConditionalPredicateMarkPropFieldOrDatumDefTypeForShape",
+ "ConditionalPredicateStringFieldDef",
+ "ConditionalPredicateValueDefAlignnullExprRef",
+ "ConditionalPredicateValueDefColornullExprRef",
+ "ConditionalPredicateValueDefFontStylenullExprRef",
+ "ConditionalPredicateValueDefFontWeightnullExprRef",
+ "ConditionalPredicateValueDefGradientstringnullExprRef",
+ "ConditionalPredicateValueDefTextBaselinenullExprRef",
+ "ConditionalPredicateValueDefTextExprRef",
+ "ConditionalPredicateValueDefnumber",
+ "ConditionalPredicateValueDefnumberArrayExprRef",
+ "ConditionalPredicateValueDefnumberArraynullExprRef",
+ "ConditionalPredicateValueDefnumberExprRef",
+ "ConditionalPredicateValueDefnumbernullExprRef",
+ "ConditionalPredicateValueDefstringExprRef",
+ "ConditionalPredicateValueDefstringnullExprRef",
+ "ConditionalStringFieldDef",
+ "ConditionalValueDefGradientstringnullExprRef",
+ "ConditionalValueDefTextExprRef",
+ "ConditionalValueDefnumber",
+ "ConditionalValueDefnumberArrayExprRef",
+ "ConditionalValueDefnumberExprRef",
+ "ConditionalValueDefstringExprRef",
+ "ConditionalValueDefstringnullExprRef",
+ "Config",
+ "CsvDataFormat",
+ "Cursor",
+ "Cyclical",
+ "Data",
+ "DataFormat",
+ "DataSource",
+ "DataType",
+ "Datasets",
+ "DateTime",
+ "DatumChannelMixin",
+ "DatumDef",
+ "Day",
+ "DensityTransform",
+ "DerivedStream",
+ "Description",
+ "DescriptionValue",
+ "Detail",
+ "DictInlineDataset",
+ "DictSelectionInit",
+ "DictSelectionInitInterval",
+ "Diverging",
+ "DomainUnionWith",
+ "DsvDataFormat",
+ "Element",
+ "Encoding",
+ "EncodingSortField",
+ "ErrorBand",
+ "ErrorBandConfig",
+ "ErrorBandDef",
+ "ErrorBar",
+ "ErrorBarConfig",
+ "ErrorBarDef",
+ "ErrorBarExtent",
+ "EventStream",
+ "EventType",
+ "Expr",
+ "ExprRef",
+ "ExtentTransform",
+ "Facet",
+ "FacetChart",
+ "FacetEncodingFieldDef",
+ "FacetFieldDef",
+ "FacetMapping",
+ "FacetSpec",
+ "FacetedEncoding",
+ "FacetedUnitSpec",
+ "Feature",
+ "FeatureCollection",
+ "FeatureGeometryGeoJsonProperties",
+ "Field",
+ "FieldChannelMixin",
+ "FieldDefWithoutScale",
+ "FieldEqualPredicate",
+ "FieldGTEPredicate",
+ "FieldGTPredicate",
+ "FieldLTEPredicate",
+ "FieldLTPredicate",
+ "FieldName",
+ "FieldOneOfPredicate",
+ "FieldOrDatumDefWithConditionDatumDefGradientstringnull",
+ "FieldOrDatumDefWithConditionDatumDefnumber",
+ "FieldOrDatumDefWithConditionDatumDefnumberArray",
+ "FieldOrDatumDefWithConditionDatumDefstringnull",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefGradientstringnull",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefTypeForShapestringnull",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefnumber",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefnumberArray",
+ "FieldOrDatumDefWithConditionStringDatumDefText",
+ "FieldOrDatumDefWithConditionStringFieldDefText",
+ "FieldOrDatumDefWithConditionStringFieldDefstring",
+ "FieldRange",
+ "FieldRangePredicate",
+ "FieldValidPredicate",
+ "Fill",
+ "FillDatum",
+ "FillOpacity",
+ "FillOpacityDatum",
+ "FillOpacityValue",
+ "FillValue",
+ "FilterTransform",
+ "Fit",
+ "FlattenTransform",
+ "FoldTransform",
+ "FontStyle",
+ "FontWeight",
+ "FormatConfig",
+ "Generator",
+ "GenericUnitSpecEncodingAnyMark",
+ "GeoJsonFeature",
+ "GeoJsonFeatureCollection",
+ "GeoJsonProperties",
+ "Geometry",
+ "GeometryCollection",
+ "Gradient",
+ "GradientStop",
+ "GraticuleGenerator",
+ "GraticuleParams",
+ "HConcatChart",
+ "HConcatSpecGenericSpec",
+ "Header",
+ "HeaderConfig",
+ "HexColor",
+ "Href",
+ "HrefValue",
+ "Impute",
+ "ImputeMethod",
+ "ImputeParams",
+ "ImputeSequence",
+ "ImputeTransform",
+ "InlineData",
+ "InlineDataset",
+ "Interpolate",
+ "IntervalSelectionConfig",
+ "IntervalSelectionConfigWithoutType",
+ "JoinAggregateFieldDef",
+ "JoinAggregateTransform",
+ "JsonDataFormat",
+ "Key",
+ "LabelOverlap",
+ "LatLongDef",
+ "LatLongFieldDef",
+ "Latitude",
+ "Latitude2",
+ "Latitude2Datum",
+ "Latitude2Value",
+ "LatitudeDatum",
+ "LayerChart",
+ "LayerRepeatMapping",
+ "LayerRepeatSpec",
+ "LayerSpec",
+ "LayoutAlign",
+ "Legend",
+ "LegendBinding",
+ "LegendConfig",
+ "LegendOrient",
+ "LegendResolveMap",
+ "LegendStreamBinding",
+ "LineConfig",
+ "LineString",
+ "LinearGradient",
+ "LocalMultiTimeUnit",
+ "LocalSingleTimeUnit",
+ "Locale",
+ "LoessTransform",
+ "LogicalAndPredicate",
+ "LogicalNotPredicate",
+ "LogicalOrPredicate",
+ "Longitude",
+ "Longitude2",
+ "Longitude2Datum",
+ "Longitude2Value",
+ "LongitudeDatum",
+ "LookupData",
+ "LookupSelection",
+ "LookupTransform",
+ "Mark",
+ "MarkConfig",
+ "MarkDef",
+ "MarkInvalidDataMode",
+ "MarkPropDefGradientstringnull",
+ "MarkPropDefnumber",
+ "MarkPropDefnumberArray",
+ "MarkPropDefstringnullTypeForShape",
+ "MarkType",
+ "MaxRowsError",
+ "MergedStream",
+ "Month",
+ "MultiLineString",
+ "MultiPoint",
+ "MultiPolygon",
+ "MultiTimeUnit",
+ "NamedData",
+ "NonArgAggregateOp",
+ "NonLayerRepeatSpec",
+ "NonNormalizedSpec",
+ "NumberLocale",
+ "NumericArrayMarkPropDef",
+ "NumericMarkPropDef",
+ "OffsetDef",
+ "Opacity",
+ "OpacityDatum",
+ "OpacityValue",
+ "Order",
+ "OrderFieldDef",
+ "OrderOnlyDef",
+ "OrderValue",
+ "OrderValueDef",
+ "Orient",
+ "Orientation",
+ "OverlayMarkDef",
+ "Padding",
+ "Parameter",
+ "ParameterExpression",
+ "ParameterExtent",
+ "ParameterName",
+ "ParameterPredicate",
+ "Parse",
+ "ParseValue",
+ "PivotTransform",
+ "Point",
+ "PointSelectionConfig",
+ "PointSelectionConfigWithoutType",
+ "PolarDef",
+ "Polygon",
+ "Position",
+ "Position2Def",
+ "PositionDatumDef",
+ "PositionDatumDefBase",
+ "PositionDef",
+ "PositionFieldDef",
+ "PositionFieldDefBase",
+ "PositionValueDef",
+ "Predicate",
+ "PredicateComposition",
+ "PrimitiveValue",
+ "Projection",
+ "ProjectionConfig",
+ "ProjectionType",
+ "QuantileTransform",
+ "RadialGradient",
+ "Radius",
+ "Radius2",
+ "Radius2Datum",
+ "Radius2Value",
+ "RadiusDatum",
+ "RadiusValue",
+ "RangeConfig",
+ "RangeEnum",
+ "RangeRaw",
+ "RangeRawArray",
+ "RangeScheme",
+ "RectConfig",
+ "RegressionTransform",
+ "RelativeBandSize",
+ "RepeatChart",
+ "RepeatMapping",
+ "RepeatRef",
+ "RepeatSpec",
+ "Resolve",
+ "ResolveMode",
+ "Root",
+ "Row",
+ "RowColLayoutAlign",
+ "RowColboolean",
+ "RowColnumber",
+ "RowColumnEncodingFieldDef",
+ "SampleTransform",
+ "Scale",
+ "ScaleBinParams",
+ "ScaleBins",
+ "ScaleConfig",
+ "ScaleDatumDef",
+ "ScaleFieldDef",
+ "ScaleInterpolateEnum",
+ "ScaleInterpolateParams",
+ "ScaleInvalidDataConfig",
+ "ScaleInvalidDataShowAsValueangle",
+ "ScaleInvalidDataShowAsValuecolor",
+ "ScaleInvalidDataShowAsValuefill",
+ "ScaleInvalidDataShowAsValuefillOpacity",
+ "ScaleInvalidDataShowAsValueopacity",
+ "ScaleInvalidDataShowAsValueradius",
+ "ScaleInvalidDataShowAsValueshape",
+ "ScaleInvalidDataShowAsValuesize",
+ "ScaleInvalidDataShowAsValuestroke",
+ "ScaleInvalidDataShowAsValuestrokeDash",
+ "ScaleInvalidDataShowAsValuestrokeOpacity",
+ "ScaleInvalidDataShowAsValuestrokeWidth",
+ "ScaleInvalidDataShowAsValuetheta",
+ "ScaleInvalidDataShowAsValuex",
+ "ScaleInvalidDataShowAsValuexOffset",
+ "ScaleInvalidDataShowAsValuey",
+ "ScaleInvalidDataShowAsValueyOffset",
+ "ScaleInvalidDataShowAsangle",
+ "ScaleInvalidDataShowAscolor",
+ "ScaleInvalidDataShowAsfill",
+ "ScaleInvalidDataShowAsfillOpacity",
+ "ScaleInvalidDataShowAsopacity",
+ "ScaleInvalidDataShowAsradius",
+ "ScaleInvalidDataShowAsshape",
+ "ScaleInvalidDataShowAssize",
+ "ScaleInvalidDataShowAsstroke",
+ "ScaleInvalidDataShowAsstrokeDash",
+ "ScaleInvalidDataShowAsstrokeOpacity",
+ "ScaleInvalidDataShowAsstrokeWidth",
+ "ScaleInvalidDataShowAstheta",
+ "ScaleInvalidDataShowAsx",
+ "ScaleInvalidDataShowAsxOffset",
+ "ScaleInvalidDataShowAsy",
+ "ScaleInvalidDataShowAsyOffset",
+ "ScaleResolveMap",
+ "ScaleType",
+ "SchemaBase",
+ "SchemeParams",
+ "SecondaryFieldDef",
+ "SelectionConfig",
+ "SelectionExpression",
+ "SelectionInit",
+ "SelectionInitInterval",
+ "SelectionInitIntervalMapping",
+ "SelectionInitMapping",
+ "SelectionParameter",
+ "SelectionPredicateComposition",
+ "SelectionResolution",
+ "SelectionType",
+ "SequenceGenerator",
+ "SequenceParams",
+ "SequentialMultiHue",
+ "SequentialSingleHue",
+ "Shape",
+ "ShapeDatum",
+ "ShapeDef",
+ "ShapeValue",
+ "SharedEncoding",
+ "SingleDefUnitChannel",
+ "SingleTimeUnit",
+ "Size",
+ "SizeDatum",
+ "SizeValue",
+ "Sort",
+ "SortArray",
+ "SortByChannel",
+ "SortByChannelDesc",
+ "SortByEncoding",
+ "SortField",
+ "SortOrder",
+ "Spec",
+ "SphereGenerator",
+ "StackOffset",
+ "StackTransform",
+ "StandardType",
+ "Step",
+ "StepFor",
+ "Stream",
+ "StringFieldDef",
+ "StringFieldDefWithCondition",
+ "StringValueDefWithCondition",
+ "Stroke",
+ "StrokeCap",
+ "StrokeDash",
+ "StrokeDashDatum",
+ "StrokeDashValue",
+ "StrokeDatum",
+ "StrokeJoin",
+ "StrokeOpacity",
+ "StrokeOpacityDatum",
+ "StrokeOpacityValue",
+ "StrokeValue",
+ "StrokeWidth",
+ "StrokeWidthDatum",
+ "StrokeWidthValue",
+ "StyleConfigIndex",
+ "SymbolShape",
+ "Text",
+ "TextBaseline",
+ "TextDatum",
+ "TextDef",
+ "TextDirection",
+ "TextValue",
+ "Then",
+ "Theta",
+ "Theta2",
+ "Theta2Datum",
+ "Theta2Value",
+ "ThetaDatum",
+ "ThetaValue",
+ "TickConfig",
+ "TickCount",
+ "TimeInterval",
+ "TimeIntervalStep",
+ "TimeLocale",
+ "TimeUnit",
+ "TimeUnitParams",
+ "TimeUnitTransform",
+ "TimeUnitTransformParams",
+ "Title",
+ "TitleAnchor",
+ "TitleConfig",
+ "TitleFrame",
+ "TitleOrient",
+ "TitleParams",
+ "Tooltip",
+ "TooltipContent",
+ "TooltipValue",
+ "TopLevelConcatSpec",
+ "TopLevelFacetSpec",
+ "TopLevelHConcatSpec",
+ "TopLevelLayerSpec",
+ "TopLevelMixin",
+ "TopLevelParameter",
+ "TopLevelRepeatSpec",
+ "TopLevelSelectionParameter",
+ "TopLevelSpec",
+ "TopLevelUnitSpec",
+ "TopLevelVConcatSpec",
+ "TopoDataFormat",
+ "Transform",
+ "Type",
+ "TypeForShape",
+ "TypedFieldDef",
+ "UnitSpec",
+ "UnitSpecWithFrame",
+ "Url",
+ "UrlData",
+ "UrlValue",
+ "UtcMultiTimeUnit",
+ "UtcSingleTimeUnit",
+ "VConcatChart",
+ "VConcatSpecGenericSpec",
+ "ValueChannelMixin",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefGradientstringnull",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefTypeForShapestringnull",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefnumber",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefnumberArray",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefstringnull",
+ "ValueDefWithConditionStringFieldDefText",
+ "ValueDefnumber",
+ "ValueDefnumberwidthheightExprRef",
+ "VariableParameter",
+ "Vector2DateTime",
+ "Vector2Vector2number",
+ "Vector2boolean",
+ "Vector2number",
+ "Vector2string",
+ "Vector3number",
+ "Vector7string",
+ "Vector10string",
+ "Vector12string",
+ "VegaLite",
+ "VegaLiteSchema",
+ "ViewBackground",
+ "ViewConfig",
+ "When",
+ "WindowEventType",
+ "WindowFieldDef",
+ "WindowOnlyOp",
+ "WindowTransform",
+ "X",
+ "X2Datum",
+ "X2Value",
+ "XDatum",
+ "XError",
+ "XError2",
+ "XError2Value",
+ "XErrorValue",
+ "XOffset",
+ "XOffsetDatum",
+ "XOffsetValue",
+ "XValue",
+ "Y",
+ "Y2Datum",
+ "Y2Value",
+ "YDatum",
+ "YError",
+ "YError2",
+ "YError2Value",
+ "YErrorValue",
+ "YOffset",
+ "YOffsetDatum",
+ "YOffsetValue",
+ "YValue",
+ "api",
+ "binding",
+ "binding_checkbox",
+ "binding_radio",
+ "binding_range",
+ "binding_select",
+ "channels",
+ "check_fields_and_encodings",
+ "compiler",
+ "concat",
+ "condition",
+ "core",
+ "data_transformers",
+ "datum",
+ "default_data_transformer",
+ "graticule",
+ "hconcat",
+ "layer",
+ "limit_rows",
+ "load_schema",
+ "mixins",
+ "param",
+ "renderers",
+ "repeat",
+ "sample",
+ "schema",
+ "selection",
+ "selection_interval",
+ "selection_multi",
+ "selection_point",
+ "selection_single",
+ "sequence",
+ "sphere",
+ "to_csv",
+ "to_json",
+ "to_values",
+ "topo_feature",
+ "value",
+ "vconcat",
+ "vegalite_compilers",
+ "when",
+ "with_property_setters",
+]
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index 14d47064c..c99e556be 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -16,7 +16,7 @@
import jsonschema
import narwhals.stable.v1 as nw
-from altair import utils
+from altair import theme, utils
from altair.expr import core as _expr_core
from altair.utils import Optional, SchemaBase, Undefined
from altair.utils._vegafusion_data import (
@@ -32,7 +32,6 @@
from .display import VEGA_VERSION, VEGAEMBED_VERSION, VEGALITE_VERSION, renderers
from .schema import SCHEMA_URL, channels, core, mixins
from .schema._typing import Map, PrimitiveValue_T, SingleDefUnitChannel_T, Temporal
-from .theme import themes
if sys.version_info >= (3, 14):
from typing import TypedDict
@@ -2006,9 +2005,8 @@ def to_dict( # noqa: C901
if "$schema" not in vegalite_spec:
vegalite_spec["$schema"] = SCHEMA_URL
- # apply theme from theme registry
- if theme := themes.get():
- vegalite_spec = utils.update_nested(theme(), vegalite_spec, copy=True)
+ if func := theme.get():
+ vegalite_spec = utils.update_nested(func(), vegalite_spec, copy=True)
else:
msg = (
f"Expected a theme to be set but got {None!r}.\n"
diff --git a/altair/vegalite/v5/schema/__init__.py b/altair/vegalite/v5/schema/__init__.py
index 1f099eaca..3be8148db 100644
--- a/altair/vegalite/v5/schema/__init__.py
+++ b/altair/vegalite/v5/schema/__init__.py
@@ -1,8 +1,571 @@
-# ruff: noqa
+# ruff: noqa: F403, F405
+# The contents of this file are automatically written by
+# tools/generate_schema_wrapper.py. Do not modify directly.
-from .core import *
-from .channels import *
+from altair.vegalite.v5.schema import channels, core
+from altair.vegalite.v5.schema.channels import *
+from altair.vegalite.v5.schema.core import *
SCHEMA_VERSION = "v5.20.1"
SCHEMA_URL = "https://vega.github.io/schema/vega-lite/v5.20.1.json"
+
+__all__ = [
+ "SCHEMA_URL",
+ "SCHEMA_VERSION",
+ "URI",
+ "X2",
+ "Y2",
+ "Aggregate",
+ "AggregateOp",
+ "AggregateTransform",
+ "AggregatedFieldDef",
+ "Align",
+ "AllSortString",
+ "Angle",
+ "AngleDatum",
+ "AngleValue",
+ "AnyMark",
+ "AnyMarkConfig",
+ "AreaConfig",
+ "ArgmaxDef",
+ "ArgminDef",
+ "AutoSizeParams",
+ "AutosizeType",
+ "Axis",
+ "AxisConfig",
+ "AxisOrient",
+ "AxisResolveMap",
+ "BBox",
+ "BarConfig",
+ "BaseTitleNoValueRefs",
+ "Baseline",
+ "BinExtent",
+ "BinParams",
+ "BinTransform",
+ "BindCheckbox",
+ "BindDirect",
+ "BindInput",
+ "BindRadioSelect",
+ "BindRange",
+ "Binding",
+ "BinnedTimeUnit",
+ "Blend",
+ "BoxPlot",
+ "BoxPlotConfig",
+ "BoxPlotDef",
+ "BrushConfig",
+ "CalculateTransform",
+ "Categorical",
+ "Color",
+ "ColorDatum",
+ "ColorDef",
+ "ColorName",
+ "ColorScheme",
+ "ColorValue",
+ "Column",
+ "CompositeMark",
+ "CompositeMarkDef",
+ "CompositionConfig",
+ "ConcatSpecGenericSpec",
+ "ConditionalAxisColor",
+ "ConditionalAxisLabelAlign",
+ "ConditionalAxisLabelBaseline",
+ "ConditionalAxisLabelFontStyle",
+ "ConditionalAxisLabelFontWeight",
+ "ConditionalAxisNumber",
+ "ConditionalAxisNumberArray",
+ "ConditionalAxisPropertyAlignnull",
+ "ConditionalAxisPropertyColornull",
+ "ConditionalAxisPropertyFontStylenull",
+ "ConditionalAxisPropertyFontWeightnull",
+ "ConditionalAxisPropertyTextBaselinenull",
+ "ConditionalAxisPropertynumberArraynull",
+ "ConditionalAxisPropertynumbernull",
+ "ConditionalAxisPropertystringnull",
+ "ConditionalAxisString",
+ "ConditionalMarkPropFieldOrDatumDef",
+ "ConditionalMarkPropFieldOrDatumDefTypeForShape",
+ "ConditionalParameterMarkPropFieldOrDatumDef",
+ "ConditionalParameterMarkPropFieldOrDatumDefTypeForShape",
+ "ConditionalParameterStringFieldDef",
+ "ConditionalParameterValueDefGradientstringnullExprRef",
+ "ConditionalParameterValueDefTextExprRef",
+ "ConditionalParameterValueDefnumber",
+ "ConditionalParameterValueDefnumberArrayExprRef",
+ "ConditionalParameterValueDefnumberExprRef",
+ "ConditionalParameterValueDefstringExprRef",
+ "ConditionalParameterValueDefstringnullExprRef",
+ "ConditionalPredicateMarkPropFieldOrDatumDef",
+ "ConditionalPredicateMarkPropFieldOrDatumDefTypeForShape",
+ "ConditionalPredicateStringFieldDef",
+ "ConditionalPredicateValueDefAlignnullExprRef",
+ "ConditionalPredicateValueDefColornullExprRef",
+ "ConditionalPredicateValueDefFontStylenullExprRef",
+ "ConditionalPredicateValueDefFontWeightnullExprRef",
+ "ConditionalPredicateValueDefGradientstringnullExprRef",
+ "ConditionalPredicateValueDefTextBaselinenullExprRef",
+ "ConditionalPredicateValueDefTextExprRef",
+ "ConditionalPredicateValueDefnumber",
+ "ConditionalPredicateValueDefnumberArrayExprRef",
+ "ConditionalPredicateValueDefnumberArraynullExprRef",
+ "ConditionalPredicateValueDefnumberExprRef",
+ "ConditionalPredicateValueDefnumbernullExprRef",
+ "ConditionalPredicateValueDefstringExprRef",
+ "ConditionalPredicateValueDefstringnullExprRef",
+ "ConditionalStringFieldDef",
+ "ConditionalValueDefGradientstringnullExprRef",
+ "ConditionalValueDefTextExprRef",
+ "ConditionalValueDefnumber",
+ "ConditionalValueDefnumberArrayExprRef",
+ "ConditionalValueDefnumberExprRef",
+ "ConditionalValueDefstringExprRef",
+ "ConditionalValueDefstringnullExprRef",
+ "Config",
+ "CsvDataFormat",
+ "Cursor",
+ "Cyclical",
+ "Data",
+ "DataFormat",
+ "DataSource",
+ "Datasets",
+ "DateTime",
+ "DatumChannelMixin",
+ "DatumDef",
+ "Day",
+ "DensityTransform",
+ "DerivedStream",
+ "Description",
+ "DescriptionValue",
+ "Detail",
+ "DictInlineDataset",
+ "DictSelectionInit",
+ "DictSelectionInitInterval",
+ "Diverging",
+ "DomainUnionWith",
+ "DsvDataFormat",
+ "Element",
+ "Encoding",
+ "EncodingSortField",
+ "ErrorBand",
+ "ErrorBandConfig",
+ "ErrorBandDef",
+ "ErrorBar",
+ "ErrorBarConfig",
+ "ErrorBarDef",
+ "ErrorBarExtent",
+ "EventStream",
+ "EventType",
+ "Expr",
+ "ExprRef",
+ "ExtentTransform",
+ "Facet",
+ "FacetEncodingFieldDef",
+ "FacetFieldDef",
+ "FacetSpec",
+ "FacetedEncoding",
+ "FacetedUnitSpec",
+ "Feature",
+ "FeatureCollection",
+ "FeatureGeometryGeoJsonProperties",
+ "Field",
+ "FieldChannelMixin",
+ "FieldDefWithoutScale",
+ "FieldEqualPredicate",
+ "FieldGTEPredicate",
+ "FieldGTPredicate",
+ "FieldLTEPredicate",
+ "FieldLTPredicate",
+ "FieldName",
+ "FieldOneOfPredicate",
+ "FieldOrDatumDefWithConditionDatumDefGradientstringnull",
+ "FieldOrDatumDefWithConditionDatumDefnumber",
+ "FieldOrDatumDefWithConditionDatumDefnumberArray",
+ "FieldOrDatumDefWithConditionDatumDefstringnull",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefGradientstringnull",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefTypeForShapestringnull",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefnumber",
+ "FieldOrDatumDefWithConditionMarkPropFieldDefnumberArray",
+ "FieldOrDatumDefWithConditionStringDatumDefText",
+ "FieldOrDatumDefWithConditionStringFieldDefText",
+ "FieldOrDatumDefWithConditionStringFieldDefstring",
+ "FieldRange",
+ "FieldRangePredicate",
+ "FieldValidPredicate",
+ "Fill",
+ "FillDatum",
+ "FillOpacity",
+ "FillOpacityDatum",
+ "FillOpacityValue",
+ "FillValue",
+ "FilterTransform",
+ "Fit",
+ "FlattenTransform",
+ "FoldTransform",
+ "FontStyle",
+ "FontWeight",
+ "FormatConfig",
+ "Generator",
+ "GenericUnitSpecEncodingAnyMark",
+ "GeoJsonFeature",
+ "GeoJsonFeatureCollection",
+ "GeoJsonProperties",
+ "Geometry",
+ "GeometryCollection",
+ "Gradient",
+ "GradientStop",
+ "GraticuleGenerator",
+ "GraticuleParams",
+ "HConcatSpecGenericSpec",
+ "Header",
+ "HeaderConfig",
+ "HexColor",
+ "Href",
+ "HrefValue",
+ "ImputeMethod",
+ "ImputeParams",
+ "ImputeSequence",
+ "ImputeTransform",
+ "InlineData",
+ "InlineDataset",
+ "Interpolate",
+ "IntervalSelectionConfig",
+ "IntervalSelectionConfigWithoutType",
+ "JoinAggregateFieldDef",
+ "JoinAggregateTransform",
+ "JsonDataFormat",
+ "Key",
+ "LabelOverlap",
+ "LatLongDef",
+ "LatLongFieldDef",
+ "Latitude",
+ "Latitude2",
+ "Latitude2Datum",
+ "Latitude2Value",
+ "LatitudeDatum",
+ "LayerRepeatMapping",
+ "LayerRepeatSpec",
+ "LayerSpec",
+ "LayoutAlign",
+ "Legend",
+ "LegendBinding",
+ "LegendConfig",
+ "LegendOrient",
+ "LegendResolveMap",
+ "LegendStreamBinding",
+ "LineConfig",
+ "LineString",
+ "LinearGradient",
+ "LocalMultiTimeUnit",
+ "LocalSingleTimeUnit",
+ "Locale",
+ "LoessTransform",
+ "LogicalAndPredicate",
+ "LogicalNotPredicate",
+ "LogicalOrPredicate",
+ "Longitude",
+ "Longitude2",
+ "Longitude2Datum",
+ "Longitude2Value",
+ "LongitudeDatum",
+ "LookupSelection",
+ "LookupTransform",
+ "Mark",
+ "MarkConfig",
+ "MarkDef",
+ "MarkInvalidDataMode",
+ "MarkPropDefGradientstringnull",
+ "MarkPropDefnumber",
+ "MarkPropDefnumberArray",
+ "MarkPropDefstringnullTypeForShape",
+ "MarkType",
+ "MergedStream",
+ "Month",
+ "MultiLineString",
+ "MultiPoint",
+ "MultiPolygon",
+ "MultiTimeUnit",
+ "NamedData",
+ "NonArgAggregateOp",
+ "NonLayerRepeatSpec",
+ "NonNormalizedSpec",
+ "NumberLocale",
+ "NumericArrayMarkPropDef",
+ "NumericMarkPropDef",
+ "OffsetDef",
+ "Opacity",
+ "OpacityDatum",
+ "OpacityValue",
+ "Order",
+ "OrderFieldDef",
+ "OrderOnlyDef",
+ "OrderValue",
+ "OrderValueDef",
+ "Orient",
+ "Orientation",
+ "OverlayMarkDef",
+ "Padding",
+ "ParameterExtent",
+ "ParameterName",
+ "ParameterPredicate",
+ "Parse",
+ "ParseValue",
+ "PivotTransform",
+ "Point",
+ "PointSelectionConfig",
+ "PointSelectionConfigWithoutType",
+ "PolarDef",
+ "Polygon",
+ "Position",
+ "Position2Def",
+ "PositionDatumDef",
+ "PositionDatumDefBase",
+ "PositionDef",
+ "PositionFieldDef",
+ "PositionFieldDefBase",
+ "PositionValueDef",
+ "Predicate",
+ "PredicateComposition",
+ "PrimitiveValue",
+ "Projection",
+ "ProjectionConfig",
+ "ProjectionType",
+ "QuantileTransform",
+ "RadialGradient",
+ "Radius",
+ "Radius2",
+ "Radius2Datum",
+ "Radius2Value",
+ "RadiusDatum",
+ "RadiusValue",
+ "RangeConfig",
+ "RangeEnum",
+ "RangeRaw",
+ "RangeRawArray",
+ "RangeScheme",
+ "RectConfig",
+ "RegressionTransform",
+ "RelativeBandSize",
+ "RepeatMapping",
+ "RepeatRef",
+ "RepeatSpec",
+ "Resolve",
+ "ResolveMode",
+ "Root",
+ "Row",
+ "RowColLayoutAlign",
+ "RowColboolean",
+ "RowColnumber",
+ "RowColumnEncodingFieldDef",
+ "SampleTransform",
+ "Scale",
+ "ScaleBinParams",
+ "ScaleBins",
+ "ScaleConfig",
+ "ScaleDatumDef",
+ "ScaleFieldDef",
+ "ScaleInterpolateEnum",
+ "ScaleInterpolateParams",
+ "ScaleInvalidDataConfig",
+ "ScaleInvalidDataShowAsValueangle",
+ "ScaleInvalidDataShowAsValuecolor",
+ "ScaleInvalidDataShowAsValuefill",
+ "ScaleInvalidDataShowAsValuefillOpacity",
+ "ScaleInvalidDataShowAsValueopacity",
+ "ScaleInvalidDataShowAsValueradius",
+ "ScaleInvalidDataShowAsValueshape",
+ "ScaleInvalidDataShowAsValuesize",
+ "ScaleInvalidDataShowAsValuestroke",
+ "ScaleInvalidDataShowAsValuestrokeDash",
+ "ScaleInvalidDataShowAsValuestrokeOpacity",
+ "ScaleInvalidDataShowAsValuestrokeWidth",
+ "ScaleInvalidDataShowAsValuetheta",
+ "ScaleInvalidDataShowAsValuex",
+ "ScaleInvalidDataShowAsValuexOffset",
+ "ScaleInvalidDataShowAsValuey",
+ "ScaleInvalidDataShowAsValueyOffset",
+ "ScaleInvalidDataShowAsangle",
+ "ScaleInvalidDataShowAscolor",
+ "ScaleInvalidDataShowAsfill",
+ "ScaleInvalidDataShowAsfillOpacity",
+ "ScaleInvalidDataShowAsopacity",
+ "ScaleInvalidDataShowAsradius",
+ "ScaleInvalidDataShowAsshape",
+ "ScaleInvalidDataShowAssize",
+ "ScaleInvalidDataShowAsstroke",
+ "ScaleInvalidDataShowAsstrokeDash",
+ "ScaleInvalidDataShowAsstrokeOpacity",
+ "ScaleInvalidDataShowAsstrokeWidth",
+ "ScaleInvalidDataShowAstheta",
+ "ScaleInvalidDataShowAsx",
+ "ScaleInvalidDataShowAsxOffset",
+ "ScaleInvalidDataShowAsy",
+ "ScaleInvalidDataShowAsyOffset",
+ "ScaleResolveMap",
+ "ScaleType",
+ "SchemaBase",
+ "SchemeParams",
+ "SecondaryFieldDef",
+ "SelectionConfig",
+ "SelectionInit",
+ "SelectionInitInterval",
+ "SelectionInitIntervalMapping",
+ "SelectionInitMapping",
+ "SelectionParameter",
+ "SelectionResolution",
+ "SelectionType",
+ "SequenceGenerator",
+ "SequenceParams",
+ "SequentialMultiHue",
+ "SequentialSingleHue",
+ "Shape",
+ "ShapeDatum",
+ "ShapeDef",
+ "ShapeValue",
+ "SharedEncoding",
+ "SingleDefUnitChannel",
+ "SingleTimeUnit",
+ "Size",
+ "SizeDatum",
+ "SizeValue",
+ "Sort",
+ "SortArray",
+ "SortByChannel",
+ "SortByChannelDesc",
+ "SortByEncoding",
+ "SortField",
+ "SortOrder",
+ "Spec",
+ "SphereGenerator",
+ "StackOffset",
+ "StackTransform",
+ "StandardType",
+ "Step",
+ "StepFor",
+ "Stream",
+ "StringFieldDef",
+ "StringFieldDefWithCondition",
+ "StringValueDefWithCondition",
+ "Stroke",
+ "StrokeCap",
+ "StrokeDash",
+ "StrokeDashDatum",
+ "StrokeDashValue",
+ "StrokeDatum",
+ "StrokeJoin",
+ "StrokeOpacity",
+ "StrokeOpacityDatum",
+ "StrokeOpacityValue",
+ "StrokeValue",
+ "StrokeWidth",
+ "StrokeWidthDatum",
+ "StrokeWidthValue",
+ "StyleConfigIndex",
+ "SymbolShape",
+ "Text",
+ "TextBaseline",
+ "TextDatum",
+ "TextDef",
+ "TextDirection",
+ "TextValue",
+ "Theta",
+ "Theta2",
+ "Theta2Datum",
+ "Theta2Value",
+ "ThetaDatum",
+ "ThetaValue",
+ "TickConfig",
+ "TickCount",
+ "TimeInterval",
+ "TimeIntervalStep",
+ "TimeLocale",
+ "TimeUnit",
+ "TimeUnitParams",
+ "TimeUnitTransform",
+ "TimeUnitTransformParams",
+ "TitleAnchor",
+ "TitleConfig",
+ "TitleFrame",
+ "TitleOrient",
+ "TitleParams",
+ "Tooltip",
+ "TooltipContent",
+ "TooltipValue",
+ "TopLevelConcatSpec",
+ "TopLevelFacetSpec",
+ "TopLevelHConcatSpec",
+ "TopLevelLayerSpec",
+ "TopLevelParameter",
+ "TopLevelRepeatSpec",
+ "TopLevelSelectionParameter",
+ "TopLevelSpec",
+ "TopLevelUnitSpec",
+ "TopLevelVConcatSpec",
+ "TopoDataFormat",
+ "Transform",
+ "Type",
+ "TypeForShape",
+ "TypedFieldDef",
+ "UnitSpec",
+ "UnitSpecWithFrame",
+ "Url",
+ "UrlData",
+ "UrlValue",
+ "UtcMultiTimeUnit",
+ "UtcSingleTimeUnit",
+ "VConcatSpecGenericSpec",
+ "ValueChannelMixin",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefGradientstringnull",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefTypeForShapestringnull",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefnumber",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefnumberArray",
+ "ValueDefWithConditionMarkPropFieldOrDatumDefstringnull",
+ "ValueDefWithConditionStringFieldDefText",
+ "ValueDefnumber",
+ "ValueDefnumberwidthheightExprRef",
+ "VariableParameter",
+ "Vector2DateTime",
+ "Vector2Vector2number",
+ "Vector2boolean",
+ "Vector2number",
+ "Vector2string",
+ "Vector3number",
+ "Vector7string",
+ "Vector10string",
+ "Vector12string",
+ "VegaLiteSchema",
+ "ViewBackground",
+ "ViewConfig",
+ "WindowEventType",
+ "WindowFieldDef",
+ "WindowOnlyOp",
+ "WindowTransform",
+ "X",
+ "X2Datum",
+ "X2Value",
+ "XDatum",
+ "XError",
+ "XError2",
+ "XError2Value",
+ "XErrorValue",
+ "XOffset",
+ "XOffsetDatum",
+ "XOffsetValue",
+ "XValue",
+ "Y",
+ "Y2Datum",
+ "Y2Value",
+ "YDatum",
+ "YError",
+ "YError2",
+ "YError2Value",
+ "YErrorValue",
+ "YOffset",
+ "YOffsetDatum",
+ "YOffsetValue",
+ "YValue",
+ "channels",
+ "core",
+ "load_schema",
+ "with_property_setters",
+]
diff --git a/altair/vegalite/v5/schema/_config.py b/altair/vegalite/v5/schema/_config.py
index 96da254c2..b5d4020ff 100644
--- a/altair/vegalite/v5/schema/_config.py
+++ b/altair/vegalite/v5/schema/_config.py
@@ -95,7 +95,7 @@
class AreaConfigKwds(TypedDict, total=False):
"""
- :class:`AreaConfig` ``TypedDict`` wrapper.
+ :class:`altair.AreaConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -569,7 +569,7 @@ class AreaConfigKwds(TypedDict, total=False):
class AutoSizeParamsKwds(TypedDict, total=False):
"""
- :class:`AutoSizeParams` ``TypedDict`` wrapper.
+ :class:`altair.AutoSizeParams` ``TypedDict`` wrapper.
Parameters
----------
@@ -603,7 +603,7 @@ class AutoSizeParamsKwds(TypedDict, total=False):
class AxisConfigKwds(TypedDict, total=False):
"""
- :class:`AxisConfig` ``TypedDict`` wrapper.
+ :class:`altair.AxisConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -1059,7 +1059,7 @@ class AxisConfigKwds(TypedDict, total=False):
class AxisResolveMapKwds(TypedDict, total=False):
"""
- :class:`AxisResolveMap` ``TypedDict`` wrapper.
+ :class:`altair.AxisResolveMap` ``TypedDict`` wrapper.
Parameters
----------
@@ -1075,7 +1075,7 @@ class AxisResolveMapKwds(TypedDict, total=False):
class BarConfigKwds(TypedDict, total=False):
"""
- :class:`BarConfig` ``TypedDict`` wrapper.
+ :class:`altair.BarConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -1546,7 +1546,7 @@ class BarConfigKwds(TypedDict, total=False):
class BindCheckboxKwds(TypedDict, total=False):
"""
- :class:`BindCheckbox` ``TypedDict`` wrapper.
+ :class:`altair.BindCheckbox` ``TypedDict`` wrapper.
Parameters
----------
@@ -1572,7 +1572,7 @@ class BindCheckboxKwds(TypedDict, total=False):
class BindDirectKwds(TypedDict, total=False):
"""
- :class:`BindDirect` ``TypedDict`` wrapper.
+ :class:`altair.BindDirect` ``TypedDict`` wrapper.
Parameters
----------
@@ -1598,7 +1598,7 @@ class BindDirectKwds(TypedDict, total=False):
class BindInputKwds(TypedDict, total=False):
"""
- :class:`BindInput` ``TypedDict`` wrapper.
+ :class:`altair.BindInput` ``TypedDict`` wrapper.
Parameters
----------
@@ -1634,7 +1634,7 @@ class BindInputKwds(TypedDict, total=False):
class BindRadioSelectKwds(TypedDict, total=False):
"""
- :class:`BindRadioSelect` ``TypedDict`` wrapper.
+ :class:`altair.BindRadioSelect` ``TypedDict`` wrapper.
Parameters
----------
@@ -1667,7 +1667,7 @@ class BindRadioSelectKwds(TypedDict, total=False):
class BindRangeKwds(TypedDict, total=False):
"""
- :class:`BindRange` ``TypedDict`` wrapper.
+ :class:`altair.BindRange` ``TypedDict`` wrapper.
Parameters
----------
@@ -1705,7 +1705,7 @@ class BindRangeKwds(TypedDict, total=False):
class BoxPlotConfigKwds(TypedDict, total=False):
"""
- :class:`BoxPlotConfig` ``TypedDict`` wrapper.
+ :class:`altair.BoxPlotConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -1785,7 +1785,7 @@ class BoxPlotConfigKwds(TypedDict, total=False):
class BrushConfigKwds(TypedDict, total=False):
"""
- :class:`BrushConfig` ``TypedDict`` wrapper.
+ :class:`altair.BrushConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -1827,7 +1827,7 @@ class BrushConfigKwds(TypedDict, total=False):
class CompositionConfigKwds(TypedDict, total=False):
"""
- :class:`CompositionConfig` ``TypedDict`` wrapper.
+ :class:`altair.CompositionConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -1860,7 +1860,7 @@ class CompositionConfigKwds(TypedDict, total=False):
class ConfigKwds(TypedDict, total=False):
"""
- :class:`Config` ``TypedDict`` wrapper.
+ :class:`altair.Config` ``TypedDict`` wrapper.
Parameters
----------
@@ -2209,7 +2209,7 @@ class ConfigKwds(TypedDict, total=False):
class DateTimeKwds(TypedDict, total=False):
"""
- :class:`DateTime` ``TypedDict`` wrapper.
+ :class:`altair.DateTime` ``TypedDict`` wrapper.
Parameters
----------
@@ -2257,7 +2257,7 @@ class DateTimeKwds(TypedDict, total=False):
class DerivedStreamKwds(TypedDict, total=False):
"""
- :class:`DerivedStream` ``TypedDict`` wrapper.
+ :class:`altair.DerivedStream` ``TypedDict`` wrapper.
Parameters
----------
@@ -2291,7 +2291,7 @@ class DerivedStreamKwds(TypedDict, total=False):
class ErrorBandConfigKwds(TypedDict, total=False):
"""
- :class:`ErrorBandConfig` ``TypedDict`` wrapper.
+ :class:`altair.ErrorBandConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -2361,7 +2361,7 @@ class ErrorBandConfigKwds(TypedDict, total=False):
class ErrorBarConfigKwds(TypedDict, total=False):
"""
- :class:`ErrorBarConfig` ``TypedDict`` wrapper.
+ :class:`altair.ErrorBarConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -2411,7 +2411,7 @@ class ErrorBarConfigKwds(TypedDict, total=False):
class FeatureGeometryGeoJsonPropertiesKwds(TypedDict, total=False):
"""
- :class:`FeatureGeometryGeoJsonProperties` ``TypedDict`` wrapper.
+ :class:`altair.FeatureGeometryGeoJsonProperties` ``TypedDict`` wrapper.
Parameters
----------
@@ -2446,7 +2446,7 @@ class FeatureGeometryGeoJsonPropertiesKwds(TypedDict, total=False):
class FormatConfigKwds(TypedDict, total=False):
"""
- :class:`FormatConfig` ``TypedDict`` wrapper.
+ :class:`altair.FormatConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -2515,7 +2515,7 @@ class FormatConfigKwds(TypedDict, total=False):
class GeoJsonFeatureKwds(TypedDict, total=False):
"""
- :class:`GeoJsonFeature` ``TypedDict`` wrapper.
+ :class:`altair.GeoJsonFeature` ``TypedDict`` wrapper.
Parameters
----------
@@ -2550,7 +2550,7 @@ class GeoJsonFeatureKwds(TypedDict, total=False):
class GeoJsonFeatureCollectionKwds(TypedDict, total=False):
"""
- :class:`GeoJsonFeatureCollection` ``TypedDict`` wrapper.
+ :class:`altair.GeoJsonFeatureCollection` ``TypedDict`` wrapper.
Parameters
----------
@@ -2570,7 +2570,7 @@ class GeoJsonFeatureCollectionKwds(TypedDict, total=False):
class GeometryCollectionKwds(TypedDict, total=False):
"""
- :class:`GeometryCollection` ``TypedDict`` wrapper.
+ :class:`altair.GeometryCollection` ``TypedDict`` wrapper.
Parameters
----------
@@ -2598,7 +2598,7 @@ class GeometryCollectionKwds(TypedDict, total=False):
class GradientStopKwds(TypedDict, total=False):
"""
- :class:`GradientStop` ``TypedDict`` wrapper.
+ :class:`altair.GradientStop` ``TypedDict`` wrapper.
Parameters
----------
@@ -2614,7 +2614,7 @@ class GradientStopKwds(TypedDict, total=False):
class HeaderConfigKwds(TypedDict, total=False):
"""
- :class:`HeaderConfig` ``TypedDict`` wrapper.
+ :class:`altair.HeaderConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -2789,7 +2789,7 @@ class HeaderConfigKwds(TypedDict, total=False):
class IntervalSelectionConfigKwds(TypedDict, total=False):
"""
- :class:`IntervalSelectionConfig` ``TypedDict`` wrapper.
+ :class:`altair.IntervalSelectionConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -2899,7 +2899,7 @@ class IntervalSelectionConfigKwds(TypedDict, total=False):
class IntervalSelectionConfigWithoutTypeKwds(TypedDict, total=False):
"""
- :class:`IntervalSelectionConfigWithoutType` ``TypedDict`` wrapper.
+ :class:`altair.IntervalSelectionConfigWithoutType` ``TypedDict`` wrapper.
Parameters
----------
@@ -3001,7 +3001,7 @@ class IntervalSelectionConfigWithoutTypeKwds(TypedDict, total=False):
class LegendConfigKwds(TypedDict, total=False):
"""
- :class:`LegendConfig` ``TypedDict`` wrapper.
+ :class:`altair.LegendConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -3356,7 +3356,7 @@ class LegendConfigKwds(TypedDict, total=False):
class LegendResolveMapKwds(TypedDict, total=False):
"""
- :class:`LegendResolveMap` ``TypedDict`` wrapper.
+ :class:`altair.LegendResolveMap` ``TypedDict`` wrapper.
Parameters
----------
@@ -3399,7 +3399,7 @@ class LegendResolveMapKwds(TypedDict, total=False):
class LegendStreamBindingKwds(TypedDict, total=False):
"""
- :class:`LegendStreamBinding` ``TypedDict`` wrapper.
+ :class:`altair.LegendStreamBinding` ``TypedDict`` wrapper.
Parameters
----------
@@ -3412,7 +3412,7 @@ class LegendStreamBindingKwds(TypedDict, total=False):
class LineConfigKwds(TypedDict, total=False):
"""
- :class:`LineConfig` ``TypedDict`` wrapper.
+ :class:`altair.LineConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -3875,7 +3875,7 @@ class LineConfigKwds(TypedDict, total=False):
class LineStringKwds(TypedDict, total=False):
"""
- :class:`LineString` ``TypedDict`` wrapper.
+ :class:`altair.LineString` ``TypedDict`` wrapper.
Parameters
----------
@@ -3895,7 +3895,7 @@ class LineStringKwds(TypedDict, total=False):
class LinearGradientKwds(TypedDict, total=False):
"""
- :class:`LinearGradient` ``TypedDict`` wrapper.
+ :class:`altair.LinearGradient` ``TypedDict`` wrapper.
Parameters
----------
@@ -3934,7 +3934,7 @@ class LinearGradientKwds(TypedDict, total=False):
class LocaleKwds(TypedDict, total=False):
"""
- :class:`Locale` ``TypedDict`` wrapper.
+ :class:`altair.Locale` ``TypedDict`` wrapper.
Parameters
----------
@@ -3950,7 +3950,7 @@ class LocaleKwds(TypedDict, total=False):
class MarkConfigKwds(TypedDict, total=False):
"""
- :class:`MarkConfig` ``TypedDict`` wrapper.
+ :class:`altair.MarkConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -4398,7 +4398,7 @@ class MarkConfigKwds(TypedDict, total=False):
class MergedStreamKwds(TypedDict, total=False):
"""
- :class:`MergedStream` ``TypedDict`` wrapper.
+ :class:`altair.MergedStream` ``TypedDict`` wrapper.
Parameters
----------
@@ -4432,7 +4432,7 @@ class MergedStreamKwds(TypedDict, total=False):
class MultiLineStringKwds(TypedDict, total=False):
"""
- :class:`MultiLineString` ``TypedDict`` wrapper.
+ :class:`altair.MultiLineString` ``TypedDict`` wrapper.
Parameters
----------
@@ -4452,7 +4452,7 @@ class MultiLineStringKwds(TypedDict, total=False):
class MultiPointKwds(TypedDict, total=False):
"""
- :class:`MultiPoint` ``TypedDict`` wrapper.
+ :class:`altair.MultiPoint` ``TypedDict`` wrapper.
Parameters
----------
@@ -4472,7 +4472,7 @@ class MultiPointKwds(TypedDict, total=False):
class MultiPolygonKwds(TypedDict, total=False):
"""
- :class:`MultiPolygon` ``TypedDict`` wrapper.
+ :class:`altair.MultiPolygon` ``TypedDict`` wrapper.
Parameters
----------
@@ -4492,7 +4492,7 @@ class MultiPolygonKwds(TypedDict, total=False):
class NumberLocaleKwds(TypedDict, total=False):
"""
- :class:`NumberLocale` ``TypedDict`` wrapper.
+ :class:`altair.NumberLocale` ``TypedDict`` wrapper.
Parameters
----------
@@ -4526,7 +4526,7 @@ class NumberLocaleKwds(TypedDict, total=False):
class OverlayMarkDefKwds(TypedDict, total=False):
"""
- :class:`OverlayMarkDef` ``TypedDict`` wrapper.
+ :class:`altair.OverlayMarkDef` ``TypedDict`` wrapper.
Parameters
----------
@@ -5016,7 +5016,7 @@ class OverlayMarkDefKwds(TypedDict, total=False):
class PointKwds(TypedDict, total=False):
"""
- :class:`Point` ``TypedDict`` wrapper.
+ :class:`altair.Point` ``TypedDict`` wrapper.
Parameters
----------
@@ -5040,7 +5040,7 @@ class PointKwds(TypedDict, total=False):
class PointSelectionConfigKwds(TypedDict, total=False):
"""
- :class:`PointSelectionConfig` ``TypedDict`` wrapper.
+ :class:`altair.PointSelectionConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -5148,7 +5148,7 @@ class PointSelectionConfigKwds(TypedDict, total=False):
class PointSelectionConfigWithoutTypeKwds(TypedDict, total=False):
"""
- :class:`PointSelectionConfigWithoutType` ``TypedDict`` wrapper.
+ :class:`altair.PointSelectionConfigWithoutType` ``TypedDict`` wrapper.
Parameters
----------
@@ -5248,7 +5248,7 @@ class PointSelectionConfigWithoutTypeKwds(TypedDict, total=False):
class PolygonKwds(TypedDict, total=False):
"""
- :class:`Polygon` ``TypedDict`` wrapper.
+ :class:`altair.Polygon` ``TypedDict`` wrapper.
Parameters
----------
@@ -5268,7 +5268,7 @@ class PolygonKwds(TypedDict, total=False):
class ProjectionKwds(TypedDict, total=False):
"""
- :class:`Projection` ``TypedDict`` wrapper.
+ :class:`altair.Projection` ``TypedDict`` wrapper.
Parameters
----------
@@ -5411,7 +5411,7 @@ class ProjectionKwds(TypedDict, total=False):
class ProjectionConfigKwds(TypedDict, total=False):
"""
- :class:`ProjectionConfig` ``TypedDict`` wrapper.
+ :class:`altair.ProjectionConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -5554,7 +5554,7 @@ class ProjectionConfigKwds(TypedDict, total=False):
class RadialGradientKwds(TypedDict, total=False):
"""
- :class:`RadialGradient` ``TypedDict`` wrapper.
+ :class:`altair.RadialGradient` ``TypedDict`` wrapper.
Parameters
----------
@@ -5609,7 +5609,7 @@ class RadialGradientKwds(TypedDict, total=False):
class RangeConfigKwds(TypedDict, total=False):
"""
- :class:`RangeConfig` ``TypedDict`` wrapper.
+ :class:`altair.RangeConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -5663,7 +5663,7 @@ class RangeConfigKwds(TypedDict, total=False):
class RectConfigKwds(TypedDict, total=False):
"""
- :class:`RectConfig` ``TypedDict`` wrapper.
+ :class:`altair.RectConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -6129,7 +6129,7 @@ class RectConfigKwds(TypedDict, total=False):
class ResolveKwds(TypedDict, total=False):
"""
- :class:`Resolve` ``TypedDict`` wrapper.
+ :class:`altair.Resolve` ``TypedDict`` wrapper.
Parameters
----------
@@ -6148,7 +6148,7 @@ class ResolveKwds(TypedDict, total=False):
class ScaleConfigKwds(TypedDict, total=False):
"""
- :class:`ScaleConfig` ``TypedDict`` wrapper.
+ :class:`altair.ScaleConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -6331,7 +6331,7 @@ class ScaleConfigKwds(TypedDict, total=False):
class ScaleInvalidDataConfigKwds(TypedDict, total=False):
"""
- :class:`ScaleInvalidDataConfig` ``TypedDict`` wrapper.
+ :class:`altair.ScaleInvalidDataConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -6401,7 +6401,7 @@ class ScaleInvalidDataConfigKwds(TypedDict, total=False):
class ScaleResolveMapKwds(TypedDict, total=False):
"""
- :class:`ScaleResolveMap` ``TypedDict`` wrapper.
+ :class:`altair.ScaleResolveMap` ``TypedDict`` wrapper.
Parameters
----------
@@ -6462,7 +6462,7 @@ class ScaleResolveMapKwds(TypedDict, total=False):
class SelectionConfigKwds(TypedDict, total=False):
"""
- :class:`SelectionConfig` ``TypedDict`` wrapper.
+ :class:`altair.SelectionConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -6490,7 +6490,7 @@ class SelectionConfigKwds(TypedDict, total=False):
class StepKwds(TypedDict, closed=True, total=False): # type: ignore[call-arg]
"""
- :class:`Step` ``TypedDict`` wrapper.
+ :class:`altair.Step` ``TypedDict`` wrapper.
Parameters
----------
@@ -6515,7 +6515,7 @@ class StepKwds(TypedDict, closed=True, total=False): # type: ignore[call-arg]
class StyleConfigIndexKwds(TypedDict, closed=True, total=False): # type: ignore[call-arg]
"""
- :class:`StyleConfigIndex` ``TypedDict`` wrapper.
+ :class:`altair.StyleConfigIndex` ``TypedDict`` wrapper.
Parameters
----------
@@ -6582,7 +6582,7 @@ class StyleConfigIndexKwds(TypedDict, closed=True, total=False): # type: ignore
class TickConfigKwds(TypedDict, total=False):
"""
- :class:`TickConfig` ``TypedDict`` wrapper.
+ :class:`altair.TickConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -7041,7 +7041,7 @@ class TickConfigKwds(TypedDict, total=False):
class TimeIntervalStepKwds(TypedDict, total=False):
"""
- :class:`TimeIntervalStep` ``TypedDict`` wrapper.
+ :class:`altair.TimeIntervalStep` ``TypedDict`` wrapper.
Parameters
----------
@@ -7057,7 +7057,7 @@ class TimeIntervalStepKwds(TypedDict, total=False):
class TimeLocaleKwds(TypedDict, total=False):
"""
- :class:`TimeLocale` ``TypedDict`` wrapper.
+ :class:`altair.TimeLocale` ``TypedDict`` wrapper.
Parameters
----------
@@ -7091,7 +7091,7 @@ class TimeLocaleKwds(TypedDict, total=False):
class TitleConfigKwds(TypedDict, total=False):
"""
- :class:`TitleConfig` ``TypedDict`` wrapper.
+ :class:`altair.TitleConfig` ``TypedDict`` wrapper.
Parameters
----------
@@ -7199,7 +7199,7 @@ class TitleConfigKwds(TypedDict, total=False):
class TitleParamsKwds(TypedDict, total=False):
"""
- :class:`TitleParams` ``TypedDict`` wrapper.
+ :class:`altair.TitleParams` ``TypedDict`` wrapper.
Parameters
----------
@@ -7330,7 +7330,7 @@ class TitleParamsKwds(TypedDict, total=False):
class TooltipContentKwds(TypedDict, total=False):
"""
- :class:`TooltipContent` ``TypedDict`` wrapper.
+ :class:`altair.TooltipContent` ``TypedDict`` wrapper.
Parameters
----------
@@ -7343,7 +7343,7 @@ class TooltipContentKwds(TypedDict, total=False):
class TopLevelSelectionParameterKwds(TypedDict, total=False):
"""
- :class:`TopLevelSelectionParameter` ``TypedDict`` wrapper.
+ :class:`altair.TopLevelSelectionParameter` ``TypedDict`` wrapper.
Parameters
----------
@@ -7405,7 +7405,7 @@ class TopLevelSelectionParameterKwds(TypedDict, total=False):
class VariableParameterKwds(TypedDict, total=False):
"""
- :class:`VariableParameter` ``TypedDict`` wrapper.
+ :class:`altair.VariableParameter` ``TypedDict`` wrapper.
Parameters
----------
@@ -7450,7 +7450,7 @@ class VariableParameterKwds(TypedDict, total=False):
class ViewBackgroundKwds(TypedDict, total=False):
"""
- :class:`ViewBackground` ``TypedDict`` wrapper.
+ :class:`altair.ViewBackground` ``TypedDict`` wrapper.
Parameters
----------
@@ -7528,7 +7528,7 @@ class ViewBackgroundKwds(TypedDict, total=False):
class ViewConfigKwds(TypedDict, total=False):
"""
- :class:`ViewConfig` ``TypedDict`` wrapper.
+ :class:`altair.ViewConfig` ``TypedDict`` wrapper.
Parameters
----------
diff --git a/altair/vegalite/v5/theme.py b/altair/vegalite/v5/theme.py
index ba5a5ab9a..77f480829 100644
--- a/altair/vegalite/v5/theme.py
+++ b/altair/vegalite/v5/theme.py
@@ -2,22 +2,16 @@
from __future__ import annotations
-import sys
-from functools import wraps
-from typing import TYPE_CHECKING, Callable, Final, Literal, get_args
+from typing import TYPE_CHECKING, Any, Final, Literal, get_args
-from altair.utils.theme import ThemeRegistry
+from altair.utils.deprecation import deprecated_static_only
+from altair.utils.plugin_registry import Plugin, PluginRegistry
from altair.vegalite.v5.schema._config import ThemeConfig
from altair.vegalite.v5.schema._typing import VegaThemes
-if sys.version_info >= (3, 10):
- from typing import ParamSpec
-else:
- from typing_extensions import ParamSpec
-
-
if TYPE_CHECKING:
- from altair.utils.plugin_registry import Plugin
+ import sys
+ from functools import partial
if sys.version_info >= (3, 11):
from typing import LiteralString
@@ -28,11 +22,64 @@
else:
from typing_extensions import TypeAlias
-P = ParamSpec("P")
+ from altair.utils.plugin_registry import PluginEnabler
+
+
AltairThemes: TypeAlias = Literal["default", "opaque"]
VEGA_THEMES: list[LiteralString] = list(get_args(VegaThemes))
+# HACK: See for `LiteralString` requirement in `name`
+# https://github.com/vega/altair/pull/3526#discussion_r1743350127
+class ThemeRegistry(PluginRegistry[Plugin[ThemeConfig], ThemeConfig]):
+ def enable(
+ self,
+ name: LiteralString | AltairThemes | VegaThemes | None = None,
+ **options: Any,
+ ) -> PluginEnabler[Plugin[ThemeConfig], ThemeConfig]:
+ """
+ Enable a theme by name.
+
+ This can be either called directly, or used as a context manager.
+
+ Parameters
+ ----------
+ name : string (optional)
+ The name of the theme to enable. If not specified, then use the
+ current active name.
+ **options :
+ Any additional parameters will be passed to the theme as keyword
+ arguments
+
+ Returns
+ -------
+ PluginEnabler:
+ An object that allows enable() to be used as a context manager
+
+ Notes
+ -----
+ Default `vega` themes can be previewed at https://vega.github.io/vega-themes/
+ """
+ return super().enable(name, **options)
+
+ def get(self) -> partial[ThemeConfig] | Plugin[ThemeConfig] | None:
+ """Return the currently active theme."""
+ return super().get()
+
+ def names(self) -> list[str]:
+ """Return the names of the registered and entry points themes."""
+ return super().names()
+
+ @deprecated_static_only(
+ "Deprecated since `altair=5.5.0`. Use @altair.theme.register instead.",
+ category=None,
+ )
+ def register(
+ self, name: str, value: Plugin[ThemeConfig] | None
+ ) -> Plugin[ThemeConfig] | None:
+ return super().register(name, value)
+
+
class VegaTheme:
"""Implementation of a builtin vega theme."""
@@ -53,6 +100,8 @@ def __repr__(self) -> str:
# themes that will be auto-detected. Explicit registration is also
# allowed by the PluginRegistry API.
ENTRY_POINT_GROUP: Final = "altair.vegalite.v5.theme"
+
+# NOTE: `themes` def has an entry point group
themes = ThemeRegistry(entry_point_group=ENTRY_POINT_GROUP)
themes.register(
@@ -74,75 +123,3 @@ def __repr__(self) -> str:
themes.register(theme, VegaTheme(theme))
themes.enable("default")
-
-
-# HACK: See for `LiteralString` requirement in `name`
-# https://github.com/vega/altair/pull/3526#discussion_r1743350127
-def register_theme(
- name: LiteralString, *, enable: bool
-) -> Callable[[Plugin[ThemeConfig]], Plugin[ThemeConfig]]:
- """
- Decorator for registering a theme function.
-
- Parameters
- ----------
- name
- Unique name assigned in ``alt.themes``.
- enable
- Auto-enable the wrapped theme.
-
- Examples
- --------
- Register and enable a theme::
-
- import altair as alt
- from altair.typing import ThemeConfig
-
-
- @alt.register_theme("param_font_size", enable=True)
- def custom_theme() -> ThemeConfig:
- sizes = 12, 14, 16, 18, 20
- return {
- "autosize": {"contains": "content", "resize": True},
- "background": "#F3F2F1",
- "config": {
- "axisX": {"labelFontSize": sizes[1], "titleFontSize": sizes[1]},
- "axisY": {"labelFontSize": sizes[1], "titleFontSize": sizes[1]},
- "font": "'Lato', 'Segoe UI', Tahoma, Verdana, sans-serif",
- "headerColumn": {"labelFontSize": sizes[1]},
- "headerFacet": {"labelFontSize": sizes[1]},
- "headerRow": {"labelFontSize": sizes[1]},
- "legend": {"labelFontSize": sizes[0], "titleFontSize": sizes[1]},
- "text": {"fontSize": sizes[0]},
- "title": {"fontSize": sizes[-1]},
- },
- "height": {"step": 28},
- "width": 350,
- }
-
- Until another theme has been enabled, all charts will use defaults set in ``custom_theme``::
-
- from vega_datasets import data
-
- source = data.stocks()
- lines = (
- alt.Chart(source, title=alt.Title("Stocks"))
- .mark_line()
- .encode(x="date:T", y="price:Q", color="symbol:N")
- )
- lines.interactive(bind_y=False)
-
- """
-
- def decorate(func: Plugin[ThemeConfig], /) -> Plugin[ThemeConfig]:
- themes.register(name, func)
- if enable:
- themes.enable(name)
-
- @wraps(func)
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> ThemeConfig:
- return func(*args, **kwargs)
-
- return wrapper
-
- return decorate
diff --git a/doc/user_guide/api.rst b/doc/user_guide/api.rst
index 9000bce99..d3c08f547 100644
--- a/doc/user_guide/api.rst
+++ b/doc/user_guide/api.rst
@@ -9,6 +9,8 @@ Please refer to the `full user guide `_ for
further details, as this low-level documentation may not be enough to give
full guidelines on their use.
+.. _api-toplevel:
+
Top-Level Objects
-----------------
.. currentmodule:: altair
@@ -26,6 +28,8 @@ Top-Level Objects
TopLevelMixin
VConcatChart
+.. _api-channels:
+
Encoding Channels
-----------------
.. currentmodule:: altair
@@ -134,6 +138,8 @@ Encoding Channels
YOffsetValue
YValue
+.. _api-functions:
+
API Functions
-------------
.. currentmodule:: altair
@@ -164,6 +170,96 @@ API Functions
vconcat
when
+.. _api-theme:
+
+Theme
+-----
+.. currentmodule:: altair.theme
+
+.. autosummary::
+ :toctree: generated/theme/
+ :nosignatures:
+
+ active
+ enable
+ get
+ names
+ options
+ register
+ unregister
+ ThemeConfig
+ AreaConfigKwds
+ AutoSizeParamsKwds
+ AxisConfigKwds
+ AxisResolveMapKwds
+ BarConfigKwds
+ BindCheckboxKwds
+ BindDirectKwds
+ BindInputKwds
+ BindRadioSelectKwds
+ BindRangeKwds
+ BoxPlotConfigKwds
+ BrushConfigKwds
+ CompositionConfigKwds
+ ConfigKwds
+ DateTimeKwds
+ DerivedStreamKwds
+ ErrorBandConfigKwds
+ ErrorBarConfigKwds
+ FeatureGeometryGeoJsonPropertiesKwds
+ FormatConfigKwds
+ GeoJsonFeatureCollectionKwds
+ GeoJsonFeatureKwds
+ GeometryCollectionKwds
+ GradientStopKwds
+ HeaderConfigKwds
+ IntervalSelectionConfigKwds
+ IntervalSelectionConfigWithoutTypeKwds
+ LegendConfigKwds
+ LegendResolveMapKwds
+ LegendStreamBindingKwds
+ LineConfigKwds
+ LineStringKwds
+ LinearGradientKwds
+ LocaleKwds
+ MarkConfigKwds
+ MergedStreamKwds
+ MultiLineStringKwds
+ MultiPointKwds
+ MultiPolygonKwds
+ NumberLocaleKwds
+ OverlayMarkDefKwds
+ PaddingKwds
+ PointKwds
+ PointSelectionConfigKwds
+ PointSelectionConfigWithoutTypeKwds
+ PolygonKwds
+ ProjectionConfigKwds
+ ProjectionKwds
+ RadialGradientKwds
+ RangeConfigKwds
+ RectConfigKwds
+ ResolveKwds
+ RowColKwds
+ ScaleConfigKwds
+ ScaleInvalidDataConfigKwds
+ ScaleResolveMapKwds
+ SelectionConfigKwds
+ StepKwds
+ StyleConfigIndexKwds
+ TickConfigKwds
+ TimeIntervalStepKwds
+ TimeLocaleKwds
+ TitleConfigKwds
+ TitleParamsKwds
+ TooltipContentKwds
+ TopLevelSelectionParameterKwds
+ VariableParameterKwds
+ ViewBackgroundKwds
+ ViewConfigKwds
+
+.. _api-core:
+
Low-Level Schema Wrappers
-------------------------
.. currentmodule:: altair
@@ -625,6 +721,8 @@ Low-Level Schema Wrappers
WindowOnlyOp
WindowTransform
+.. _api-cls:
+
API Utility Classes
-------------------
.. currentmodule:: altair
@@ -638,6 +736,8 @@ API Utility Classes
Then
ChainedWhen
+.. _api-typing:
+
Typing
------
.. currentmodule:: altair.typing
@@ -689,7 +789,5 @@ Typing
ChartType
EncodeKwds
Optional
- ThemeConfig
is_chart_type
- theme
diff --git a/doc/user_guide/customization.rst b/doc/user_guide/customization.rst
index b95ac1c35..8c3781865 100644
--- a/doc/user_guide/customization.rst
+++ b/doc/user_guide/customization.rst
@@ -703,15 +703,20 @@ outside the chart itself; For example, the container may be a ```` element
Chart Themes
------------
+.. note::
+
+ This material was changed considerably with the release of Altair ``5.5.0``.
+
Altair makes available a theme registry that lets users apply chart configurations
-globally within any Python session. This is done via the ``alt.themes`` object.
+globally within any Python session.
+The :mod:`altair.theme` module provides :ref:`helper functions
` to interact with the registry.
-The themes registry consists of functions which define a specification dictionary
+Each theme in the registry is a function which define a specification dictionary
that will be added to every created chart.
For example, the default theme configures the default size of a single chart:
>>> import altair as alt
- >>> default = alt.themes.get()
+ >>> default = alt.theme.get()
>>> default()
{'config': {'view': {'continuousWidth': 300, 'continuousHeight': 300}}}
@@ -740,14 +745,14 @@ The rendered chart will then reflect these configurations:
Changing the Theme
~~~~~~~~~~~~~~~~~~
If you would like to enable any other theme for the length of your Python session,
-you can call ``alt.themes.enable(theme_name)``.
+you can call :func:`altair.theme.enable`.
For example, Altair includes a theme in which the chart background is opaque
rather than transparent:
.. altair-plot::
:output: repr
- alt.themes.enable('opaque')
+ alt.theme.enable('opaque')
chart.to_dict()
.. altair-plot::
@@ -761,7 +766,7 @@ theme named ``'none'``:
.. altair-plot::
:output: repr
- alt.themes.enable('none')
+ alt.theme.enable('none')
chart.to_dict()
.. altair-plot::
@@ -777,9 +782,14 @@ If you would like to use any theme just for a single chart, you can use the
.. altair-plot::
:output: none
- with alt.themes.enable('default'):
+ with alt.theme.enable('default'):
spec = chart.to_json()
+.. note::
+ The above requires that a conversion/saving operation occurs during the ``with`` block,
+ such as :meth:`~Chart.to_dict`, :meth:`~Chart.to_json`, :meth:`~Chart.save`.
+ See https://github.com/vega/altair/issues/3586
+
Built-in Themes
~~~~~~~~~~~~~~~
Currently Altair does not offer many built-in themes, but we plan to add
@@ -793,10 +803,11 @@ You can get a feel for the themes inherited from `Vega Themes`_ via *Vega-Altair
Defining a Custom Theme
~~~~~~~~~~~~~~~~~~~~~~~
-The theme registry also allows defining and registering custom themes.
A theme is simply a function that returns a dictionary of default values
-to be added to the chart specification at rendering time, which is then
-registered and activated.
+to be added to the chart specification at rendering time.
+
+Using :func:`altair.theme.register`, we can both register and enable a theme
+at the site of the function definition.
For example, here we define a theme in which all marks are drawn with black
fill unless otherwise specified:
@@ -806,26 +817,17 @@ fill unless otherwise specified:
import altair as alt
from vega_datasets import data
- # define the theme by returning the dictionary of configurations
- def black_marks():
+ # define, register and enable theme
+
+ @alt.theme.register("black_marks", enable=True)
+ def black_marks() -> alt.theme.ThemeConfig:
return {
- 'config': {
- 'view': {
- 'height': 300,
- 'width': 300,
- },
- 'mark': {
- 'color': 'black',
- 'fill': 'black'
- }
+ "config": {
+ "view": {"continuousWidth": 300, "continuousHeight": 300},
+ "mark": {"color": "black", "fill": "black"},
}
}
- # register the custom theme under a chosen name
- alt.themes.register('black_marks', black_marks)
-
- # enable the newly registered theme
- alt.themes.enable('black_marks')
# draw the chart
cars = data.cars.url
diff --git a/tests/utils/test_deprecation.py b/tests/utils/test_deprecation.py
index 3970f4794..3449142aa 100644
--- a/tests/utils/test_deprecation.py
+++ b/tests/utils/test_deprecation.py
@@ -1,9 +1,11 @@
+# ruff: noqa: B018
import re
import pytest
from altair.utils.deprecation import (
AltairDeprecationWarning,
+ _warnings_monitor,
deprecated,
deprecated_warn,
)
@@ -38,3 +40,25 @@ def test_deprecation_warn():
match=re.compile(r"altair=3321.+this code path is a noop", flags=re.DOTALL),
):
deprecated_warn("this code path is a noop", version="3321", stacklevel=1)
+
+
+def test_deprecated_import():
+ import altair as alt
+
+ pattern = re.compile(
+ r"altair=5\.5\.0.+\.theme instead.+user.guide",
+ flags=re.DOTALL | re.IGNORECASE,
+ )
+ with pytest.warns(AltairDeprecationWarning, match=pattern):
+ alt.themes
+
+ # NOTE: Tests that second access does not trigger a warning
+ assert alt.themes
+ # Then reset cache
+ _warnings_monitor.clear()
+
+ with pytest.warns(AltairDeprecationWarning, match=pattern):
+ from altair import themes # noqa: F401
+
+ assert alt.themes == alt.theme._themes
+ _warnings_monitor.clear()
diff --git a/tests/vegalite/test_common.py b/tests/vegalite/test_common.py
index 3e8760ad7..404328886 100644
--- a/tests/vegalite/test_common.py
+++ b/tests/vegalite/test_common.py
@@ -20,7 +20,10 @@ def basic_spec():
def make_final_spec(alt, basic_spec):
- theme = alt.themes.get()
+ from altair.theme import _themes
+
+ theme = _themes.get()
+ assert theme
spec = theme()
spec.update(basic_spec)
return spec
@@ -67,10 +70,12 @@ def test_basic_chart_from_dict(alt, basic_spec):
@pytest.mark.parametrize("alt", [v5])
def test_theme_enable(alt, basic_spec):
- active_theme = alt.themes.active
+ from altair.theme import _themes
+
+ active_theme = _themes.active
try:
- alt.themes.enable("none")
+ _themes.enable("none")
chart = alt.Chart.from_dict(basic_spec)
dct = chart.to_dict()
@@ -83,7 +88,7 @@ def test_theme_enable(alt, basic_spec):
assert dct == basic_spec
finally:
# reset the theme to its initial value
- alt.themes.enable(active_theme)
+ _themes.enable(active_theme) # pyright: ignore[reportArgumentType]
@pytest.mark.parametrize("alt", [v5])
diff --git a/tests/vegalite/v5/test_api.py b/tests/vegalite/v5/test_api.py
index 98b30a9b6..0f60d185a 100644
--- a/tests/vegalite/v5/test_api.py
+++ b/tests/vegalite/v5/test_api.py
@@ -1347,20 +1347,22 @@ def test_LookupData():
def test_themes():
+ from altair import theme
+
chart = alt.Chart("foo.txt").mark_point()
- with alt.themes.enable("default"):
+ with theme.enable("default"):
assert chart.to_dict()["config"] == {
"view": {"continuousWidth": 300, "continuousHeight": 300}
}
- with alt.themes.enable("opaque"):
+ with theme.enable("opaque"):
assert chart.to_dict()["config"] == {
"background": "white",
"view": {"continuousWidth": 300, "continuousHeight": 300},
}
- with alt.themes.enable("none"):
+ with theme.enable("none"):
assert "config" not in chart.to_dict()
diff --git a/tests/vegalite/v5/test_theme.py b/tests/vegalite/v5/test_theme.py
index 97d2fb42e..da7c134ba 100644
--- a/tests/vegalite/v5/test_theme.py
+++ b/tests/vegalite/v5/test_theme.py
@@ -5,10 +5,11 @@
import pytest
import altair.vegalite.v5 as alt
-from altair.typing import ThemeConfig
-from altair.vegalite.v5.schema._config import ConfigKwds
+from altair import theme
+from altair.theme import ConfigKwds, ThemeConfig
from altair.vegalite.v5.schema._typing import is_color_hex
-from altair.vegalite.v5.theme import VEGA_THEMES, register_theme, themes
+from altair.vegalite.v5.theme import VEGA_THEMES
+from tests import slow
if TYPE_CHECKING:
import sys
@@ -25,26 +26,83 @@ def chart() -> alt.Chart:
def test_vega_themes(chart) -> None:
- for theme in VEGA_THEMES:
- with alt.themes.enable(theme):
+ for theme_name in VEGA_THEMES:
+ with theme.enable(theme_name):
dct = chart.to_dict()
- assert dct["usermeta"] == {"embedOptions": {"theme": theme}}
+ assert dct["usermeta"] == {"embedOptions": {"theme": theme_name}}
assert dct["config"] == {
"view": {"continuousWidth": 300, "continuousHeight": 300}
}
-def test_register_theme_decorator() -> None:
- @register_theme("unique name", enable=True)
+@slow
+def test_theme_remote_lambda() -> None:
+ """
+ Compatibility test for ``lambda`` usage in `dash-vega-components`_.
+
+ A ``lambda`` here is to fetch the remote resource **once**, wrapping the result in a function.
+
+ .. _dash-vega-components:
+ https://github.com/vega/dash-vega-components/blob/c3e8cae873580bc7a52bc01daea1f27a7df02b8b/example_app.py#L13-L17
+ """
+ import altair as alt # noqa: I001
+ from urllib.request import urlopen
+ import json
+
+ URL = "https://gist.githubusercontent.com/binste/b4042fa76a89d72d45cbbb9355ec6906/raw/e36f79d722bcd9dd954389b1753a2d4a18113227/altair_theme.json"
+ with urlopen(URL) as response:
+ custom_theme = json.load(response)
+
+ alt.theme.register("remote_binste", enable=True)(lambda: custom_theme)
+ assert alt.theme.active == "remote_binste"
+
+ # NOTE: A decorator-compatible way to define an "anonymous" function
+ @alt.theme.register("remote_binste_2", enable=True)
+ def _():
+ return custom_theme
+
+ assert alt.theme.active == "remote_binste_2"
+
+ decorated_theme = alt.theme.get()
+ alt.theme.enable("remote_binste")
+ assert alt.theme.active == "remote_binste"
+ lambda_theme = alt.theme.get()
+
+ assert decorated_theme
+ assert lambda_theme
+ assert decorated_theme() == lambda_theme()
+
+
+def test_theme_register_decorator() -> None:
+ @theme.register("unique name", enable=True)
def custom_theme() -> ThemeConfig:
return {"height": 400, "width": 700}
- assert themes.active == "unique name"
- registered = themes.get()
+ assert theme._themes.active == "unique name" == theme.active
+ registered = theme._themes.get()
assert registered is not None
+ assert registered == theme.get()
assert registered() == {"height": 400, "width": 700} == custom_theme()
+def test_theme_unregister() -> None:
+ @theme.register("big square", enable=True)
+ def custom_theme() -> ThemeConfig:
+ return {"height": 1000, "width": 1000}
+
+ assert theme.active == "big square"
+ fn = theme.unregister("big square")
+ assert fn() == custom_theme()
+ assert theme.active == theme._themes.active
+ # BUG: https://github.com/vega/altair/issues/3619
+ # assert theme.active != "big square"
+
+ with pytest.raises(
+ TypeError, match=r"Found no theme named 'big square' in registry."
+ ):
+ theme.unregister("big square")
+
+
@pytest.mark.parametrize(
("color_code", "valid"),
[
@@ -982,5 +1040,6 @@ def test_theme_config(theme_func: Callable[[], ThemeConfig], chart) -> None:
See ``(test_vega_themes|test_register_theme_decorator)`` for comprehensive suite.
"""
name = cast("LiteralString", theme_func.__qualname__)
- register_theme(name, enable=True)
+ theme.register(name, enable=True)(theme_func)
assert chart.to_dict(validate=True)
+ assert theme.get() == theme_func
diff --git a/tools/generate_api_docs.py b/tools/generate_api_docs.py
index 489375786..b9c2a1a2a 100644
--- a/tools/generate_api_docs.py
+++ b/tools/generate_api_docs.py
@@ -26,6 +26,8 @@
further details, as this low-level documentation may not be enough to give
full guidelines on their use.
+.. _api-toplevel:
+
Top-Level Objects
-----------------
.. currentmodule:: altair
@@ -36,6 +38,8 @@
{toplevel_charts}
+.. _api-channels:
+
Encoding Channels
-----------------
.. currentmodule:: altair
@@ -46,6 +50,8 @@
{encoding_wrappers}
+.. _api-functions:
+
API Functions
-------------
.. currentmodule:: altair
@@ -56,6 +62,20 @@
{api_functions}
+.. _api-theme:
+
+Theme
+-----
+.. currentmodule:: altair.theme
+
+.. autosummary::
+ :toctree: generated/theme/
+ :nosignatures:
+
+ {theme_objects}
+
+.. _api-core:
+
Low-Level Schema Wrappers
-------------------------
.. currentmodule:: altair
@@ -66,6 +86,8 @@
{lowlevel_wrappers}
+.. _api-cls:
+
API Utility Classes
-------------------
.. currentmodule:: altair
@@ -76,6 +98,8 @@
{api_classes}
+.. _api-typing:
+
Typing
------
.. currentmodule:: altair.typing
@@ -111,19 +135,19 @@ def iter_objects(
def toplevel_charts() -> list[str]:
- return sorted(iter_objects(alt.api, restrict_to_subclass=alt.TopLevelMixin)) # type: ignore[attr-defined]
+ return sorted(iter_objects(alt.api, restrict_to_subclass=alt.TopLevelMixin))
def encoding_wrappers() -> list[str]:
- return sorted(iter_objects(alt.channels, restrict_to_subclass=alt.SchemaBase)) # type: ignore[attr-defined]
+ return sorted(iter_objects(alt.channels, restrict_to_subclass=alt.SchemaBase))
def api_functions() -> list[str]:
# Exclude `typing` functions/SpecialForm(s)
- KEEP = set(alt.api.__all__) - set(alt.typing.__all__) # type: ignore[attr-defined]
+ KEEP = set(alt.api.__all__) - set(alt.typing.__all__)
return sorted(
name
- for name in iter_objects(alt.api, restrict_to_type=types.FunctionType) # type: ignore[attr-defined]
+ for name in iter_objects(alt.api, restrict_to_type=types.FunctionType)
if name in KEEP
)
@@ -137,8 +161,16 @@ def type_hints() -> list[str]:
return sorted(s for s in iter_objects(alt.typing) if s in alt.typing.__all__)
+def theme() -> list[str]:
+ sort_1 = sorted(s for s in iter_objects(alt.theme) if s in alt.theme.__all__)
+ # Display functions before `TypedDict`, but show `ThemeConfig` before `Kwds`
+ sort_2 = sorted(sort_1, key=lambda s: s.endswith("Kwds"))
+ sort_3 = sorted(sort_2, key=lambda s: not s.islower())
+ return sort_3
+
+
def lowlevel_wrappers() -> list[str]:
- objects = sorted(iter_objects(alt.schema.core, restrict_to_subclass=alt.SchemaBase)) # type: ignore[attr-defined]
+ objects = sorted(iter_objects(alt.schema.core, restrict_to_subclass=alt.SchemaBase))
# The names of these two classes are also used for classes in alt.channels. Due to
# how imports are set up, these channel classes overwrite the two low-level classes
# in the top-level Altair namespace. Therefore, they cannot be imported as e.g.
@@ -159,6 +191,7 @@ def write_api_file() -> None:
lowlevel_wrappers=sep.join(lowlevel_wrappers()),
api_classes=sep.join(api_classes()),
typing_objects=sep.join(type_hints()),
+ theme_objects=sep.join(theme()),
),
encoding="utf-8",
)
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index 278606551..e024c2ca1 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -7,11 +7,12 @@
import json
import sys
import textwrap
+from collections.abc import Iterable, Iterator
from dataclasses import dataclass
from itertools import chain
from operator import attrgetter
from pathlib import Path
-from typing import TYPE_CHECKING, Any, Final, Generic, Literal, TypedDict, TypeVar
+from typing import TYPE_CHECKING, Any, Final, Generic, Literal, TypeVar
from urllib import request
if sys.version_info >= (3, 14):
@@ -47,6 +48,7 @@
from tools.schemapi.codegen import ArgInfo, AttrGetter
from vl_convert import VegaThemes
+T = TypeVar("T", bound="str | Iterable[str]")
SCHEMA_VERSION: Final = "v5.20.1"
@@ -530,6 +532,12 @@ class {classname}(DatumChannelMixin, core.{basename}):
haspropsetters = True
+class ModuleDef(Generic[T]):
+ def __init__(self, contents: T, all: Iterable[str], /) -> None:
+ self.contents: T = contents
+ self.all: list[str] = list(all)
+
+
def schema_class(*args, **kwargs) -> str:
return SchemaGenerator(*args, **kwargs).schema_class()
@@ -692,7 +700,7 @@ def visit(nodes):
return stack
-def generate_vegalite_schema_wrapper(fp: Path, /) -> str:
+def generate_vegalite_schema_wrapper(fp: Path, /) -> ModuleDef[str]:
"""Generate a schema wrapper at the given path."""
# TODO: generate simple tests for each wrapper
basename = "VegaLiteSchema"
@@ -766,7 +774,7 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> str:
contents.append(definitions[name].schema_class())
contents.append("") # end with newline
- return "\n".join(contents)
+ return ModuleDef("\n".join(contents), all_)
@dataclass
@@ -798,7 +806,7 @@ def non_field_names(self) -> Iterator[str]:
yield self.value_class_name
-def generate_vegalite_channel_wrappers(fp: Path, /) -> str:
+def generate_vegalite_channel_wrappers(fp: Path, /) -> ModuleDef[list[str]]:
schema = load_schema_with_shorthand_properties(fp)
encoding_def = "FacetedEncoding"
encoding = SchemaInfo(schema["definitions"][encoding_def], rootschema=schema)
@@ -854,7 +862,7 @@ def generate_vegalite_channel_wrappers(fp: Path, /) -> str:
"with_property_setters",
)
it = chain.from_iterable(info.all_names for info in channel_infos.values())
- all_ = list(chain(it, COMPAT_EXPORTS))
+ all_ = sorted(chain(it, COMPAT_EXPORTS))
imports = [
"import sys",
"from typing import Any, overload, Sequence, List, Literal, Union, TYPE_CHECKING, TypedDict",
@@ -877,7 +885,7 @@ def generate_vegalite_channel_wrappers(fp: Path, /) -> str:
ENCODING_SORT_FIELD,
)
TYPING_API = INTO_CONDITION, BIN, IMPUTE
- contents = [
+ contents: list[str] = [
HEADER,
CHANNEL_MYPY_IGNORE_STATEMENTS,
*imports,
@@ -889,14 +897,14 @@ def generate_vegalite_channel_wrappers(fp: Path, /) -> str:
f"from altair.vegalite.v5.api import {', '.join(TYPING_API)}",
textwrap.indent(import_typing_extensions((3, 11), "Self"), " "),
),
- "\n" f"__all__ = {sorted(all_)}\n",
+ "\n" f"__all__ = {all_}\n",
CHANNEL_MIXINS,
*class_defs,
*generate_encoding_artifacts(
channel_infos, ENCODE_METHOD, facet_encoding=encoding
),
]
- return "\n".join(contents)
+ return ModuleDef(contents, all_)
def generate_vegalite_mark_mixin(fp: Path, /, markdefs: dict[str, str]) -> str:
@@ -1008,7 +1016,7 @@ def generate_typed_dict(
name=name,
metaclass_kwds=metaclass_kwds,
comment=comment,
- summary=summary or f"{rst_syntax_for_class(info.title)} ``TypedDict`` wrapper.",
+ summary=(summary or f":class:`altair.{info.title}` ``TypedDict`` wrapper."),
doc=doc,
td_args=args,
)
@@ -1092,6 +1100,72 @@ def generate_vegalite_config_mixin(fp: Path, /) -> str:
return "\n".join(code)
+def generate_schema__init__(
+ *modules: str,
+ package: str,
+ expand: dict[Path, ModuleDef[Any]] | None = None,
+) -> Iterator[str]:
+ """
+ Generate schema subpackage init contents.
+
+ Parameters
+ ----------
+ *modules
+ Module names to expose, in addition to their members::
+
+ ...schema.__init__.__all__ = [
+ ...,
+ module_1.__name__,
+ module_1.__all__,
+ module_2.__name__,
+ module_2.__all__,
+ ...,
+ ]
+ package
+ Absolute, dotted path for `schema`, e.g::
+
+ "altair.vegalite.v5.schema"
+ expand
+ Required for 2nd-pass, which explicitly defines the new ``__all__``, using newly generated names.
+
+ .. note::
+ The default `import idiom`_ works at runtime, and for ``pyright`` - but not ``mypy``.
+ See `issue`_.
+
+ .. _import idiom:
+ https://typing.readthedocs.io/en/latest/spec/distributing.html#library-interface-public-and-private-symbols
+ .. _issue:
+ https://github.com/python/mypy/issues/15300
+ """
+ yield f"# ruff: noqa: F403, F405\n{HEADER_COMMENT}"
+ yield f"from {package} import {', '.join(modules)}"
+ yield from (f"from {package}.{mod} import *" for mod in modules)
+ yield f"SCHEMA_VERSION = {SCHEMA_VERSION!r}\n"
+ yield f"SCHEMA_URL = {schema_url()!r}\n"
+ base_all: list[str] = ["SCHEMA_URL", "SCHEMA_VERSION", *modules]
+ if expand:
+ base_all.extend(
+ chain.from_iterable(v.all for k, v in expand.items() if k.stem in modules)
+ )
+ yield f"__all__ = {base_all}"
+ else:
+ yield f"__all__ = {base_all}"
+ yield from (f"__all__ += {mod}.__all__" for mod in modules)
+
+
+def path_to_module_str(
+ fp: Path,
+ /,
+ root: Literal["altair", "doc", "sphinxext", "tests", "tools"] = "altair",
+) -> str:
+ # NOTE: GH runner has 3x altair, local is 2x
+ # - Needs to be the last occurence
+ idx = fp.parts.index(root)
+ start = idx + fp.parts.count(root) - 1 if root == "altair" else idx
+ parents = fp.parts[start:-1]
+ return ".".join(parents if fp.stem == "__init__" else (*parents, fp.stem))
+
+
def vegalite_main(skip_download: bool = False) -> None:
version = SCHEMA_VERSION
vn = version.split(".")[0]
@@ -1109,23 +1183,22 @@ def vegalite_main(skip_download: bool = False) -> None:
# Generate __init__.py file
outfile = schemapath / "__init__.py"
+ pkg_schema = path_to_module_str(outfile)
print(f"Writing {outfile!s}")
- content = [
- "# ruff: noqa\n",
- "from .core import *\nfrom .channels import *\n",
- f"SCHEMA_VERSION = '{version}'\n",
- f"SCHEMA_URL = {schema_url(version)!r}\n",
- ]
- ruff.write_lint_format(outfile, content)
+ ruff.write_lint_format(
+ outfile, generate_schema__init__("channels", "core", package=pkg_schema)
+ )
TypeAliasTracer.update_aliases(("Map", "Mapping[str, Any]"))
files: dict[Path, str | Iterable[str]] = {}
+ modules: dict[Path, ModuleDef[Any]] = {}
# Generate the core schema wrappers
fp_core = schemapath / "core.py"
print(f"Generating\n {schemafile!s}\n ->{fp_core!s}")
- files[fp_core] = generate_vegalite_schema_wrapper(schemafile)
+ modules[fp_core] = generate_vegalite_schema_wrapper(schemafile)
+ files[fp_core] = modules[fp_core].contents
# Generate the channel wrappers
fp_channels = schemapath / "channels.py"
@@ -1133,7 +1206,14 @@ def vegalite_main(skip_download: bool = False) -> None:
with RemapContext(
{DATETIME: (TEMPORAL, DATETIME), BIN_PARAMS: (BIN,), IMPUTE_PARAMS: (IMPUTE,)}
):
- files[fp_channels] = generate_vegalite_channel_wrappers(schemafile)
+ modules[fp_channels] = generate_vegalite_channel_wrappers(schemafile)
+ files[fp_channels] = modules[fp_channels].contents
+
+ # Expand `schema.__init__.__all__` with new classes
+ ruff.write_lint_format(
+ outfile,
+ generate_schema__init__("channels", "core", package=pkg_schema, expand=modules),
+ )
# generate the mark mixin
markdefs = {k: f"{k}Def" for k in ["Mark", "BoxPlot", "ErrorBar", "ErrorBand"]}
diff --git a/tools/update_init_file.py b/tools/update_init_file.py
index f795667b7..5ac9c7cb4 100644
--- a/tools/update_init_file.py
+++ b/tools/update_init_file.py
@@ -4,13 +4,18 @@
import typing as t
import typing_extensions as te
+from importlib import import_module as _import_module
+from importlib.util import find_spec as _find_spec
from inspect import getattr_static, ismodule
from pathlib import Path
from typing import TYPE_CHECKING
from tools.codemod import ruff
-_TYPING_CONSTRUCTS = {
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Iterator
+
+_TYPING_CONSTRUCTS: set[t.Any] = {
te.TypeAlias,
t.TypeVar,
t.cast,
@@ -36,6 +41,8 @@
te.TypeAliasType,
}
+DYNAMIC_ALL: tuple[te.LiteralString, ...] = ("altair.vegalite.v5",)
+
def update__all__variable() -> None:
"""
@@ -47,11 +54,8 @@ def update__all__variable() -> None:
# Read existing file content
import altair as alt
- encoding = "utf-8"
- init_path = Path(alt.__file__)
- with init_path.open(encoding=encoding) as f:
- lines = f.readlines()
- lines = [line.strip("\n") for line in lines]
+ init_path = normalize_source("altair")
+ lines = extract_lines(init_path, strip_chars="\n")
# Find first and last line of the definition of __all__
first_definition_line = None
@@ -76,6 +80,10 @@ def update__all__variable() -> None:
# Format file content with ruff
ruff.write_lint_format(init_path, new_lines)
+ for source in DYNAMIC_ALL:
+ print(f"Updating `__all__`\n " f"{source!r}\n ->{normalize_source(source)!s}")
+ update_dynamic__all__(source)
+
def relevant_attributes(namespace: dict[str, t.Any], /) -> list[str]:
"""
@@ -134,5 +142,104 @@ def _is_relevant(attr: t.Any, name: str, /) -> bool:
return True
+def _retrieve_all(name: str, /) -> list[str]:
+ """Import `name` and return a defined ``__all__``."""
+ found = _import_module(name).__all__
+ if not found:
+ msg = (
+ f"Expected to find a populated `__all__` for {name!r},\n"
+ f"but got: {found!r}"
+ )
+ raise AttributeError(msg)
+ return found
+
+
+def normalize_source(src: str | Path, /) -> Path:
+ """
+ Return the ``Path`` representation of a module/package.
+
+ Returned unchanged if already a ``Path``.
+ """
+ if isinstance(src, str):
+ if src == "altair" or src.startswith("altair."):
+ if (spec := _find_spec(src)) and (origin := spec.origin):
+ src = origin
+ else:
+ raise ModuleNotFoundError(src, spec)
+ return Path(src)
+ else:
+ return src
+
+
+def extract_lines(fp: Path, /, strip_chars: str | None = None) -> list[str]:
+ """Return all lines in ``fp`` with whitespace stripped."""
+ with Path(fp).open(encoding="utf-8") as f:
+ lines = f.readlines()
+ if not lines:
+ msg = f"Found no content when reading lines for:\n{lines!r}"
+ raise NotImplementedError(msg)
+ return [line.strip(strip_chars) for line in lines]
+
+
+def _normalize_import_lines(lines: Iterable[str]) -> Iterator[str]:
+ """
+ Collapses file content to contain one line per import source.
+
+ Preserves only lines **before** an existing ``__all__``.
+ """
+ it: Iterator[str] = iter(lines)
+ for line in it:
+ if line.endswith("("):
+ line = line.rstrip("( ")
+ for s_line in it:
+ if s_line.endswith(","):
+ line = f"{line} {s_line}"
+ elif s_line.endswith(")"):
+ break
+ else:
+ NotImplementedError(f"Unexpected line:\n{s_line!r}")
+ yield line.rstrip(",")
+ elif line.startswith("__all__"):
+ break
+ else:
+ yield line
+
+
+def process_lines(lines: Iterable[str], /) -> Iterator[str]:
+ """Normalize imports, follow ``*``(s), reconstruct `__all__``."""
+ _all: set[str] = set()
+ for line in _normalize_import_lines(lines):
+ if line.startswith("#") or line == "":
+ yield line
+ elif "import" in line:
+ origin_stmt, members = line.split(" import ", maxsplit=1)
+ if members == "*":
+ _, origin = origin_stmt.split("from ")
+ targets = _retrieve_all(origin)
+ else:
+ targets = members.split(", ")
+ _all.update(targets)
+ yield line
+ else:
+ msg = f"Unexpected line:\n{line!r}"
+ raise NotImplementedError(msg)
+ yield f"__all__ = {sorted(_all)}"
+
+
+def update_dynamic__all__(source: str | Path, /) -> None:
+ """
+ ## Relies on all `*` imports leading to an `__all__`.
+
+ Acceptable `source`:
+
+ "altair.package.subpackage.etc"
+ Path(...)
+
+ """
+ fp = normalize_source(source)
+ content = process_lines(extract_lines(fp))
+ ruff.write_lint_format(fp, content)
+
+
if __name__ == "__main__":
update__all__variable()
From b4816e9b33d97e8c0c6fb8434323ed800fdf7b47 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Tue, 12 Nov 2024 19:59:56 +0000
Subject: [PATCH 16/53] ci(typing): Add `pyarrow-stubs` to `dev` dependencies
(#3679)
---
pyproject.toml | 1 +
tests/utils/test_utils.py | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index ae15a8a4b..4132f0a25 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -73,6 +73,7 @@ dev = [
"duckdb>=1.0",
"ipython[kernel]",
"pandas>=1.1.3",
+ "pyarrow-stubs",
"pytest",
"pytest-cov",
"pytest-xdist[psutil]~=3.5",
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index c3b329cf0..2e8ae1214 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -140,7 +140,7 @@ def test_sanitize_pyarrow_table_columns() -> None:
pa_table = pa.Table.from_pandas(
df,
pa.schema(
- [
+ (
pa.field("s", pa.string()),
pa.field("f", pa.float64()),
pa.field("i", pa.int64()),
@@ -148,7 +148,7 @@ def test_sanitize_pyarrow_table_columns() -> None:
pa.field("d", pa.date32()),
pa.field("c", pa.dictionary(pa.int8(), pa.string())),
pa.field("p", pa.timestamp("ns", tz="UTC")),
- ]
+ )
),
)
sanitized = sanitize_narwhals_dataframe(nw.from_native(pa_table, eager_only=True))
From b292ccfb88ac84cf716cc0116ef2047633ab2654 Mon Sep 17 00:00:00 2001
From: Jon Mease
Date: Wed, 13 Nov 2024 07:53:31 -0500
Subject: [PATCH 17/53] chore: Prep for VegaFusion 2.0 (#3680)
---
altair/utils/_importers.py | 27 +++++++++++++++------------
pyproject.toml | 2 +-
2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/altair/utils/_importers.py b/altair/utils/_importers.py
index c02cc7011..efe48df8b 100644
--- a/altair/utils/_importers.py
+++ b/altair/utils/_importers.py
@@ -15,18 +15,21 @@ def import_vegafusion() -> ModuleType:
import vegafusion as vf
version = importlib_version("vegafusion")
- embed_version = importlib_version("vegafusion-python-embed")
- if version != embed_version or Version(version) < Version(min_version):
- msg = (
- "The versions of the vegafusion and vegafusion-python-embed packages must match\n"
- f"and must be version {min_version} or greater.\n"
- f"Found:\n"
- f" - vegafusion=={version}\n"
- f" - vegafusion-python-embed=={embed_version}\n"
- )
- raise RuntimeError(msg)
-
- return vf
+ if Version(version) >= Version("2.0.0a0"):
+ # In VegaFusion 2.0 there is no vegafusion-python-embed package
+ return vf
+ else:
+ embed_version = importlib_version("vegafusion-python-embed")
+ if version != embed_version or Version(version) < Version(min_version):
+ msg = (
+ "The versions of the vegafusion and vegafusion-python-embed packages must match\n"
+ f"and must be version {min_version} or greater.\n"
+ f"Found:\n"
+ f" - vegafusion=={version}\n"
+ f" - vegafusion-python-embed=={embed_version}\n"
+ )
+ raise RuntimeError(msg)
+ return vf
except ImportError as err:
msg = (
'The "vegafusion" data transformer and chart.transformed_data feature requires\n'
diff --git a/pyproject.toml b/pyproject.toml
index 4132f0a25..bcac9e098 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -63,7 +63,7 @@ all = [
"pandas>=1.1.3",
"numpy",
"pyarrow>=11",
- "vegafusion[embed]>=1.6.6,<2",
+ "vegafusion[embed]>=1.6.6",
"anywidget>=0.9.0",
"altair_tiles>=0.3.0"
]
From 1d576a8e3b8b47bdeae92f09d1733a93afd49fbd Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 13 Nov 2024 21:30:24 +0000
Subject: [PATCH 18/53] feat: Support `Chart.transform_filter(*predicates,
**constraints)` (#3664)
---
altair/vegalite/v5/api.py | 146 +++++++++++++-----
doc/user_guide/transform/filter.rst | 20 ++-
.../line_chart_with_cumsum_faceted.py | 6 +-
.../line_chart_with_cumsum_faceted.py | 6 +-
tests/vegalite/v5/test_api.py | 61 +++++++-
5 files changed, 192 insertions(+), 47 deletions(-)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index c99e556be..e67308004 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -127,7 +127,6 @@
NamedData,
ParameterName,
PointSelectionConfig,
- Predicate,
PredicateComposition,
ProjectionType,
RepeatMapping,
@@ -542,12 +541,19 @@ def check_fields_and_encodings(parameter: Parameter, field_name: str) -> bool:
"""
-_FieldEqualType: TypeAlias = Union[PrimitiveValue_T, Map, Parameter, SchemaBase]
-"""Permitted types for equality checks on field values:
+_FieldEqualType: TypeAlias = Union["IntoExpression", Parameter, SchemaBase]
+"""
+Permitted types for equality checks on field values.
+
+Applies to the following context(s):
+
+ import altair as alt
-- `datum.field == ...`
-- `FieldEqualPredicate(equal=...)`
-- `when(**constraints=...)`
+ alt.datum.field == ...
+ alt.FieldEqualPredicate(field="field", equal=...)
+ alt.when(field=...)
+ alt.when().then().when(field=...)
+ alt.Chart.transform_filter(field=...)
"""
@@ -2986,45 +2992,113 @@ def transform_extent(
"""
return self._add_transform(core.ExtentTransform(extent=extent, param=param))
- # TODO: Update docstring
- # # E.g. {'not': alt.FieldRangePredicate(field='year', range=[1950, 1960])}
def transform_filter(
self,
- filter: str
- | Expr
- | Expression
- | Predicate
- | Parameter
- | PredicateComposition
- | dict[str, Predicate | str | list | bool],
- **kwargs: Any,
+ predicate: Optional[_PredicateType] = Undefined,
+ *more_predicates: _ComposablePredicateType,
+ empty: Optional[bool] = Undefined,
+ **constraints: _FieldEqualType,
) -> Self:
"""
- Add a :class:`FilterTransform` to the schema.
+ Add a :class:`FilterTransform` to the spec.
+
+ The resulting predicate is an ``&`` reduction over ``predicate`` and optional ``*``, ``**``, arguments.
Parameters
----------
- filter : a filter expression or :class:`PredicateComposition`
- The `filter` property must be one of the predicate definitions:
- (1) a string or alt.expr expression
- (2) a range predicate
- (3) a selection predicate
- (4) a logical operand combining (1)-(3)
- (5) a Selection object
+ predicate
+ A selection or test predicate. ``str`` input will be treated as a test operand.
+ *more_predicates
+ Additional predicates, restricted to types supporting ``&``.
+ empty
+ For selection parameters, the predicate of empty selections returns ``True`` by default.
+ Override this behavior, with ``empty=False``.
- Returns
- -------
- self : Chart object
- returns chart to allow for chaining
+ .. note::
+ When ``predicate`` is a ``Parameter`` that is used more than once,
+ ``self.transform_filter(..., empty=...)`` provides granular control for each occurrence.
+ **constraints
+ Specify `Field Equal Predicate`_'s.
+ Shortcut for ``alt.datum.field_name == value``, see examples for usage.
+
+ Warns
+ -----
+ AltairDeprecationWarning
+ If called using ``filter`` as a keyword argument.
+
+ See Also
+ --------
+ alt.when : Uses a similar syntax for defining conditional values.
+
+ Notes
+ -----
+ - Directly inspired by the syntax used in `polars.DataFrame.filter`_.
+
+ .. _Field Equal Predicate:
+ https://vega.github.io/vega-lite/docs/predicate.html#equal-predicate
+ .. _polars.DataFrame.filter:
+ https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html
+
+ Examples
+ --------
+ Setting up a common chart::
+
+ import altair as alt
+ from altair import datum
+ from vega_datasets import data
+
+ source = data.population.url
+ chart = (
+ alt.Chart(source)
+ .mark_line()
+ .encode(
+ x="age:O",
+ y="sum(people):Q",
+ color=alt.Color("year:O").legend(symbolType="square"),
+ )
+ )
+ chart
+
+ Singular predicates can be expressed via ``datum``::
+
+ chart.transform_filter(datum.year <= 1980)
+
+ We can also use selection parameters directly::
+
+ selection = alt.selection_point(encodings=["color"], bind="legend")
+ chart.transform_filter(selection).add_params(selection)
+
+ Or a field predicate::
+
+ between_1950_60 = alt.FieldRangePredicate(field="year", range=[1950, 1960])
+ chart.transform_filter(between_1950_60) | chart.transform_filter(~between_1950_60)
+
+ Predicates can be composed together using logical operands::
+
+ chart.transform_filter(between_1950_60 | (datum.year == 1850))
+
+ Predicates passed as positional arguments will be reduced with ``&``::
+
+ chart.transform_filter(datum.year > 1980, datum.age != 90)
+
+ Using keyword-argument ``constraints`` can simplify compositions like::
+
+ verbose_composition = chart.transform_filter((datum.year == 2000) & (datum.sex == 1))
+ chart.transform_filter(year=2000, sex=1)
"""
- if isinstance(filter, Parameter):
- new_filter: dict[str, Any] = {"param": filter.name}
- if "empty" in kwargs:
- new_filter["empty"] = kwargs.pop("empty")
- elif isinstance(filter.empty, bool):
- new_filter["empty"] = filter.empty
- filter = new_filter
- return self._add_transform(core.FilterTransform(filter=filter, **kwargs))
+ if depr_filter := t.cast(Any, constraints.pop("filter", None)):
+ utils.deprecated_warn(
+ "Passing `filter` as a keyword is ambiguous.\n\n"
+ "Use a positional argument for `<5.5.0` behavior.\n"
+ "Or, `alt.datum['filter'] == ...` if referring to a column named 'filter'.",
+ version="5.5.0",
+ )
+ if utils.is_undefined(predicate):
+ predicate = depr_filter
+ else:
+ more_predicates = *more_predicates, depr_filter
+ cond = _parse_when(predicate, *more_predicates, empty=empty, **constraints)
+ return self._add_transform(core.FilterTransform(filter=cond.get("test", cond)))
def transform_flatten(
self,
diff --git a/doc/user_guide/transform/filter.rst b/doc/user_guide/transform/filter.rst
index 39c268210..62ee6e334 100644
--- a/doc/user_guide/transform/filter.rst
+++ b/doc/user_guide/transform/filter.rst
@@ -20,6 +20,8 @@ expressions and objects:
We'll show a brief example of each of these in the following sections
+.. _filter-expression:
+
Filter Expression
^^^^^^^^^^^^^^^^^
A filter expression uses the `Vega expression`_ language, either specified
@@ -189,12 +191,26 @@ Then, we can *invert* this selection using ``~``:
chart.transform_filter(~between_1950_60)
We can further refine our filter by *composing* multiple predicates together.
-In this case, using ``alt.datum``:
+In this case, using ``datum``:
+
+.. altair-plot::
+
+ chart.transform_filter(~between_1950_60 & (datum.age <= 70))
+
+When passing multiple predicates they will be reduced with ``&``:
.. altair-plot::
- chart.transform_filter(~between_1950_60 & (alt.datum.age <= 70))
+ chart.transform_filter(datum.year > 1980, datum.age != 90)
+Using keyword-argument ``constraints`` can simplify our first example in :ref:`filter-expression`:
+
+.. altair-plot::
+
+ alt.Chart(source).mark_area().encode(
+ x="age:O",
+ y="people:Q",
+ ).transform_filter(year=2000, sex=1)
Transform Options
^^^^^^^^^^^^^^^^^
diff --git a/tests/examples_arguments_syntax/line_chart_with_cumsum_faceted.py b/tests/examples_arguments_syntax/line_chart_with_cumsum_faceted.py
index 5a0fdb743..d33df06ad 100644
--- a/tests/examples_arguments_syntax/line_chart_with_cumsum_faceted.py
+++ b/tests/examples_arguments_syntax/line_chart_with_cumsum_faceted.py
@@ -12,10 +12,8 @@
columns_sorted = ['Drought', 'Epidemic', 'Earthquake', 'Flood']
alt.Chart(source).transform_filter(
- {'and': [
- alt.FieldOneOfPredicate(field='Entity', oneOf=columns_sorted), # Filter data to show only disasters in columns_sorted
- alt.FieldRangePredicate(field='Year', range=[1900, 2000]) # Filter data to show only 20th century
- ]}
+ alt.FieldOneOfPredicate(field='Entity', oneOf=columns_sorted),
+ alt.FieldRangePredicate(field='Year', range=[1900, 2000])
).transform_window(
cumulative_deaths='sum(Deaths)', groupby=['Entity'] # Calculate cumulative sum of Deaths by Entity
).mark_line().encode(
diff --git a/tests/examples_methods_syntax/line_chart_with_cumsum_faceted.py b/tests/examples_methods_syntax/line_chart_with_cumsum_faceted.py
index d9d887ba5..56dcdb931 100644
--- a/tests/examples_methods_syntax/line_chart_with_cumsum_faceted.py
+++ b/tests/examples_methods_syntax/line_chart_with_cumsum_faceted.py
@@ -12,10 +12,8 @@
columns_sorted = ['Drought', 'Epidemic', 'Earthquake', 'Flood']
alt.Chart(source).transform_filter(
- {'and': [
- alt.FieldOneOfPredicate(field='Entity', oneOf=columns_sorted), # Filter data to show only disasters in columns_sorted
- alt.FieldRangePredicate(field='Year', range=[1900, 2000]) # Filter data to show only 20th century
- ]}
+ alt.FieldOneOfPredicate(field='Entity', oneOf=columns_sorted),
+ alt.FieldRangePredicate(field='Year', range=[1900, 2000])
).transform_window(
cumulative_deaths='sum(Deaths)', groupby=['Entity'] # Calculate cumulative sum of Deaths by Entity
).mark_line().encode(
diff --git a/tests/vegalite/v5/test_api.py b/tests/vegalite/v5/test_api.py
index 0f60d185a..6bb4ac9ef 100644
--- a/tests/vegalite/v5/test_api.py
+++ b/tests/vegalite/v5/test_api.py
@@ -10,6 +10,7 @@
import re
import sys
import tempfile
+import warnings
from collections.abc import Mapping
from datetime import date, datetime
from importlib.metadata import version as importlib_version
@@ -85,7 +86,7 @@ def _make_chart_type(chart_type):
@pytest.fixture
-def basic_chart():
+def basic_chart() -> alt.Chart:
data = pd.DataFrame(
{
"a": ["A", "B", "C", "D", "E", "F", "G", "H", "I"],
@@ -1247,6 +1248,64 @@ def test_predicate_composition() -> None:
assert actual_multi == expected_multi
+def test_filter_transform_predicates(basic_chart) -> None:
+ lhs, rhs = alt.datum["b"] >= 30, alt.datum["b"] < 60
+ expected = [{"filter": lhs & rhs}]
+ actual = basic_chart.transform_filter(lhs, rhs).to_dict()["transform"]
+ assert actual == expected
+
+
+def test_filter_transform_constraints(basic_chart) -> None:
+ lhs, rhs = alt.datum["a"] == "A", alt.datum["b"] == 30
+ expected = [{"filter": lhs & rhs}]
+ actual = basic_chart.transform_filter(a="A", b=30).to_dict()["transform"]
+ assert actual == expected
+
+
+def test_filter_transform_predicates_constraints(basic_chart) -> None:
+ from functools import reduce
+ from operator import and_
+
+ predicates = (
+ alt.datum["a"] != "A",
+ alt.datum["a"] != "B",
+ alt.datum["a"] != "C",
+ alt.datum["b"] > 1,
+ alt.datum["b"] < 99,
+ )
+ constraints = {"b": 30, "a": "D"}
+ pred_constraints = *predicates, alt.datum["b"] == 30, alt.datum["a"] != "D"
+ expected = [{"filter": reduce(and_, pred_constraints)}]
+ actual = basic_chart.transform_filter(*predicates, **constraints).to_dict()[
+ "transform"
+ ]
+ assert actual == expected
+
+
+def test_filter_transform_errors(basic_chart) -> None:
+ NO_ARGS = r"At least one.+Undefined"
+ FILTER_KWARGS = r"ambiguous"
+
+ depr_filter = {"field": "year", "oneOf": [1955, 2000]}
+ expected = [{"filter": depr_filter}]
+
+ with pytest.raises(TypeError, match=NO_ARGS):
+ basic_chart.transform_filter()
+ with pytest.raises(TypeError, match=NO_ARGS):
+ basic_chart.transform_filter(empty=True)
+ with pytest.raises(TypeError, match=NO_ARGS):
+ basic_chart.transform_filter(empty=False)
+
+ with pytest.warns(alt.AltairDeprecationWarning, match=FILTER_KWARGS):
+ basic_chart.transform_filter(filter=depr_filter)
+
+ with warnings.catch_warnings():
+ warnings.filterwarnings("ignore", category=alt.AltairDeprecationWarning)
+ actual = basic_chart.transform_filter(filter=depr_filter).to_dict()["transform"]
+
+ assert actual == expected
+
+
def test_resolve_methods():
chart = alt.LayerChart().resolve_axis(x="shared", y="independent")
assert chart.resolve == alt.Resolve(
From ab3e250cf6679f22cc8f84b87721d1af0764d395 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Fri, 15 Nov 2024 14:29:12 +0000
Subject: [PATCH 19/53] refactor: Replace unconditional `typing_extensions`
imports (#3683)
---
altair/utils/_transformed_data.py | 7 ++++++-
altair/utils/data.py | 20 +++++++++++++++-----
altair/utils/display.py | 11 +++++++++--
altair/utils/mimebundle.py | 11 +++++++++--
altair/utils/plugin_registry.py | 13 +++++++++++--
5 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/altair/utils/_transformed_data.py b/altair/utils/_transformed_data.py
index a1460f2c4..06c3dfe94 100644
--- a/altair/utils/_transformed_data.py
+++ b/altair/utils/_transformed_data.py
@@ -1,7 +1,6 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any, overload
-from typing_extensions import TypeAlias
from altair import (
Chart,
@@ -31,8 +30,14 @@
from altair.utils.schemapi import Undefined
if TYPE_CHECKING:
+ import sys
from collections.abc import Iterable
+ if sys.version_info >= (3, 10):
+ from typing import TypeAlias
+ else:
+ from typing_extensions import TypeAlias
+
from altair.typing import ChartType
from altair.utils.core import DataFrameLike
diff --git a/altair/utils/data.py b/altair/utils/data.py
index 89ec31f1f..bb6868b07 100644
--- a/altair/utils/data.py
+++ b/altair/utils/data.py
@@ -12,14 +12,11 @@
Any,
Callable,
Literal,
- Protocol,
TypedDict,
TypeVar,
Union,
overload,
- runtime_checkable,
)
-from typing_extensions import Concatenate, ParamSpec, TypeAlias
import narwhals.stable.v1 as nw
from narwhals.dependencies import is_pandas_dataframe as _is_pandas_dataframe
@@ -36,11 +33,24 @@
from .plugin_registry import PluginRegistry
if sys.version_info >= (3, 13):
- from typing import TypeIs
+ from typing import Protocol, runtime_checkable
else:
- from typing_extensions import TypeIs
+ from typing_extensions import Protocol, runtime_checkable
+if sys.version_info >= (3, 10):
+ from typing import Concatenate, ParamSpec
+else:
+ from typing_extensions import Concatenate, ParamSpec
if TYPE_CHECKING:
+ if sys.version_info >= (3, 13):
+ from typing import TypeIs
+ else:
+ from typing_extensions import TypeIs
+
+ if sys.version_info >= (3, 10):
+ from typing import TypeAlias
+ else:
+ from typing_extensions import TypeAlias
import pandas as pd
import pyarrow as pa
diff --git a/altair/utils/display.py b/altair/utils/display.py
index b6d6d39f5..223417a11 100644
--- a/altair/utils/display.py
+++ b/altair/utils/display.py
@@ -4,14 +4,21 @@
import pkgutil
import textwrap
import uuid
-from typing import Any, Callable, Union
-from typing_extensions import TypeAlias
+from typing import TYPE_CHECKING, Any, Callable, Union
from ._vegafusion_data import compile_with_vegafusion, using_vegafusion
from .mimebundle import spec_to_mimebundle
from .plugin_registry import PluginEnabler, PluginRegistry
from .schemapi import validate_jsonschema
+if TYPE_CHECKING:
+ import sys
+
+ if sys.version_info >= (3, 10):
+ from typing import TypeAlias
+ else:
+ from typing_extensions import TypeAlias
+
# ==============================================================================
# Renderer registry
# ==============================================================================
diff --git a/altair/utils/mimebundle.py b/altair/utils/mimebundle.py
index 029388025..575b3f71c 100644
--- a/altair/utils/mimebundle.py
+++ b/altair/utils/mimebundle.py
@@ -1,12 +1,19 @@
from __future__ import annotations
import struct
-from typing import Any, Literal, cast, overload
-from typing_extensions import TypeAlias
+from typing import TYPE_CHECKING, Any, Literal, cast, overload
from ._importers import import_vl_convert, vl_version_for_vl_convert
from .html import spec_to_html
+if TYPE_CHECKING:
+ import sys
+
+ if sys.version_info >= (3, 10):
+ from typing import TypeAlias
+ else:
+ from typing_extensions import TypeAlias
+
MimeBundleFormat: TypeAlias = Literal[
"html", "json", "png", "svg", "pdf", "vega", "vega-lite"
]
diff --git a/altair/utils/plugin_registry.py b/altair/utils/plugin_registry.py
index b4505fd9f..81e34cb8d 100644
--- a/altair/utils/plugin_registry.py
+++ b/altair/utils/plugin_registry.py
@@ -1,12 +1,21 @@
from __future__ import annotations
+import sys
from functools import partial
from importlib.metadata import entry_points
-from typing import TYPE_CHECKING, Any, Callable, Generic, cast
-from typing_extensions import TypeAliasType, TypeIs, TypeVar
+from typing import TYPE_CHECKING, Any, Callable, Generic, TypeVar, cast
from altair.utils.deprecation import deprecated_warn
+if sys.version_info >= (3, 13):
+ from typing import TypeIs
+else:
+ from typing_extensions import TypeIs
+if sys.version_info >= (3, 12):
+ from typing import TypeAliasType
+else:
+ from typing_extensions import TypeAliasType
+
if TYPE_CHECKING:
from types import TracebackType
From a0c091eca897e1b9eaa6bb70d8ae8dc1deff9e60 Mon Sep 17 00:00:00 2001
From: Jon Mease
Date: Fri, 15 Nov 2024 11:08:35 -0500
Subject: [PATCH 20/53] feat: VegaFusion 2 will support narwhals (#3682)
---
altair/utils/_vegafusion_data.py | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/altair/utils/_vegafusion_data.py b/altair/utils/_vegafusion_data.py
index 66e3d99fb..21ca6833f 100644
--- a/altair/utils/_vegafusion_data.py
+++ b/altair/utils/_vegafusion_data.py
@@ -1,9 +1,13 @@
from __future__ import annotations
import uuid
+from importlib.metadata import version as importlib_version
from typing import TYPE_CHECKING, Any, Callable, Final, TypedDict, Union, overload
from weakref import WeakValueDictionary
+from narwhals.dependencies import is_into_dataframe
+from packaging.version import Version
+
from altair.utils._importers import import_vegafusion
from altair.utils.core import DataFrameLike
from altair.utils.data import (
@@ -15,12 +19,18 @@
from altair.vegalite.data import default_data_transformer
if TYPE_CHECKING:
+ import sys
from collections.abc import MutableMapping
from narwhals.typing import IntoDataFrame
from vegafusion.runtime import ChartState
+ if sys.version_info >= (3, 13):
+ from typing import TypeIs
+ else:
+ from typing_extensions import TypeIs
+
# Temporary storage for dataframes that have been extracted
# from charts by the vegafusion data transformer. Use a WeakValueDictionary
# rather than a dict so that the Python interpreter is free to garbage
@@ -33,6 +43,25 @@
VEGAFUSION_PREFIX: Final = "vegafusion+dataset://"
+try:
+ VEGAFUSION_VERSION: Version | None = Version(importlib_version("vegafusion"))
+except ImportError:
+ VEGAFUSION_VERSION = None
+
+
+if VEGAFUSION_VERSION and Version("2.0.0a0") <= VEGAFUSION_VERSION:
+
+ def is_supported_by_vf(data: Any) -> TypeIs[DataFrameLike]:
+ # Test whether VegaFusion supports the data type
+ # VegaFusion v2 support narwhals-compatible DataFrames
+ return isinstance(data, DataFrameLike) or is_into_dataframe(data)
+
+else:
+
+ def is_supported_by_vf(data: Any) -> TypeIs[DataFrameLike]:
+ return isinstance(data, DataFrameLike)
+
+
class _ToVegaFusionReturnUrlDict(TypedDict):
url: str
@@ -64,7 +93,8 @@ def vegafusion_data_transformer(
"""VegaFusion Data Transformer."""
if data is None:
return vegafusion_data_transformer
- elif isinstance(data, DataFrameLike) and not isinstance(data, SupportsGeoInterface):
+
+ if is_supported_by_vf(data) and not isinstance(data, SupportsGeoInterface):
table_name = f"table_{uuid.uuid4()}".replace("-", "_")
extracted_inline_tables[table_name] = data
return {"url": VEGAFUSION_PREFIX + table_name}
From 9b224f60dd45ff46be5986327030bc66d13afdc4 Mon Sep 17 00:00:00 2001
From: Mattijn van Hoek
Date: Thu, 21 Nov 2024 22:21:37 +0100
Subject: [PATCH 21/53] bump narwhals to v1.13.1 (#3690)
---
pyproject.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyproject.toml b/pyproject.toml
index bcac9e098..4890bfd13 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -20,7 +20,7 @@ dependencies = [
# If you update the minimum required jsonschema version, also update it in build.yml
"jsonschema>=3.0",
"packaging",
- "narwhals>=1.5.2"
+ "narwhals>=1.13.1"
]
description = "Vega-Altair: A declarative statistical visualization library for Python."
readme = "README.md"
From 1f4489611f01f16468a5e79672eb821432a4f80b Mon Sep 17 00:00:00 2001
From: Mattijn van Hoek
Date: Thu, 21 Nov 2024 22:35:14 +0100
Subject: [PATCH 22/53] refactor: distinct Olli renderer template (#3689)
* unique olli renderer
* reduce render_kwargs option for olli
---
altair/utils/html.py | 124 +++++++++++++++++++++++++++++++------------
1 file changed, 90 insertions(+), 34 deletions(-)
diff --git a/altair/utils/html.py b/altair/utils/html.py
index 48c79af9d..9dbd4807d 100644
--- a/altair/utils/html.py
+++ b/altair/utils/html.py
@@ -117,22 +117,12 @@
if (outputDiv.id !== "{{ output_div }}") {
outputDiv = document.getElementById("{{ output_div }}");
}
- {%- if use_olli %}
- const olliDiv = document.createElement("div");
- const vegaDiv = document.createElement("div");
- outputDiv.appendChild(vegaDiv);
- outputDiv.appendChild(olliDiv);
- outputDiv = vegaDiv;
- {%- endif %}
+
const paths = {
"vega": "{{ base_url }}/vega@{{ vega_version }}?noext",
"vega-lib": "{{ base_url }}/vega-lib?noext",
"vega-lite": "{{ base_url }}/vega-lite@{{ vegalite_version }}?noext",
"vega-embed": "{{ base_url }}/vega-embed@{{ vegaembed_version }}?noext",
- {%- if use_olli %}
- "olli": "{{ base_url }}/olli@{{ olli_version }}?noext",
- "olli-adapters": "{{ base_url }}/olli-adapters@{{ olli_adapters_version }}?noext",
- {%- endif %}
};
function maybeLoadScript(lib, version) {
@@ -157,41 +147,21 @@
throw err;
}
- function displayChart(vegaEmbed, olli, olliAdapters) {
+ function displayChart(vegaEmbed) {
vegaEmbed(outputDiv, spec, embedOpt)
.catch(err => showError(`Javascript Error: ${err.message}
This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
- {%- if use_olli %}
- olliAdapters.VegaLiteAdapter(spec).then(olliVisSpec => {
- // It's a function if it was loaded via maybeLoadScript below.
- // If it comes from require, it's a module and we access olli.olli
- const olliFunc = typeof olli === 'function' ? olli : olli.olli;
- const olliRender = olliFunc(olliVisSpec);
- olliDiv.append(olliRender);
- });
- {%- endif %}
}
if(typeof define === "function" && define.amd) {
requirejs.config({paths});
let deps = ["vega-embed"];
- {%- if use_olli %}
- deps.push("olli", "olli-adapters");
- {%- endif %}
require(deps, displayChart, err => showError(`Error loading script: ${err.message}`));
} else {
maybeLoadScript("vega", "{{vega_version}}")
.then(() => maybeLoadScript("vega-lite", "{{vegalite_version}}"))
.then(() => maybeLoadScript("vega-embed", "{{vegaembed_version}}"))
- {%- if use_olli %}
- .then(() => maybeLoadScript("olli", "{{olli_version}}"))
- .then(() => maybeLoadScript("olli-adapters", "{{olli_adapters_version}}"))
- {%- endif %}
.catch(showError)
- {%- if use_olli %}
- .then(() => displayChart(vegaEmbed, olli, OlliAdapters));
- {%- else %}
.then(() => displayChart(vegaEmbed));
- {%- endif %}
}
})({{ spec }}, {{ embed_options }});
@@ -239,11 +209,98 @@
)
+HTML_TEMPLATE_OLLI = jinja2.Template(
+ """
+
+
+
+"""
+)
+
+
TEMPLATES: dict[TemplateName, jinja2.Template] = {
"standard": HTML_TEMPLATE,
"universal": HTML_TEMPLATE_UNIVERSAL,
"inline": INLINE_HTML_TEMPLATE,
- "olli": HTML_TEMPLATE_UNIVERSAL,
+ "olli": HTML_TEMPLATE_OLLI,
}
@@ -333,7 +390,6 @@ def spec_to_html(
OLLI_ADAPTERS_VERSION = "2"
render_kwargs["olli_version"] = OLLI_VERSION
render_kwargs["olli_adapters_version"] = OLLI_ADAPTERS_VERSION
- render_kwargs["use_olli"] = True
jinja_template = TEMPLATES.get(template, template) # type: ignore[arg-type]
if not hasattr(jinja_template, "render"):
From 936c0af6f473bea113fbf162c444a8a99a571447 Mon Sep 17 00:00:00 2001
From: Mattijn van Hoek
Date: Thu, 21 Nov 2024 22:57:22 +0100
Subject: [PATCH 23/53] fix ci warning (#3691)
---
doc/user_guide/transform/pivot.rst | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/doc/user_guide/transform/pivot.rst b/doc/user_guide/transform/pivot.rst
index eb280d1e5..80f38030f 100644
--- a/doc/user_guide/transform/pivot.rst
+++ b/doc/user_guide/transform/pivot.rst
@@ -43,18 +43,18 @@ values on multiple lines:
.. altair-plot::
- import altair as alt
- from vega_datasets import data
+ import altair as alt
+ from vega_datasets import data
- source = data.stocks()
- base = alt.Chart(source).encode(x='date:T')
- columns = sorted(source.symbol.unique())
- selection = alt.selection_point(
- fields=['date'], nearest=True, on='pointerover', empty=False, clear='pointerout'
- )
+ source = data.stocks()
+ base = alt.Chart(source).encode(x='date:T')
+ columns = sorted(source.symbol.unique())
+ selection = alt.selection_point(
+ fields=['date'], nearest=True, on='pointerover', empty=False, clear='pointerout'
+ )
- lines = base.mark_line().encode(y='price:Q', color='symbol:N')
- points = lines.mark_point().transform_filter(selection)
+ lines = base.mark_line().encode(y='price:Q', color='symbol:N')
+ points = lines.mark_point().transform_filter(selection)
rule = base.transform_pivot(
'symbol', value='price', groupby=['date']
@@ -63,7 +63,7 @@ values on multiple lines:
tooltip=[alt.Tooltip(c, type='quantitative') for c in columns]
).add_params(selection)
- lines + points + rule
+ lines + points + rule
Transform Options
From c41e29e0bfa9e34d942635e574b2accfd9f2de0d Mon Sep 17 00:00:00 2001
From: Marco Edward Gorelli
Date: Fri, 22 Nov 2024 19:14:03 +0000
Subject: [PATCH 24/53] chore: Use `pass_through` instead of `strict` in
`narwhals.from_native`, use stable.v1 API more (#3693)
* chore: use `pass_through` instead of `strict` in `narwhals.from_native`, use stable.v1 API more
* unrelated(?) ruff fixes
* fixup, increase coverage
* use to_native method
* add flake8-tidy-imports rule
* take check out of loop
---
altair/_magics.py | 4 ++--
altair/utils/_vegafusion_data.py | 8 +++++---
altair/utils/core.py | 12 ++++++------
altair/utils/data.py | 21 ++++++++++-----------
altair/vegalite/v5/api.py | 2 +-
pyproject.toml | 11 ++++++++++-
tests/utils/test_schemapi.py | 2 +-
tests/vegalite/v5/test_api.py | 12 ++++++++++++
tests/vegalite/v5/test_params.py | 2 +-
tools/generate_schema_wrapper.py | 2 +-
10 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/altair/_magics.py b/altair/_magics.py
index 8f40080db..61abf51e2 100644
--- a/altair/_magics.py
+++ b/altair/_magics.py
@@ -7,8 +7,8 @@
from importlib.util import find_spec
from typing import Any
+import narwhals.stable.v1 as nw
from IPython.core import magic_arguments
-from narwhals.dependencies import is_pandas_dataframe as _is_pandas_dataframe
from altair.vegalite import v5 as vegalite_v5
@@ -32,7 +32,7 @@ def _prepare_data(data, data_transformers):
"""Convert input data to data for use within schema."""
if data is None or isinstance(data, dict):
return data
- elif _is_pandas_dataframe(data):
+ elif nw.dependencies.is_pandas_dataframe(data):
if func := data_transformers.get():
data = func(data)
return data
diff --git a/altair/utils/_vegafusion_data.py b/altair/utils/_vegafusion_data.py
index 21ca6833f..401258e8c 100644
--- a/altair/utils/_vegafusion_data.py
+++ b/altair/utils/_vegafusion_data.py
@@ -5,7 +5,7 @@
from typing import TYPE_CHECKING, Any, Callable, Final, TypedDict, Union, overload
from weakref import WeakValueDictionary
-from narwhals.dependencies import is_into_dataframe
+import narwhals.stable.v1 as nw
from packaging.version import Version
from altair.utils._importers import import_vegafusion
@@ -22,7 +22,7 @@
import sys
from collections.abc import MutableMapping
- from narwhals.typing import IntoDataFrame
+ from narwhals.stable.v1.typing import IntoDataFrame
from vegafusion.runtime import ChartState
@@ -54,7 +54,9 @@
def is_supported_by_vf(data: Any) -> TypeIs[DataFrameLike]:
# Test whether VegaFusion supports the data type
# VegaFusion v2 support narwhals-compatible DataFrames
- return isinstance(data, DataFrameLike) or is_into_dataframe(data)
+ return isinstance(data, DataFrameLike) or nw.dependencies.is_into_dataframe(
+ data
+ )
else:
diff --git a/altair/utils/core.py b/altair/utils/core.py
index 669b81a06..c675f98dc 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -16,8 +16,7 @@
import jsonschema
import narwhals.stable.v1 as nw
-from narwhals.dependencies import get_polars, is_pandas_dataframe
-from narwhals.typing import IntoDataFrame
+from narwhals.stable.v1.typing import IntoDataFrame
from altair.utils.schemapi import SchemaBase, SchemaLike, Undefined
@@ -35,7 +34,7 @@
import typing as t
import pandas as pd
- from narwhals.typing import IntoExpr
+ from narwhals.stable.v1.typing import IntoExpr
from altair.utils._dfi_types import DataFrame as DfiDataFrame
from altair.vegalite.v5.schema._typing import StandardType_T as InferredVegaLiteType
@@ -470,8 +469,9 @@ def sanitize_narwhals_dataframe(
columns: list[IntoExpr] = []
# See https://github.com/vega/altair/issues/1027 for why this is necessary.
local_iso_fmt_string = "%Y-%m-%dT%H:%M:%S"
+ is_polars_dataframe = nw.dependencies.is_polars_dataframe(data.to_native())
for name, dtype in schema.items():
- if dtype == nw.Date and nw.get_native_namespace(data) is get_polars():
+ if dtype == nw.Date and is_polars_dataframe:
# Polars doesn't allow formatting `Date` with time directives.
# The date -> datetime cast is extremely fast compared with `to_string`
columns.append(
@@ -673,8 +673,8 @@ def parse_shorthand( # noqa: C901
if schema[unescaped_field] in {
nw.Object,
nw.Unknown,
- } and is_pandas_dataframe(nw.to_native(data_nw)):
- attrs["type"] = infer_vegalite_type_for_pandas(nw.to_native(column))
+ } and nw.dependencies.is_pandas_dataframe(data_nw.to_native()):
+ attrs["type"] = infer_vegalite_type_for_pandas(column.to_native())
else:
attrs["type"] = infer_vegalite_type_for_narwhals(column)
if isinstance(attrs["type"], tuple):
diff --git a/altair/utils/data.py b/altair/utils/data.py
index bb6868b07..ca48abb79 100644
--- a/altair/utils/data.py
+++ b/altair/utils/data.py
@@ -19,8 +19,7 @@
)
import narwhals.stable.v1 as nw
-from narwhals.dependencies import is_pandas_dataframe as _is_pandas_dataframe
-from narwhals.typing import IntoDataFrame
+from narwhals.stable.v1.typing import IntoDataFrame
from ._importers import import_pyarrow_interchange
from .core import (
@@ -76,7 +75,7 @@ class SupportsGeoInterface(Protocol):
def is_data_type(obj: Any) -> TypeIs[DataType]:
return isinstance(obj, (dict, SupportsGeoInterface)) or isinstance(
- nw.from_native(obj, eager_or_interchange_only=True, strict=False),
+ nw.from_native(obj, eager_or_interchange_only=True, pass_through=True),
nw.DataFrame,
)
@@ -188,7 +187,7 @@ def sample(
if data is None:
return partial(sample, n=n, frac=frac)
check_data_type(data)
- if _is_pandas_dataframe(data):
+ if nw.dependencies.is_pandas_dataframe(data):
return data.sample(n=n, frac=frac)
elif isinstance(data, dict):
if "values" in data:
@@ -210,7 +209,7 @@ def sample(
raise ValueError(msg)
n = int(frac * len(data))
indices = random.sample(range(len(data)), n)
- return nw.to_native(data[indices])
+ return data[indices].to_native()
_FormatType = Literal["csv", "json"]
@@ -319,11 +318,11 @@ def _to_text_kwds(prefix: str, extension: str, filename: str, urlpath: str, /) -
def to_values(data: DataType) -> ToValuesReturnType:
"""Replace a DataFrame by a data model with values."""
check_data_type(data)
- # `strict=False` passes `data` through as-is if it is not a Narwhals object.
- data_native = nw.to_native(data, strict=False)
+ # `pass_through=True` passes `data` through as-is if it is not a Narwhals object.
+ data_native = nw.to_native(data, pass_through=True)
if isinstance(data_native, SupportsGeoInterface):
return {"values": _from_geo_interface(data_native)}
- elif _is_pandas_dataframe(data_native):
+ elif nw.dependencies.is_pandas_dataframe(data_native):
data_native = sanitize_pandas_dataframe(data_native)
return {"values": data_native.to_dict(orient="records")}
elif isinstance(data_native, dict):
@@ -364,7 +363,7 @@ def _from_geo_interface(data: SupportsGeoInterface | Any) -> dict[str, Any]:
- ``typing.TypeGuard``
- ``pd.DataFrame.__getattr__``
"""
- if _is_pandas_dataframe(data):
+ if nw.dependencies.is_pandas_dataframe(data):
data = sanitize_pandas_dataframe(data)
return sanitize_geo_interface(data.__geo_interface__)
@@ -374,7 +373,7 @@ def _data_to_json_string(data: DataType) -> str:
check_data_type(data)
if isinstance(data, SupportsGeoInterface):
return json.dumps(_from_geo_interface(data))
- elif _is_pandas_dataframe(data):
+ elif nw.dependencies.is_pandas_dataframe(data):
data = sanitize_pandas_dataframe(data)
return data.to_json(orient="records", double_precision=15)
elif isinstance(data, dict):
@@ -401,7 +400,7 @@ def _data_to_csv_string(data: DataType) -> str:
f"See https://github.com/vega/altair/issues/3441"
)
raise NotImplementedError(msg)
- elif _is_pandas_dataframe(data):
+ elif nw.dependencies.is_pandas_dataframe(data):
data = sanitize_pandas_dataframe(data)
return data.to_csv(index=False)
elif isinstance(data, dict):
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index e67308004..909ed621e 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -280,7 +280,7 @@ def _prepare_data(
# convert dataframes or objects with __geo_interface__ to dict
elif not isinstance(data, dict) and _is_data_type(data):
if func := data_transformers.get():
- data = func(nw.to_native(data, strict=False))
+ data = func(nw.to_native(data, pass_through=True))
# convert string input to a URLData
elif isinstance(data, str):
diff --git a/pyproject.toml b/pyproject.toml
index 4890bfd13..8871a0bf9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -34,7 +34,7 @@ keywords = [
]
requires-python = ">=3.9"
dynamic = ["version"]
-license-files = { paths = ["LICENSE"] }
+license = {file = "LICENSE"}
classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
@@ -398,6 +398,15 @@ Use `Union[T, None]` instead.
which have a similar but different semantic meaning.
See https://github.com/vega/altair/pull/3449
"""
+"narwhals.dependencies".msg = """
+Import `dependencies` from `narwhals.stable.v1` instead.
+"""
+"narwhals.typing".msg = """
+Import `typing` from `narwhals.stable.v1` instead.
+"""
+"narwhals.dtypes".msg = """
+Import `dtypes` from `narwhals.stable.v1` instead.
+"""
[tool.ruff.lint.per-file-ignores]
# Only enforce type annotation rules on public api
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index 8772f8196..72d01c0fb 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -37,7 +37,7 @@
if TYPE_CHECKING:
from collections.abc import Iterable, Sequence
- from narwhals.typing import IntoDataFrame
+ from narwhals.stable.v1.typing import IntoDataFrame
_JSON_SCHEMA_DRAFT_URL = load_schema()["$schema"]
# Make tests inherit from _TestSchema, so that when we test from_dict it won't
diff --git a/tests/vegalite/v5/test_api.py b/tests/vegalite/v5/test_api.py
index 6bb4ac9ef..390a7217f 100644
--- a/tests/vegalite/v5/test_api.py
+++ b/tests/vegalite/v5/test_api.py
@@ -1723,6 +1723,18 @@ def test_polars_with_pandas_nor_pyarrow(monkeypatch: pytest.MonkeyPatch):
assert "numpy" not in sys.modules
+def test_polars_date_32():
+ df = pl.DataFrame(
+ {"a": [1, 2, 3], "b": [date(2020, 1, 1), date(2020, 1, 2), date(2020, 1, 3)]}
+ )
+ result = alt.Chart(df).mark_line().encode(x="a", y="b").to_dict()
+ assert next(iter(result["datasets"].values())) == [
+ {"a": 1, "b": "2020-01-01T00:00:00"},
+ {"a": 2, "b": "2020-01-02T00:00:00"},
+ {"a": 3, "b": "2020-01-03T00:00:00"},
+ ]
+
+
@skip_requires_pyarrow(requires_tzdata=True)
def test_interchange_with_date_32():
# Test that objects which Narwhals only supports at the interchange
diff --git a/tests/vegalite/v5/test_params.py b/tests/vegalite/v5/test_params.py
index d380586a8..dd79e9ce5 100644
--- a/tests/vegalite/v5/test_params.py
+++ b/tests/vegalite/v5/test_params.py
@@ -107,7 +107,7 @@ def test_parameter_naming():
# test automatic naming which has the form such as param_5
prm0, prm1, prm2 = (alt.param() for _ in range(3))
- res = re.match("param_([0-9]+)", prm0.param.name)
+ res = re.match(r"param_([0-9]+)", prm0.param.name)
assert res
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index e024c2ca1..e0e7a4d54 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -751,7 +751,7 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> ModuleDef[str]:
"from typing import Any, Literal, Union, Protocol, Sequence, List, Iterator, TYPE_CHECKING",
"import pkgutil",
"import json\n",
- "from narwhals.dependencies import is_pandas_dataframe as _is_pandas_dataframe",
+ "import narwhals.stable.v1 as nw\n",
"from altair.utils.schemapi import SchemaBase, Undefined, UndefinedType, _subclasses # noqa: F401\n",
import_type_checking(
"from datetime import date, datetime",
From c6920cc3e23ce79e019a71e4a5eec922aae01aa2 Mon Sep 17 00:00:00 2001
From: Mattijn van Hoek
Date: Sat, 23 Nov 2024 13:41:13 +0100
Subject: [PATCH 25/53] simplify deprecation message (#3695)
---
altair/__init__.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/altair/__init__.py b/altair/__init__.py
index cbc2c3b52..279cfec67 100644
--- a/altair/__init__.py
+++ b/altair/__init__.py
@@ -678,8 +678,10 @@ def __getattr__(name: str):
" alt.themes.enable('theme_name')\n\n"
" # Updated\n"
" @alt.theme.register('theme_name', enable=True)\n"
- " def custom_theme() -> alt.theme.ThemeConfig:\n"
- " return {'height': 400, 'width': 700}\n\n"
+ " def custom_theme():\n"
+ " return alt.theme.ThemeConfig(\n"
+ " {'height': 400, 'width': 700}\n"
+ " )\n\n"
"See the updated User Guide for further details:\n"
" https://altair-viz.github.io/user_guide/api.html#theme\n"
" https://altair-viz.github.io/user_guide/customization.html#chart-themes",
From 17aeb2c837717b04563d06e2c326276ef6e7746d Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Sat, 23 Nov 2024 15:16:25 +0000
Subject: [PATCH 26/53] fix: Add missing top-level `"config"` keys in
`vega-themes.json` (#3696)
---
altair/vegalite/v5/schema/vega-themes.json | 2220 ++++++++++----------
tests/vegalite/v5/test_theme.py | 86 +-
tools/generate_schema_wrapper.py | 8 +-
3 files changed, 1214 insertions(+), 1100 deletions(-)
diff --git a/altair/vegalite/v5/schema/vega-themes.json b/altair/vegalite/v5/schema/vega-themes.json
index 10ad14d5d..188a86f8b 100644
--- a/altair/vegalite/v5/schema/vega-themes.json
+++ b/altair/vegalite/v5/schema/vega-themes.json
@@ -1,1159 +1,1187 @@
{
"carbong10": {
- "arc": {
- "fill": "#6929c4"
- },
- "area": {
- "fill": "#6929c4"
- },
- "axis": {
- "grid": true,
- "gridColor": "#e0e0e0",
- "labelAngle": 0,
- "labelColor": "#525252",
- "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
- "labelFontSize": 12,
- "labelFontWeight": 400,
- "titleColor": "#161616",
- "titleFontSize": 12,
- "titleFontWeight": 600
- },
- "axisX": {
- "titlePadding": 10
- },
- "axisY": {
- "titlePadding": 2.5
- },
- "background": "#f4f4f4",
- "circle": {
- "fill": "#6929c4"
- },
- "range": {
- "category": [
- "#6929c4",
- "#1192e8",
- "#005d5d",
- "#9f1853",
- "#fa4d56",
- "#570408",
- "#198038",
- "#002d9c",
- "#ee538b",
- "#b28600",
- "#009d9a",
- "#012749",
- "#8a3800",
- "#a56eff"
- ],
- "diverging": [
- "#750e13",
- "#a2191f",
- "#da1e28",
- "#fa4d56",
- "#ff8389",
- "#ffb3b8",
- "#ffd7d9",
- "#fff1f1",
- "#e5f6ff",
- "#bae6ff",
- "#82cfff",
- "#33b1ff",
- "#1192e8",
- "#0072c3",
- "#00539a",
- "#003a6d"
- ],
- "heatmap": [
- "#f6f2ff",
- "#e8daff",
- "#d4bbff",
- "#be95ff",
- "#a56eff",
- "#8a3ffc",
- "#6929c4",
- "#491d8b",
- "#31135e",
- "#1c0f30"
- ]
- },
- "rect": {
- "fill": "#6929c4"
- },
- "style": {
- "guide-label": {
- "fill": "#525252",
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "config": {
+ "arc": {
+ "fill": "#6929c4"
+ },
+ "area": {
+ "fill": "#6929c4"
+ },
+ "axis": {
+ "grid": true,
+ "gridColor": "#e0e0e0",
+ "labelAngle": 0,
+ "labelColor": "#525252",
+ "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
+ "labelFontSize": 12,
+ "labelFontWeight": 400,
+ "titleColor": "#161616",
+ "titleFontSize": 12,
+ "titleFontWeight": 600
+ },
+ "axisX": {
+ "titlePadding": 10
+ },
+ "axisY": {
+ "titlePadding": 2.5
},
- "guide-title": {
- "fill": "#525252",
+ "background": "#f4f4f4",
+ "circle": {
+ "fill": "#6929c4"
+ },
+ "range": {
+ "category": [
+ "#6929c4",
+ "#1192e8",
+ "#005d5d",
+ "#9f1853",
+ "#fa4d56",
+ "#570408",
+ "#198038",
+ "#002d9c",
+ "#ee538b",
+ "#b28600",
+ "#009d9a",
+ "#012749",
+ "#8a3800",
+ "#a56eff"
+ ],
+ "diverging": [
+ "#750e13",
+ "#a2191f",
+ "#da1e28",
+ "#fa4d56",
+ "#ff8389",
+ "#ffb3b8",
+ "#ffd7d9",
+ "#fff1f1",
+ "#e5f6ff",
+ "#bae6ff",
+ "#82cfff",
+ "#33b1ff",
+ "#1192e8",
+ "#0072c3",
+ "#00539a",
+ "#003a6d"
+ ],
+ "heatmap": [
+ "#f6f2ff",
+ "#e8daff",
+ "#d4bbff",
+ "#be95ff",
+ "#a56eff",
+ "#8a3ffc",
+ "#6929c4",
+ "#491d8b",
+ "#31135e",
+ "#1c0f30"
+ ]
+ },
+ "rect": {
+ "fill": "#6929c4"
+ },
+ "style": {
+ "guide-label": {
+ "fill": "#525252",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ },
+ "guide-title": {
+ "fill": "#525252",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ }
+ },
+ "title": {
+ "anchor": "start",
+ "color": "#161616",
+ "dy": -15,
"font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "fontSize": 16,
+ "fontWeight": 600
+ },
+ "view": {
+ "fill": "#ffffff",
+ "stroke": "#ffffff"
}
- },
- "title": {
- "anchor": "start",
- "color": "#161616",
- "dy": -15,
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontSize": 16,
- "fontWeight": 600
- },
- "view": {
- "fill": "#ffffff",
- "stroke": "#ffffff"
}
},
"carbong100": {
- "arc": {
- "fill": "#d4bbff"
- },
- "area": {
- "fill": "#d4bbff"
- },
- "axis": {
- "grid": true,
- "gridColor": "#393939",
- "labelAngle": 0,
- "labelColor": "#c6c6c6",
- "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
- "labelFontSize": 12,
- "labelFontWeight": 400,
- "titleColor": "#f4f4f4",
- "titleFontSize": 12,
- "titleFontWeight": 600
- },
- "axisX": {
- "titlePadding": 10
- },
- "axisY": {
- "titlePadding": 2.5
- },
- "background": "#161616",
- "circle": {
- "fill": "#d4bbff"
- },
- "range": {
- "category": [
- "#8a3ffc",
- "#33b1ff",
- "#007d79",
- "#ff7eb6",
- "#fa4d56",
- "#fff1f1",
- "#6fdc8c",
- "#4589ff",
- "#d12771",
- "#d2a106",
- "#08bdba",
- "#bae6ff",
- "#ba4e00",
- "#d4bbff"
- ],
- "diverging": [
- "#750e13",
- "#a2191f",
- "#da1e28",
- "#fa4d56",
- "#ff8389",
- "#ffb3b8",
- "#ffd7d9",
- "#fff1f1",
- "#e5f6ff",
- "#bae6ff",
- "#82cfff",
- "#33b1ff",
- "#1192e8",
- "#0072c3",
- "#00539a",
- "#003a6d"
- ],
- "heatmap": [
- "#f6f2ff",
- "#e8daff",
- "#d4bbff",
- "#be95ff",
- "#a56eff",
- "#8a3ffc",
- "#6929c4",
- "#491d8b",
- "#31135e",
- "#1c0f30"
- ]
- },
- "rect": {
- "fill": "#d4bbff"
- },
- "style": {
- "guide-label": {
- "fill": "#c6c6c6",
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "config": {
+ "arc": {
+ "fill": "#d4bbff"
+ },
+ "area": {
+ "fill": "#d4bbff"
+ },
+ "axis": {
+ "grid": true,
+ "gridColor": "#393939",
+ "labelAngle": 0,
+ "labelColor": "#c6c6c6",
+ "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
+ "labelFontSize": 12,
+ "labelFontWeight": 400,
+ "titleColor": "#f4f4f4",
+ "titleFontSize": 12,
+ "titleFontWeight": 600
+ },
+ "axisX": {
+ "titlePadding": 10
+ },
+ "axisY": {
+ "titlePadding": 2.5
+ },
+ "background": "#161616",
+ "circle": {
+ "fill": "#d4bbff"
+ },
+ "range": {
+ "category": [
+ "#8a3ffc",
+ "#33b1ff",
+ "#007d79",
+ "#ff7eb6",
+ "#fa4d56",
+ "#fff1f1",
+ "#6fdc8c",
+ "#4589ff",
+ "#d12771",
+ "#d2a106",
+ "#08bdba",
+ "#bae6ff",
+ "#ba4e00",
+ "#d4bbff"
+ ],
+ "diverging": [
+ "#750e13",
+ "#a2191f",
+ "#da1e28",
+ "#fa4d56",
+ "#ff8389",
+ "#ffb3b8",
+ "#ffd7d9",
+ "#fff1f1",
+ "#e5f6ff",
+ "#bae6ff",
+ "#82cfff",
+ "#33b1ff",
+ "#1192e8",
+ "#0072c3",
+ "#00539a",
+ "#003a6d"
+ ],
+ "heatmap": [
+ "#f6f2ff",
+ "#e8daff",
+ "#d4bbff",
+ "#be95ff",
+ "#a56eff",
+ "#8a3ffc",
+ "#6929c4",
+ "#491d8b",
+ "#31135e",
+ "#1c0f30"
+ ]
+ },
+ "rect": {
+ "fill": "#d4bbff"
+ },
+ "style": {
+ "guide-label": {
+ "fill": "#c6c6c6",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ },
+ "guide-title": {
+ "fill": "#c6c6c6",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ }
},
- "guide-title": {
- "fill": "#c6c6c6",
+ "title": {
+ "anchor": "start",
+ "color": "#f4f4f4",
+ "dy": -15,
"font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "fontSize": 16,
+ "fontWeight": 600
+ },
+ "view": {
+ "fill": "#161616",
+ "stroke": "#161616"
}
- },
- "title": {
- "anchor": "start",
- "color": "#f4f4f4",
- "dy": -15,
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontSize": 16,
- "fontWeight": 600
- },
- "view": {
- "fill": "#161616",
- "stroke": "#161616"
}
},
"carbong90": {
- "arc": {
- "fill": "#d4bbff"
- },
- "area": {
- "fill": "#d4bbff"
- },
- "axis": {
- "grid": true,
- "gridColor": "#525252",
- "labelAngle": 0,
- "labelColor": "#c6c6c6",
- "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
- "labelFontSize": 12,
- "labelFontWeight": 400,
- "titleColor": "#f4f4f4",
- "titleFontSize": 12,
- "titleFontWeight": 600
- },
- "axisX": {
- "titlePadding": 10
- },
- "axisY": {
- "titlePadding": 2.5
- },
- "background": "#262626",
- "circle": {
- "fill": "#d4bbff"
- },
- "range": {
- "category": [
- "#8a3ffc",
- "#33b1ff",
- "#007d79",
- "#ff7eb6",
- "#fa4d56",
- "#fff1f1",
- "#6fdc8c",
- "#4589ff",
- "#d12771",
- "#d2a106",
- "#08bdba",
- "#bae6ff",
- "#ba4e00",
- "#d4bbff"
- ],
- "diverging": [
- "#750e13",
- "#a2191f",
- "#da1e28",
- "#fa4d56",
- "#ff8389",
- "#ffb3b8",
- "#ffd7d9",
- "#fff1f1",
- "#e5f6ff",
- "#bae6ff",
- "#82cfff",
- "#33b1ff",
- "#1192e8",
- "#0072c3",
- "#00539a",
- "#003a6d"
- ],
- "heatmap": [
- "#f6f2ff",
- "#e8daff",
- "#d4bbff",
- "#be95ff",
- "#a56eff",
- "#8a3ffc",
- "#6929c4",
- "#491d8b",
- "#31135e",
- "#1c0f30"
- ]
- },
- "rect": {
- "fill": "#d4bbff"
- },
- "style": {
- "guide-label": {
- "fill": "#c6c6c6",
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "config": {
+ "arc": {
+ "fill": "#d4bbff"
+ },
+ "area": {
+ "fill": "#d4bbff"
+ },
+ "axis": {
+ "grid": true,
+ "gridColor": "#525252",
+ "labelAngle": 0,
+ "labelColor": "#c6c6c6",
+ "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
+ "labelFontSize": 12,
+ "labelFontWeight": 400,
+ "titleColor": "#f4f4f4",
+ "titleFontSize": 12,
+ "titleFontWeight": 600
+ },
+ "axisX": {
+ "titlePadding": 10
+ },
+ "axisY": {
+ "titlePadding": 2.5
+ },
+ "background": "#262626",
+ "circle": {
+ "fill": "#d4bbff"
+ },
+ "range": {
+ "category": [
+ "#8a3ffc",
+ "#33b1ff",
+ "#007d79",
+ "#ff7eb6",
+ "#fa4d56",
+ "#fff1f1",
+ "#6fdc8c",
+ "#4589ff",
+ "#d12771",
+ "#d2a106",
+ "#08bdba",
+ "#bae6ff",
+ "#ba4e00",
+ "#d4bbff"
+ ],
+ "diverging": [
+ "#750e13",
+ "#a2191f",
+ "#da1e28",
+ "#fa4d56",
+ "#ff8389",
+ "#ffb3b8",
+ "#ffd7d9",
+ "#fff1f1",
+ "#e5f6ff",
+ "#bae6ff",
+ "#82cfff",
+ "#33b1ff",
+ "#1192e8",
+ "#0072c3",
+ "#00539a",
+ "#003a6d"
+ ],
+ "heatmap": [
+ "#f6f2ff",
+ "#e8daff",
+ "#d4bbff",
+ "#be95ff",
+ "#a56eff",
+ "#8a3ffc",
+ "#6929c4",
+ "#491d8b",
+ "#31135e",
+ "#1c0f30"
+ ]
+ },
+ "rect": {
+ "fill": "#d4bbff"
},
- "guide-title": {
- "fill": "#c6c6c6",
+ "style": {
+ "guide-label": {
+ "fill": "#c6c6c6",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ },
+ "guide-title": {
+ "fill": "#c6c6c6",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ }
+ },
+ "title": {
+ "anchor": "start",
+ "color": "#f4f4f4",
+ "dy": -15,
"font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "fontSize": 16,
+ "fontWeight": 600
+ },
+ "view": {
+ "fill": "#161616",
+ "stroke": "#161616"
}
- },
- "title": {
- "anchor": "start",
- "color": "#f4f4f4",
- "dy": -15,
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontSize": 16,
- "fontWeight": 600
- },
- "view": {
- "fill": "#161616",
- "stroke": "#161616"
}
},
"carbonwhite": {
- "arc": {
- "fill": "#6929c4"
- },
- "area": {
- "fill": "#6929c4"
- },
- "axis": {
- "grid": true,
- "gridColor": "#e0e0e0",
- "labelAngle": 0,
- "labelColor": "#525252",
- "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
- "labelFontSize": 12,
- "labelFontWeight": 400,
- "titleColor": "#161616",
- "titleFontSize": 12,
- "titleFontWeight": 600
- },
- "axisX": {
- "titlePadding": 10
- },
- "axisY": {
- "titlePadding": 2.5
- },
- "background": "#ffffff",
- "circle": {
- "fill": "#6929c4"
- },
- "range": {
- "category": [
- "#6929c4",
- "#1192e8",
- "#005d5d",
- "#9f1853",
- "#fa4d56",
- "#570408",
- "#198038",
- "#002d9c",
- "#ee538b",
- "#b28600",
- "#009d9a",
- "#012749",
- "#8a3800",
- "#a56eff"
- ],
- "diverging": [
- "#750e13",
- "#a2191f",
- "#da1e28",
- "#fa4d56",
- "#ff8389",
- "#ffb3b8",
- "#ffd7d9",
- "#fff1f1",
- "#e5f6ff",
- "#bae6ff",
- "#82cfff",
- "#33b1ff",
- "#1192e8",
- "#0072c3",
- "#00539a",
- "#003a6d"
- ],
- "heatmap": [
- "#f6f2ff",
- "#e8daff",
- "#d4bbff",
- "#be95ff",
- "#a56eff",
- "#8a3ffc",
- "#6929c4",
- "#491d8b",
- "#31135e",
- "#1c0f30"
- ]
- },
- "rect": {
- "fill": "#6929c4"
- },
- "style": {
- "guide-label": {
- "fill": "#525252",
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "config": {
+ "arc": {
+ "fill": "#6929c4"
+ },
+ "area": {
+ "fill": "#6929c4"
+ },
+ "axis": {
+ "grid": true,
+ "gridColor": "#e0e0e0",
+ "labelAngle": 0,
+ "labelColor": "#525252",
+ "labelFont": "IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, \".SFNSText-Regular\", sans-serif",
+ "labelFontSize": 12,
+ "labelFontWeight": 400,
+ "titleColor": "#161616",
+ "titleFontSize": 12,
+ "titleFontWeight": 600
+ },
+ "axisX": {
+ "titlePadding": 10
+ },
+ "axisY": {
+ "titlePadding": 2.5
+ },
+ "background": "#ffffff",
+ "circle": {
+ "fill": "#6929c4"
+ },
+ "range": {
+ "category": [
+ "#6929c4",
+ "#1192e8",
+ "#005d5d",
+ "#9f1853",
+ "#fa4d56",
+ "#570408",
+ "#198038",
+ "#002d9c",
+ "#ee538b",
+ "#b28600",
+ "#009d9a",
+ "#012749",
+ "#8a3800",
+ "#a56eff"
+ ],
+ "diverging": [
+ "#750e13",
+ "#a2191f",
+ "#da1e28",
+ "#fa4d56",
+ "#ff8389",
+ "#ffb3b8",
+ "#ffd7d9",
+ "#fff1f1",
+ "#e5f6ff",
+ "#bae6ff",
+ "#82cfff",
+ "#33b1ff",
+ "#1192e8",
+ "#0072c3",
+ "#00539a",
+ "#003a6d"
+ ],
+ "heatmap": [
+ "#f6f2ff",
+ "#e8daff",
+ "#d4bbff",
+ "#be95ff",
+ "#a56eff",
+ "#8a3ffc",
+ "#6929c4",
+ "#491d8b",
+ "#31135e",
+ "#1c0f30"
+ ]
},
- "guide-title": {
- "fill": "#525252",
+ "rect": {
+ "fill": "#6929c4"
+ },
+ "style": {
+ "guide-label": {
+ "fill": "#525252",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ },
+ "guide-title": {
+ "fill": "#525252",
+ "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
+ "fontWeight": 400
+ }
+ },
+ "title": {
+ "anchor": "start",
+ "color": "#161616",
+ "dy": -15,
"font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontWeight": 400
+ "fontSize": 16,
+ "fontWeight": 600
+ },
+ "view": {
+ "fill": "#ffffff",
+ "stroke": "#ffffff"
}
- },
- "title": {
- "anchor": "start",
- "color": "#161616",
- "dy": -15,
- "font": "IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,\".sfnstext-regular\",sans-serif",
- "fontSize": 16,
- "fontWeight": 600
- },
- "view": {
- "fill": "#ffffff",
- "stroke": "#ffffff"
}
},
"dark": {
- "axis": {
- "domainColor": "#fff",
- "gridColor": "#888",
- "tickColor": "#fff"
- },
- "background": "#333",
- "style": {
- "guide-label": {
- "fill": "#fff"
- },
- "guide-title": {
- "fill": "#fff"
+ "config": {
+ "axis": {
+ "domainColor": "#fff",
+ "gridColor": "#888",
+ "tickColor": "#fff"
+ },
+ "background": "#333",
+ "style": {
+ "guide-label": {
+ "fill": "#fff"
+ },
+ "guide-title": {
+ "fill": "#fff"
+ }
+ },
+ "title": {
+ "color": "#fff",
+ "subtitleColor": "#fff"
+ },
+ "view": {
+ "stroke": "#888"
}
- },
- "title": {
- "color": "#fff",
- "subtitleColor": "#fff"
- },
- "view": {
- "stroke": "#888"
}
},
"excel": {
- "arc": {
- "fill": "#4572a7"
- },
- "area": {
- "fill": "#4572a7"
- },
- "axis": {
- "bandPosition": 0.5,
- "grid": true,
- "gridColor": "#000000",
- "gridOpacity": 1,
- "gridWidth": 0.5,
- "labelPadding": 10,
- "tickSize": 5,
- "tickWidth": 0.5
- },
- "axisBand": {
- "grid": false,
- "tickExtra": true
- },
- "background": "#fff",
- "legend": {
- "labelBaseline": "middle",
- "labelFontSize": 11,
- "symbolSize": 50,
- "symbolType": "square"
- },
- "line": {
- "stroke": "#4572a7",
- "strokeWidth": 2
- },
- "range": {
- "category": [
- "#4572a7",
- "#aa4643",
- "#8aa453",
- "#71598e",
- "#4598ae",
- "#d98445",
- "#94aace",
- "#d09393",
- "#b9cc98",
- "#a99cbc"
- ]
- },
- "rect": {
- "fill": "#4572a7"
+ "config": {
+ "arc": {
+ "fill": "#4572a7"
+ },
+ "area": {
+ "fill": "#4572a7"
+ },
+ "axis": {
+ "bandPosition": 0.5,
+ "grid": true,
+ "gridColor": "#000000",
+ "gridOpacity": 1,
+ "gridWidth": 0.5,
+ "labelPadding": 10,
+ "tickSize": 5,
+ "tickWidth": 0.5
+ },
+ "axisBand": {
+ "grid": false,
+ "tickExtra": true
+ },
+ "background": "#fff",
+ "legend": {
+ "labelBaseline": "middle",
+ "labelFontSize": 11,
+ "symbolSize": 50,
+ "symbolType": "square"
+ },
+ "line": {
+ "stroke": "#4572a7",
+ "strokeWidth": 2
+ },
+ "range": {
+ "category": [
+ "#4572a7",
+ "#aa4643",
+ "#8aa453",
+ "#71598e",
+ "#4598ae",
+ "#d98445",
+ "#94aace",
+ "#d09393",
+ "#b9cc98",
+ "#a99cbc"
+ ]
+ },
+ "rect": {
+ "fill": "#4572a7"
+ }
}
},
"fivethirtyeight": {
- "arc": {
- "fill": "#30a2da"
- },
- "area": {
- "fill": "#30a2da"
- },
- "axis": {
- "domainColor": "#cbcbcb",
- "grid": true,
- "gridColor": "#cbcbcb",
- "gridWidth": 1,
- "labelColor": "#999",
- "labelFontSize": 10,
- "labelPadding": 4,
- "tickColor": "#cbcbcb",
- "tickSize": 10,
- "titleColor": "#333",
- "titleFontSize": 14,
- "titlePadding": 10
- },
- "axisBand": {
- "grid": false
- },
- "background": "#f0f0f0",
- "bar": {
- "binSpacing": 2,
- "fill": "#30a2da",
- "stroke": null
- },
- "legend": {
- "labelColor": "#333",
- "labelFontSize": 11,
- "padding": 1,
- "symbolSize": 30,
- "symbolType": "square",
- "titleColor": "#333",
- "titleFontSize": 14,
- "titlePadding": 10
- },
- "line": {
- "stroke": "#30a2da",
- "strokeWidth": 2
- },
- "point": {
- "filled": true,
- "shape": "circle"
- },
- "range": {
- "category": [
- "#30a2da",
- "#fc4f30",
- "#e5ae38",
- "#6d904f",
- "#8b8b8b",
- "#b96db8",
- "#ff9e27",
- "#56cc60",
- "#52d2ca",
- "#52689e",
- "#545454",
- "#9fe4f8"
- ],
- "diverging": [
- "#cc0020",
- "#e77866",
- "#f6e7e1",
- "#d6e8ed",
- "#91bfd9",
- "#1d78b5"
- ],
- "heatmap": [
- "#d6e8ed",
- "#cee0e5",
- "#91bfd9",
- "#549cc6",
- "#1d78b5"
- ]
- },
- "rect": {
- "fill": "#30a2da"
- },
- "title": {
- "anchor": "start",
- "fontSize": 24,
- "fontWeight": 600,
- "offset": 20
+ "config": {
+ "arc": {
+ "fill": "#30a2da"
+ },
+ "area": {
+ "fill": "#30a2da"
+ },
+ "axis": {
+ "domainColor": "#cbcbcb",
+ "grid": true,
+ "gridColor": "#cbcbcb",
+ "gridWidth": 1,
+ "labelColor": "#999",
+ "labelFontSize": 10,
+ "labelPadding": 4,
+ "tickColor": "#cbcbcb",
+ "tickSize": 10,
+ "titleColor": "#333",
+ "titleFontSize": 14,
+ "titlePadding": 10
+ },
+ "axisBand": {
+ "grid": false
+ },
+ "background": "#f0f0f0",
+ "bar": {
+ "binSpacing": 2,
+ "fill": "#30a2da",
+ "stroke": null
+ },
+ "legend": {
+ "labelColor": "#333",
+ "labelFontSize": 11,
+ "padding": 1,
+ "symbolSize": 30,
+ "symbolType": "square",
+ "titleColor": "#333",
+ "titleFontSize": 14,
+ "titlePadding": 10
+ },
+ "line": {
+ "stroke": "#30a2da",
+ "strokeWidth": 2
+ },
+ "point": {
+ "filled": true,
+ "shape": "circle"
+ },
+ "range": {
+ "category": [
+ "#30a2da",
+ "#fc4f30",
+ "#e5ae38",
+ "#6d904f",
+ "#8b8b8b",
+ "#b96db8",
+ "#ff9e27",
+ "#56cc60",
+ "#52d2ca",
+ "#52689e",
+ "#545454",
+ "#9fe4f8"
+ ],
+ "diverging": [
+ "#cc0020",
+ "#e77866",
+ "#f6e7e1",
+ "#d6e8ed",
+ "#91bfd9",
+ "#1d78b5"
+ ],
+ "heatmap": [
+ "#d6e8ed",
+ "#cee0e5",
+ "#91bfd9",
+ "#549cc6",
+ "#1d78b5"
+ ]
+ },
+ "rect": {
+ "fill": "#30a2da"
+ },
+ "title": {
+ "anchor": "start",
+ "fontSize": 24,
+ "fontWeight": 600,
+ "offset": 20
+ }
}
},
"ggplot2": {
- "arc": {
- "fill": "#000"
- },
- "area": {
- "fill": "#000"
- },
- "axis": {
- "domain": false,
- "grid": true,
- "gridColor": "#FFFFFF",
- "gridOpacity": 1,
- "labelColor": "#7F7F7F",
- "labelPadding": 4,
- "tickColor": "#7F7F7F",
- "tickSize": 5.67,
- "titleFontSize": 16,
- "titleFontWeight": "normal"
- },
- "legend": {
- "labelBaseline": "middle",
- "labelFontSize": 11,
- "symbolSize": 40
- },
- "line": {
- "stroke": "#000"
- },
- "range": {
- "category": [
- "#000000",
- "#7F7F7F",
- "#1A1A1A",
- "#999999",
- "#333333",
- "#B0B0B0",
- "#4D4D4D",
- "#C9C9C9",
- "#666666",
- "#DCDCDC"
- ]
- },
- "rect": {
- "fill": "#000"
+ "config": {
+ "arc": {
+ "fill": "#000"
+ },
+ "area": {
+ "fill": "#000"
+ },
+ "axis": {
+ "domain": false,
+ "grid": true,
+ "gridColor": "#FFFFFF",
+ "gridOpacity": 1,
+ "labelColor": "#7F7F7F",
+ "labelPadding": 4,
+ "tickColor": "#7F7F7F",
+ "tickSize": 5.67,
+ "titleFontSize": 16,
+ "titleFontWeight": "normal"
+ },
+ "legend": {
+ "labelBaseline": "middle",
+ "labelFontSize": 11,
+ "symbolSize": 40
+ },
+ "line": {
+ "stroke": "#000"
+ },
+ "range": {
+ "category": [
+ "#000000",
+ "#7F7F7F",
+ "#1A1A1A",
+ "#999999",
+ "#333333",
+ "#B0B0B0",
+ "#4D4D4D",
+ "#C9C9C9",
+ "#666666",
+ "#DCDCDC"
+ ]
+ },
+ "rect": {
+ "fill": "#000"
+ }
}
},
"googlecharts": {
- "arc": {
- "fill": "#3366CC"
- },
- "area": {
- "fill": "#3366CC"
- },
- "axis": {
- "domain": false,
- "grid": true,
- "gridColor": "#ccc",
- "tickColor": "#ccc"
- },
- "background": "#fff",
- "circle": {
- "fill": "#3366CC"
- },
- "padding": {
- "bottom": 10,
- "left": 10,
- "right": 10,
- "top": 10
- },
- "range": {
- "category": [
- "#4285F4",
- "#DB4437",
- "#F4B400",
- "#0F9D58",
- "#AB47BC",
- "#00ACC1",
- "#FF7043",
- "#9E9D24",
- "#5C6BC0",
- "#F06292",
- "#00796B",
- "#C2185B"
- ],
- "heatmap": [
- "#c6dafc",
- "#5e97f6",
- "#2a56c6"
- ]
- },
- "rect": {
- "fill": "#3366CC"
- },
- "style": {
- "group-title": {
- "font": "Arial, sans-serif",
- "fontSize": 12
+ "config": {
+ "arc": {
+ "fill": "#3366CC"
},
- "guide-label": {
- "font": "Arial, sans-serif",
- "fontSize": 12
+ "area": {
+ "fill": "#3366CC"
+ },
+ "axis": {
+ "domain": false,
+ "grid": true,
+ "gridColor": "#ccc",
+ "tickColor": "#ccc"
+ },
+ "background": "#fff",
+ "circle": {
+ "fill": "#3366CC"
+ },
+ "padding": {
+ "bottom": 10,
+ "left": 10,
+ "right": 10,
+ "top": 10
},
- "guide-title": {
+ "range": {
+ "category": [
+ "#4285F4",
+ "#DB4437",
+ "#F4B400",
+ "#0F9D58",
+ "#AB47BC",
+ "#00ACC1",
+ "#FF7043",
+ "#9E9D24",
+ "#5C6BC0",
+ "#F06292",
+ "#00796B",
+ "#C2185B"
+ ],
+ "heatmap": [
+ "#c6dafc",
+ "#5e97f6",
+ "#2a56c6"
+ ]
+ },
+ "rect": {
+ "fill": "#3366CC"
+ },
+ "style": {
+ "group-title": {
+ "font": "Arial, sans-serif",
+ "fontSize": 12
+ },
+ "guide-label": {
+ "font": "Arial, sans-serif",
+ "fontSize": 12
+ },
+ "guide-title": {
+ "font": "Arial, sans-serif",
+ "fontSize": 12
+ }
+ },
+ "title": {
+ "anchor": "start",
+ "dy": -3,
"font": "Arial, sans-serif",
- "fontSize": 12
+ "fontSize": 14,
+ "fontWeight": "bold"
}
- },
- "title": {
- "anchor": "start",
- "dy": -3,
- "font": "Arial, sans-serif",
- "fontSize": 14,
- "fontWeight": "bold"
}
},
"latimes": {
- "arc": {
- "fill": "#82c6df"
- },
- "area": {
- "fill": "#82c6df"
- },
- "axis": {
- "labelFont": "Benton Gothic, sans-serif",
- "labelFontSize": 11.5,
- "labelFontWeight": "normal",
- "titleFont": "Benton Gothic Bold, sans-serif",
- "titleFontSize": 13,
- "titleFontWeight": "normal"
- },
- "axisX": {
- "labelAngle": 0,
- "labelPadding": 4,
- "tickSize": 3
- },
- "axisY": {
- "labelBaseline": "middle",
- "maxExtent": 45,
- "minExtent": 45,
- "tickSize": 2,
- "titleAlign": "left",
- "titleAngle": 0,
- "titleX": -45,
- "titleY": -11
- },
- "background": "#ffffff",
- "legend": {
- "labelFont": "Benton Gothic, sans-serif",
- "labelFontSize": 11.5,
- "symbolType": "square",
- "titleFont": "Benton Gothic Bold, sans-serif",
- "titleFontSize": 13,
- "titleFontWeight": "normal"
- },
- "line": {
- "stroke": "#82c6df",
- "strokeWidth": 2
- },
- "range": {
- "category": [
- "#ec8431",
- "#829eb1",
- "#c89d29",
- "#3580b1",
- "#adc839",
- "#ab7fb4"
- ],
- "diverging": [
- "#e68a4f",
- "#f4bb6a",
- "#f9e39c",
- "#dadfe2",
- "#a6b7c6",
- "#849eae"
- ],
- "heatmap": [
- "#fbf2c7",
- "#f9e39c",
- "#f8d36e",
- "#f4bb6a",
- "#e68a4f",
- "#d15a40",
- "#ab4232"
- ],
- "ordinal": [
- "#fbf2c7",
- "#f9e39c",
- "#f8d36e",
- "#f4bb6a",
- "#e68a4f",
- "#d15a40",
- "#ab4232"
- ],
- "ramp": [
- "#fbf2c7",
- "#f9e39c",
- "#f8d36e",
- "#f4bb6a",
- "#e68a4f",
- "#d15a40",
- "#ab4232"
- ]
- },
- "rect": {
- "fill": "#82c6df"
- },
- "title": {
- "anchor": "start",
- "color": "#000000",
- "font": "Benton Gothic Bold, sans-serif",
- "fontSize": 22,
- "fontWeight": "normal"
+ "config": {
+ "arc": {
+ "fill": "#82c6df"
+ },
+ "area": {
+ "fill": "#82c6df"
+ },
+ "axis": {
+ "labelFont": "Benton Gothic, sans-serif",
+ "labelFontSize": 11.5,
+ "labelFontWeight": "normal",
+ "titleFont": "Benton Gothic Bold, sans-serif",
+ "titleFontSize": 13,
+ "titleFontWeight": "normal"
+ },
+ "axisX": {
+ "labelAngle": 0,
+ "labelPadding": 4,
+ "tickSize": 3
+ },
+ "axisY": {
+ "labelBaseline": "middle",
+ "maxExtent": 45,
+ "minExtent": 45,
+ "tickSize": 2,
+ "titleAlign": "left",
+ "titleAngle": 0,
+ "titleX": -45,
+ "titleY": -11
+ },
+ "background": "#ffffff",
+ "legend": {
+ "labelFont": "Benton Gothic, sans-serif",
+ "labelFontSize": 11.5,
+ "symbolType": "square",
+ "titleFont": "Benton Gothic Bold, sans-serif",
+ "titleFontSize": 13,
+ "titleFontWeight": "normal"
+ },
+ "line": {
+ "stroke": "#82c6df",
+ "strokeWidth": 2
+ },
+ "range": {
+ "category": [
+ "#ec8431",
+ "#829eb1",
+ "#c89d29",
+ "#3580b1",
+ "#adc839",
+ "#ab7fb4"
+ ],
+ "diverging": [
+ "#e68a4f",
+ "#f4bb6a",
+ "#f9e39c",
+ "#dadfe2",
+ "#a6b7c6",
+ "#849eae"
+ ],
+ "heatmap": [
+ "#fbf2c7",
+ "#f9e39c",
+ "#f8d36e",
+ "#f4bb6a",
+ "#e68a4f",
+ "#d15a40",
+ "#ab4232"
+ ],
+ "ordinal": [
+ "#fbf2c7",
+ "#f9e39c",
+ "#f8d36e",
+ "#f4bb6a",
+ "#e68a4f",
+ "#d15a40",
+ "#ab4232"
+ ],
+ "ramp": [
+ "#fbf2c7",
+ "#f9e39c",
+ "#f8d36e",
+ "#f4bb6a",
+ "#e68a4f",
+ "#d15a40",
+ "#ab4232"
+ ]
+ },
+ "rect": {
+ "fill": "#82c6df"
+ },
+ "title": {
+ "anchor": "start",
+ "color": "#000000",
+ "font": "Benton Gothic Bold, sans-serif",
+ "fontSize": 22,
+ "fontWeight": "normal"
+ }
}
},
"powerbi": {
- "arc": {
- "fill": "#118DFF"
- },
- "area": {
- "fill": "#118DFF",
- "line": true,
- "opacity": 0.6
- },
- "axis": {
- "domain": false,
- "grid": false,
- "labelColor": "#605E5C",
- "labelFontSize": 12,
- "ticks": false,
- "titleColor": "#252423",
- "titleFont": "wf_standard-font, helvetica, arial, sans-serif",
- "titleFontSize": 16,
- "titleFontWeight": "normal"
- },
- "axisBand": {
- "tickExtra": true
- },
- "axisQuantitative": {
- "grid": true,
- "gridColor": "#C8C6C4",
- "gridDash": [
- 1,
- 5
- ],
- "labelFlush": false,
- "tickCount": 3
- },
- "axisX": {
- "labelPadding": 5
- },
- "axisY": {
- "labelPadding": 10
- },
- "background": "transparent",
- "bar": {
- "fill": "#118DFF"
- },
- "font": "Segoe UI",
- "header": {
- "labelColor": "#605E5C",
- "labelFont": "Segoe UI",
- "labelFontSize": 13.333333333333332,
- "titleColor": "#252423",
- "titleFont": "wf_standard-font, helvetica, arial, sans-serif",
- "titleFontSize": 16
- },
- "legend": {
- "labelColor": "#605E5C",
- "labelFont": "Segoe UI",
- "labelFontSize": 13.333333333333332,
- "symbolSize": 75,
- "symbolType": "circle",
- "titleColor": "#605E5C",
- "titleFont": "Segoe UI",
- "titleFontWeight": "bold"
- },
- "line": {
- "stroke": "#118DFF",
- "strokeCap": "round",
- "strokeJoin": "round",
- "strokeWidth": 3
- },
- "point": {
- "fill": "#118DFF",
- "filled": true,
- "size": 75
- },
- "range": {
- "category": [
- "#118DFF",
- "#12239E",
- "#E66C37",
- "#6B007B",
- "#E044A7",
- "#744EC2",
- "#D9B300",
- "#D64550"
- ],
- "diverging": [
- "#DEEFFF",
- "#118DFF"
- ],
- "heatmap": [
- "#DEEFFF",
- "#118DFF"
- ],
- "ordinal": [
- "#DEEFFF",
- "#c7e4ff",
- "#b0d9ff",
- "#9aceff",
- "#83c3ff",
- "#6cb9ff",
- "#55aeff",
- "#3fa3ff",
- "#2898ff",
- "#118DFF"
- ]
- },
- "rect": {
- "fill": "#118DFF"
- },
- "text": {
- "fill": "#605E5C",
+ "config": {
+ "arc": {
+ "fill": "#118DFF"
+ },
+ "area": {
+ "fill": "#118DFF",
+ "line": true,
+ "opacity": 0.6
+ },
+ "axis": {
+ "domain": false,
+ "grid": false,
+ "labelColor": "#605E5C",
+ "labelFontSize": 12,
+ "ticks": false,
+ "titleColor": "#252423",
+ "titleFont": "wf_standard-font, helvetica, arial, sans-serif",
+ "titleFontSize": 16,
+ "titleFontWeight": "normal"
+ },
+ "axisBand": {
+ "tickExtra": true
+ },
+ "axisQuantitative": {
+ "grid": true,
+ "gridColor": "#C8C6C4",
+ "gridDash": [
+ 1,
+ 5
+ ],
+ "labelFlush": false,
+ "tickCount": 3
+ },
+ "axisX": {
+ "labelPadding": 5
+ },
+ "axisY": {
+ "labelPadding": 10
+ },
+ "background": "transparent",
+ "bar": {
+ "fill": "#118DFF"
+ },
"font": "Segoe UI",
- "fontSize": 12
- },
- "view": {
- "stroke": "transparent"
+ "header": {
+ "labelColor": "#605E5C",
+ "labelFont": "Segoe UI",
+ "labelFontSize": 13.333333333333332,
+ "titleColor": "#252423",
+ "titleFont": "wf_standard-font, helvetica, arial, sans-serif",
+ "titleFontSize": 16
+ },
+ "legend": {
+ "labelColor": "#605E5C",
+ "labelFont": "Segoe UI",
+ "labelFontSize": 13.333333333333332,
+ "symbolSize": 75,
+ "symbolType": "circle",
+ "titleColor": "#605E5C",
+ "titleFont": "Segoe UI",
+ "titleFontWeight": "bold"
+ },
+ "line": {
+ "stroke": "#118DFF",
+ "strokeCap": "round",
+ "strokeJoin": "round",
+ "strokeWidth": 3
+ },
+ "point": {
+ "fill": "#118DFF",
+ "filled": true,
+ "size": 75
+ },
+ "range": {
+ "category": [
+ "#118DFF",
+ "#12239E",
+ "#E66C37",
+ "#6B007B",
+ "#E044A7",
+ "#744EC2",
+ "#D9B300",
+ "#D64550"
+ ],
+ "diverging": [
+ "#DEEFFF",
+ "#118DFF"
+ ],
+ "heatmap": [
+ "#DEEFFF",
+ "#118DFF"
+ ],
+ "ordinal": [
+ "#DEEFFF",
+ "#c7e4ff",
+ "#b0d9ff",
+ "#9aceff",
+ "#83c3ff",
+ "#6cb9ff",
+ "#55aeff",
+ "#3fa3ff",
+ "#2898ff",
+ "#118DFF"
+ ]
+ },
+ "rect": {
+ "fill": "#118DFF"
+ },
+ "text": {
+ "fill": "#605E5C",
+ "font": "Segoe UI",
+ "fontSize": 12
+ },
+ "view": {
+ "stroke": "transparent"
+ }
}
},
"quartz": {
- "arc": {
- "fill": "#ab5787"
- },
- "area": {
- "fill": "#ab5787"
- },
- "axis": {
- "domainColor": "#979797",
- "domainWidth": 0.5,
- "gridWidth": 0.2,
- "labelColor": "#979797",
- "tickColor": "#979797",
- "tickWidth": 0.2,
- "titleColor": "#979797"
- },
- "axisBand": {
- "grid": false
- },
- "axisX": {
- "grid": true,
- "tickSize": 10
- },
- "axisY": {
- "domain": false,
- "grid": true,
- "tickSize": 0
- },
- "background": "#f9f9f9",
- "legend": {
- "labelFontSize": 11,
- "padding": 1,
- "symbolSize": 30,
- "symbolType": "square"
- },
- "line": {
- "stroke": "#ab5787"
- },
- "range": {
- "category": [
- "#ab5787",
- "#51b2e5",
- "#703c5c",
- "#168dd9",
- "#d190b6",
- "#00609f",
- "#d365ba",
- "#154866",
- "#666666",
- "#c4c4c4"
- ]
- },
- "rect": {
- "fill": "#ab5787"
+ "config": {
+ "arc": {
+ "fill": "#ab5787"
+ },
+ "area": {
+ "fill": "#ab5787"
+ },
+ "axis": {
+ "domainColor": "#979797",
+ "domainWidth": 0.5,
+ "gridWidth": 0.2,
+ "labelColor": "#979797",
+ "tickColor": "#979797",
+ "tickWidth": 0.2,
+ "titleColor": "#979797"
+ },
+ "axisBand": {
+ "grid": false
+ },
+ "axisX": {
+ "grid": true,
+ "tickSize": 10
+ },
+ "axisY": {
+ "domain": false,
+ "grid": true,
+ "tickSize": 0
+ },
+ "background": "#f9f9f9",
+ "legend": {
+ "labelFontSize": 11,
+ "padding": 1,
+ "symbolSize": 30,
+ "symbolType": "square"
+ },
+ "line": {
+ "stroke": "#ab5787"
+ },
+ "range": {
+ "category": [
+ "#ab5787",
+ "#51b2e5",
+ "#703c5c",
+ "#168dd9",
+ "#d190b6",
+ "#00609f",
+ "#d365ba",
+ "#154866",
+ "#666666",
+ "#c4c4c4"
+ ]
+ },
+ "rect": {
+ "fill": "#ab5787"
+ }
}
},
"urbaninstitute": {
- "arc": {
- "fill": "#1696d2"
- },
- "area": {
- "fill": "#1696d2"
- },
- "axisX": {
- "domain": true,
- "domainColor": "#000000",
- "domainWidth": 1,
- "grid": false,
- "labelAngle": 0,
- "labelFont": "Lato",
- "labelFontSize": 12,
- "tickColor": "#000000",
- "tickSize": 5,
- "titleFont": "Lato",
- "titleFontSize": 12,
- "titlePadding": 10
- },
- "axisY": {
- "domain": false,
- "domainWidth": 1,
- "grid": true,
- "gridColor": "#DEDDDD",
- "gridWidth": 1,
- "labelFont": "Lato",
- "labelFontSize": 12,
- "labelPadding": 8,
- "ticks": false,
- "titleAngle": 0,
- "titleFont": "Lato",
- "titleFontSize": 12,
- "titlePadding": 10,
- "titleX": 18,
- "titleY": -10
- },
- "background": "#FFFFFF",
- "legend": {
- "labelFont": "Lato",
- "labelFontSize": 12,
- "offset": 10,
- "orient": "right",
- "symbolSize": 100,
- "titleFont": "Lato",
- "titleFontSize": 12,
- "titlePadding": 10
- },
- "line": {
- "color": "#1696d2",
- "stroke": "#1696d2",
- "strokeWidth": 5
- },
- "point": {
- "filled": true
- },
- "range": {
- "category": [
- "#1696d2",
- "#ec008b",
- "#fdbf11",
- "#000000",
- "#d2d2d2",
- "#55b748"
- ],
- "diverging": [
- "#ca5800",
- "#fdbf11",
- "#fdd870",
- "#fff2cf",
- "#cfe8f3",
- "#73bfe2",
- "#1696d2",
- "#0a4c6a"
- ],
- "heatmap": [
- "#ca5800",
- "#fdbf11",
- "#fdd870",
- "#fff2cf",
- "#cfe8f3",
- "#73bfe2",
- "#1696d2",
- "#0a4c6a"
- ],
- "ordinal": [
- "#cfe8f3",
- "#a2d4ec",
- "#73bfe2",
- "#46abdb",
- "#1696d2",
- "#12719e"
- ],
- "ramp": [
- "#CFE8F3",
- "#A2D4EC",
- "#73BFE2",
- "#46ABDB",
- "#1696D2",
- "#12719E",
- "#0A4C6A",
- "#062635"
- ]
- },
- "rect": {
- "fill": "#1696d2"
- },
- "style": {
- "bar": {
- "fill": "#1696d2",
- "stroke": null
+ "config": {
+ "arc": {
+ "fill": "#1696d2"
+ },
+ "area": {
+ "fill": "#1696d2"
+ },
+ "axisX": {
+ "domain": true,
+ "domainColor": "#000000",
+ "domainWidth": 1,
+ "grid": false,
+ "labelAngle": 0,
+ "labelFont": "Lato",
+ "labelFontSize": 12,
+ "tickColor": "#000000",
+ "tickSize": 5,
+ "titleFont": "Lato",
+ "titleFontSize": 12,
+ "titlePadding": 10
+ },
+ "axisY": {
+ "domain": false,
+ "domainWidth": 1,
+ "grid": true,
+ "gridColor": "#DEDDDD",
+ "gridWidth": 1,
+ "labelFont": "Lato",
+ "labelFontSize": 12,
+ "labelPadding": 8,
+ "ticks": false,
+ "titleAngle": 0,
+ "titleFont": "Lato",
+ "titleFontSize": 12,
+ "titlePadding": 10,
+ "titleX": 18,
+ "titleY": -10
+ },
+ "background": "#FFFFFF",
+ "legend": {
+ "labelFont": "Lato",
+ "labelFontSize": 12,
+ "offset": 10,
+ "orient": "right",
+ "symbolSize": 100,
+ "titleFont": "Lato",
+ "titleFontSize": 12,
+ "titlePadding": 10
+ },
+ "line": {
+ "color": "#1696d2",
+ "stroke": "#1696d2",
+ "strokeWidth": 5
+ },
+ "point": {
+ "filled": true
+ },
+ "range": {
+ "category": [
+ "#1696d2",
+ "#ec008b",
+ "#fdbf11",
+ "#000000",
+ "#d2d2d2",
+ "#55b748"
+ ],
+ "diverging": [
+ "#ca5800",
+ "#fdbf11",
+ "#fdd870",
+ "#fff2cf",
+ "#cfe8f3",
+ "#73bfe2",
+ "#1696d2",
+ "#0a4c6a"
+ ],
+ "heatmap": [
+ "#ca5800",
+ "#fdbf11",
+ "#fdd870",
+ "#fff2cf",
+ "#cfe8f3",
+ "#73bfe2",
+ "#1696d2",
+ "#0a4c6a"
+ ],
+ "ordinal": [
+ "#cfe8f3",
+ "#a2d4ec",
+ "#73bfe2",
+ "#46abdb",
+ "#1696d2",
+ "#12719e"
+ ],
+ "ramp": [
+ "#CFE8F3",
+ "#A2D4EC",
+ "#73BFE2",
+ "#46ABDB",
+ "#1696D2",
+ "#12719E",
+ "#0A4C6A",
+ "#062635"
+ ]
+ },
+ "rect": {
+ "fill": "#1696d2"
+ },
+ "style": {
+ "bar": {
+ "fill": "#1696d2",
+ "stroke": null
+ }
+ },
+ "text": {
+ "align": "center",
+ "color": "#1696d2",
+ "font": "Lato",
+ "fontSize": 11,
+ "fontWeight": 400,
+ "size": 11
+ },
+ "title": {
+ "anchor": "start",
+ "font": "Lato",
+ "fontSize": 18
+ },
+ "trail": {
+ "color": "#1696d2",
+ "size": 1,
+ "stroke": "#1696d2",
+ "strokeWidth": 0
+ },
+ "view": {
+ "stroke": "transparent"
}
- },
- "text": {
- "align": "center",
- "color": "#1696d2",
- "font": "Lato",
- "fontSize": 11,
- "fontWeight": 400,
- "size": 11
- },
- "title": {
- "anchor": "start",
- "font": "Lato",
- "fontSize": 18
- },
- "trail": {
- "color": "#1696d2",
- "size": 1,
- "stroke": "#1696d2",
- "strokeWidth": 0
- },
- "view": {
- "stroke": "transparent"
}
},
"vox": {
- "arc": {
- "fill": "#3e5c69"
- },
- "area": {
- "fill": "#3e5c69"
- },
- "axis": {
- "domainWidth": 0.5,
- "grid": true,
- "labelPadding": 2,
- "tickSize": 5,
- "tickWidth": 0.5,
- "titleFontWeight": "normal"
- },
- "axisBand": {
- "grid": false
- },
- "axisX": {
- "gridWidth": 0.2
- },
- "axisY": {
- "gridDash": [
- 3
- ],
- "gridWidth": 0.4
- },
- "background": "#fff",
- "legend": {
- "labelFontSize": 11,
- "padding": 1,
- "symbolType": "square"
- },
- "line": {
- "stroke": "#3e5c69"
- },
- "range": {
- "category": [
- "#3e5c69",
- "#6793a6",
- "#182429",
- "#0570b0",
- "#3690c0",
- "#74a9cf",
- "#a6bddb",
- "#e2ddf2"
- ]
- },
- "rect": {
- "fill": "#3e5c69"
+ "config": {
+ "arc": {
+ "fill": "#3e5c69"
+ },
+ "area": {
+ "fill": "#3e5c69"
+ },
+ "axis": {
+ "domainWidth": 0.5,
+ "grid": true,
+ "labelPadding": 2,
+ "tickSize": 5,
+ "tickWidth": 0.5,
+ "titleFontWeight": "normal"
+ },
+ "axisBand": {
+ "grid": false
+ },
+ "axisX": {
+ "gridWidth": 0.2
+ },
+ "axisY": {
+ "gridDash": [
+ 3
+ ],
+ "gridWidth": 0.4
+ },
+ "background": "#fff",
+ "legend": {
+ "labelFontSize": 11,
+ "padding": 1,
+ "symbolType": "square"
+ },
+ "line": {
+ "stroke": "#3e5c69"
+ },
+ "range": {
+ "category": [
+ "#3e5c69",
+ "#6793a6",
+ "#182429",
+ "#0570b0",
+ "#3690c0",
+ "#74a9cf",
+ "#a6bddb",
+ "#e2ddf2"
+ ]
+ },
+ "rect": {
+ "fill": "#3e5c69"
+ }
}
}
}
\ No newline at end of file
diff --git a/tests/vegalite/v5/test_theme.py b/tests/vegalite/v5/test_theme.py
index da7c134ba..45eda9637 100644
--- a/tests/vegalite/v5/test_theme.py
+++ b/tests/vegalite/v5/test_theme.py
@@ -1,23 +1,41 @@
from __future__ import annotations
-from typing import TYPE_CHECKING, Any, Callable, cast
+import json
+from collections.abc import Mapping, Set
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, get_args
import pytest
import altair.vegalite.v5 as alt
from altair import theme
from altair.theme import ConfigKwds, ThemeConfig
-from altair.vegalite.v5.schema._typing import is_color_hex
+from altair.vegalite.v5 import schema
+from altair.vegalite.v5.schema._typing import VegaThemes, is_color_hex
from altair.vegalite.v5.theme import VEGA_THEMES
from tests import slow
if TYPE_CHECKING:
import sys
+ if sys.version_info >= (3, 13):
+ from typing import TypeIs
+ else:
+ from typing_extensions import TypeIs
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
+
+T = TypeVar("T")
+
+_Config: TypeAlias = Literal["config"]
+_PartialThemeConfig: TypeAlias = Mapping[_Config, ConfigKwds]
+"""Represents ``ThemeConfig``, but **only** using the ``"config"`` key."""
@pytest.fixture
@@ -1043,3 +1061,67 @@ def test_theme_config(theme_func: Callable[[], ThemeConfig], chart) -> None:
theme.register(name, enable=True)(theme_func)
assert chart.to_dict(validate=True)
assert theme.get() == theme_func
+
+
+# NOTE: There are roughly 70 keys
+# - not really reasonable to create a literal that long for testing only
+# - therefore, using `frozenset[str]`
+@pytest.fixture(scope="session")
+def config_keys() -> frozenset[str]:
+ return ConfigKwds.__required_keys__.union(
+ ConfigKwds.__optional_keys__,
+ ConfigKwds.__readonly_keys__, # type: ignore[attr-defined]
+ ConfigKwds.__mutable_keys__, # type: ignore[attr-defined]
+ )
+
+
+@pytest.fixture(scope="session")
+def theme_name_keys() -> frozenset[VegaThemes]:
+ return frozenset(get_args(VegaThemes))
+
+
+@pytest.fixture(scope="session")
+def themes_path() -> Path:
+ return Path(schema.__file__).parent / "vega-themes.json"
+
+
+def is_keyed_exact(obj: Any, other: Set[T]) -> TypeIs[Mapping[T, Any]]:
+ return isinstance(obj, Mapping) and obj.keys() == other
+
+
+def is_config_kwds(obj: Any, other: Any) -> TypeIs[ConfigKwds]:
+ return isinstance(obj, Mapping) and obj.keys() <= other
+
+
+def is_vega_theme(obj: Any, config_keys: Any) -> TypeIs[_PartialThemeConfig]:
+ if is_keyed_exact(obj, frozenset[_Config]({"config"})):
+ inner = obj["config"]
+ return is_config_kwds(inner, config_keys)
+ else:
+ return False
+
+
+def is_vega_theme_all(
+ obj: Any, theme_name_keys: frozenset[VegaThemes], config_keys: frozenset[str]
+) -> TypeIs[Mapping[VegaThemes, _PartialThemeConfig]]:
+ return is_keyed_exact(obj, theme_name_keys) and all(
+ is_vega_theme(definition, config_keys) for definition in obj.values()
+ )
+
+
+def test_vendored_vega_themes_json(
+ themes_path: Path,
+ theme_name_keys: frozenset[VegaThemes],
+ config_keys: frozenset[str],
+) -> None:
+ """
+ Ensure every vendored theme can be represented as a ``ThemeConfig`` type.
+
+ Related
+ -------
+ - https://github.com/vega/altair/issues/3666#issuecomment-2450057530
+ """
+ with themes_path.open(encoding="utf-8") as f:
+ content = json.load(f)
+
+ assert is_vega_theme_all(content, theme_name_keys, config_keys)
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index e0e7a4d54..f68771e52 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -564,10 +564,14 @@ def download_schemafile(
def _vega_lite_props_only(
themes: dict[VegaThemes, dict[str, Any]], props: SchemaProperties, /
) -> Iterator[tuple[VegaThemes, dict[str, Any]]]:
- """Removes properties that are allowed in `Vega` but not `Vega-Lite` from theme definitions."""
+ """
+ Removes properties that are allowed in `Vega` but not `Vega-Lite` from theme definitions.
+
+ Each theme is then nested as ``ThemeConfig["config"] = ...``
+ """
keep = props.keys()
for name, theme_spec in themes.items():
- yield name, {k: v for k, v in theme_spec.items() if k in keep}
+ yield name, {"config": {k: v for k, v in theme_spec.items() if k in keep}}
def update_vega_themes(fp: Path, /, indent: str | int | None = 2) -> None:
From 6c79fa9030b400bfd19a427e3a37458e591b8305 Mon Sep 17 00:00:00 2001
From: Mattijn van Hoek
Date: Sat, 23 Nov 2024 20:01:03 +0100
Subject: [PATCH 27/53] include PR title type in `pull_request_template`
(#3698)
---
.github/pull_request_template.md | 31 ++++++++++++++++++++++++-------
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index c7b2a77c8..45100e2d7 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,11 +1,28 @@
-Thanks for contributing to Altair!
+## Thanks for contributing to Altair! 🎉
-Please follow these guidelines when submitting your PR:
+Please follow these guidelines:
-- Describe the purpose of the changes in PR, so that it is easy to understand the implication of the suggested changes.
- - Here is a [helpful article about writing effective PR descriptions](https://medium.com/@greenberg/writing-pull-requests-your-coworkers-might-enjoy-reading-9d0307e93da3).
-- Include unit tests and documentation for new features
-- Ensure that the title is a concise [semantic commit message](https://www.conventionalcommits.org/) (e.g. "feat: Add `embed_options` to charts").
- - Append `!` if the change is breaking (e.g. "fix!: Raise error when `embed_options` is `None`")
+### 1. **PR Description**
+ - Briefly describe the changes and their purpose. For help, check this [guide](https://medium.com/@greenberg/writing-pull-requests-your-coworkers-might-enjoy-reading-9d0307e93da3).
+
+### 2. **Tests & Docs**
+ - Include unit tests and update documentation for new features.
+
+### 3. **Commit Message**
+ - Use [semantic commit messages](https://www.conventionalcommits.org/), e.g., `"feat: Add embed_options to charts"`.
+ - Add `!` for breaking changes (e.g., `"fix!: Raise error when embed_options is None"`).
+
+### 4. **PR Title Types**
+ - **feat**: New feature
+ - **fix**: Bug fix
+ - **docs**: Documentation changes
+ - **style**: Code style changes (no functionality change)
+ - **refactor**: Code restructuring
+ - **perf**: Performance improvements
+ - **test**: Add or fix tests
+ - **build**: Changes to build system or dependencies
+ - **ci**: CI configuration changes
+ - **chore**: Miscellaneous tasks
+ - **revert**: Reverts a commit
From b6481d2b580b8c3b90df835a26da35d73991fe08 Mon Sep 17 00:00:00 2001
From: Mattijn van Hoek
Date: Sat, 23 Nov 2024 20:19:45 +0100
Subject: [PATCH 28/53] chore: bump narwhals to v1.14.2 (#3697)
Co-authored-by: dangotbanned <125183946+dangotbanned@users.noreply.github.com>
---
altair/_magics.py | 4 ++--
altair/utils/_vegafusion_data.py | 6 ++----
altair/utils/core.py | 7 ++++---
altair/utils/data.py | 11 ++++++-----
pyproject.toml | 2 +-
5 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/altair/_magics.py b/altair/_magics.py
index 61abf51e2..9c5b9537f 100644
--- a/altair/_magics.py
+++ b/altair/_magics.py
@@ -7,8 +7,8 @@
from importlib.util import find_spec
from typing import Any
-import narwhals.stable.v1 as nw
from IPython.core import magic_arguments
+from narwhals.stable.v1.dependencies import is_pandas_dataframe
from altair.vegalite import v5 as vegalite_v5
@@ -32,7 +32,7 @@ def _prepare_data(data, data_transformers):
"""Convert input data to data for use within schema."""
if data is None or isinstance(data, dict):
return data
- elif nw.dependencies.is_pandas_dataframe(data):
+ elif is_pandas_dataframe(data):
if func := data_transformers.get():
data = func(data)
return data
diff --git a/altair/utils/_vegafusion_data.py b/altair/utils/_vegafusion_data.py
index 401258e8c..e36fb3455 100644
--- a/altair/utils/_vegafusion_data.py
+++ b/altair/utils/_vegafusion_data.py
@@ -5,7 +5,7 @@
from typing import TYPE_CHECKING, Any, Callable, Final, TypedDict, Union, overload
from weakref import WeakValueDictionary
-import narwhals.stable.v1 as nw
+from narwhals.stable.v1.dependencies import is_into_dataframe
from packaging.version import Version
from altair.utils._importers import import_vegafusion
@@ -54,9 +54,7 @@
def is_supported_by_vf(data: Any) -> TypeIs[DataFrameLike]:
# Test whether VegaFusion supports the data type
# VegaFusion v2 support narwhals-compatible DataFrames
- return isinstance(data, DataFrameLike) or nw.dependencies.is_into_dataframe(
- data
- )
+ return isinstance(data, DataFrameLike) or is_into_dataframe(data)
else:
diff --git a/altair/utils/core.py b/altair/utils/core.py
index c675f98dc..1cac486b6 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -16,6 +16,7 @@
import jsonschema
import narwhals.stable.v1 as nw
+from narwhals.stable.v1.dependencies import is_pandas_dataframe, is_polars_dataframe
from narwhals.stable.v1.typing import IntoDataFrame
from altair.utils.schemapi import SchemaBase, SchemaLike, Undefined
@@ -469,9 +470,9 @@ def sanitize_narwhals_dataframe(
columns: list[IntoExpr] = []
# See https://github.com/vega/altair/issues/1027 for why this is necessary.
local_iso_fmt_string = "%Y-%m-%dT%H:%M:%S"
- is_polars_dataframe = nw.dependencies.is_polars_dataframe(data.to_native())
+ is_polars = is_polars_dataframe(data.to_native())
for name, dtype in schema.items():
- if dtype == nw.Date and is_polars_dataframe:
+ if dtype == nw.Date and is_polars:
# Polars doesn't allow formatting `Date` with time directives.
# The date -> datetime cast is extremely fast compared with `to_string`
columns.append(
@@ -673,7 +674,7 @@ def parse_shorthand( # noqa: C901
if schema[unescaped_field] in {
nw.Object,
nw.Unknown,
- } and nw.dependencies.is_pandas_dataframe(data_nw.to_native()):
+ } and is_pandas_dataframe(data_nw.to_native()):
attrs["type"] = infer_vegalite_type_for_pandas(column.to_native())
else:
attrs["type"] = infer_vegalite_type_for_narwhals(column)
diff --git a/altair/utils/data.py b/altair/utils/data.py
index ca48abb79..7964d15a0 100644
--- a/altair/utils/data.py
+++ b/altair/utils/data.py
@@ -19,6 +19,7 @@
)
import narwhals.stable.v1 as nw
+from narwhals.stable.v1.dependencies import is_pandas_dataframe
from narwhals.stable.v1.typing import IntoDataFrame
from ._importers import import_pyarrow_interchange
@@ -187,7 +188,7 @@ def sample(
if data is None:
return partial(sample, n=n, frac=frac)
check_data_type(data)
- if nw.dependencies.is_pandas_dataframe(data):
+ if is_pandas_dataframe(data):
return data.sample(n=n, frac=frac)
elif isinstance(data, dict):
if "values" in data:
@@ -322,7 +323,7 @@ def to_values(data: DataType) -> ToValuesReturnType:
data_native = nw.to_native(data, pass_through=True)
if isinstance(data_native, SupportsGeoInterface):
return {"values": _from_geo_interface(data_native)}
- elif nw.dependencies.is_pandas_dataframe(data_native):
+ elif is_pandas_dataframe(data_native):
data_native = sanitize_pandas_dataframe(data_native)
return {"values": data_native.to_dict(orient="records")}
elif isinstance(data_native, dict):
@@ -363,7 +364,7 @@ def _from_geo_interface(data: SupportsGeoInterface | Any) -> dict[str, Any]:
- ``typing.TypeGuard``
- ``pd.DataFrame.__getattr__``
"""
- if nw.dependencies.is_pandas_dataframe(data):
+ if is_pandas_dataframe(data):
data = sanitize_pandas_dataframe(data)
return sanitize_geo_interface(data.__geo_interface__)
@@ -373,7 +374,7 @@ def _data_to_json_string(data: DataType) -> str:
check_data_type(data)
if isinstance(data, SupportsGeoInterface):
return json.dumps(_from_geo_interface(data))
- elif nw.dependencies.is_pandas_dataframe(data):
+ elif is_pandas_dataframe(data):
data = sanitize_pandas_dataframe(data)
return data.to_json(orient="records", double_precision=15)
elif isinstance(data, dict):
@@ -400,7 +401,7 @@ def _data_to_csv_string(data: DataType) -> str:
f"See https://github.com/vega/altair/issues/3441"
)
raise NotImplementedError(msg)
- elif nw.dependencies.is_pandas_dataframe(data):
+ elif is_pandas_dataframe(data):
data = sanitize_pandas_dataframe(data)
return data.to_csv(index=False)
elif isinstance(data, dict):
diff --git a/pyproject.toml b/pyproject.toml
index 8871a0bf9..0887116c0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -20,7 +20,7 @@ dependencies = [
# If you update the minimum required jsonschema version, also update it in build.yml
"jsonschema>=3.0",
"packaging",
- "narwhals>=1.13.1"
+ "narwhals>=1.14.2"
]
description = "Vega-Altair: A declarative statistical visualization library for Python."
readme = "README.md"
From b2ff8ce53b35e1f85ef02644d926ba1e39673fb9 Mon Sep 17 00:00:00 2001
From: Jon Mease
Date: Sat, 23 Nov 2024 18:32:30 -0500
Subject: [PATCH 29/53] chore: Release 5.5.0 (#3699)
* update RELEASING.md:
- Remove redundant tag step
- Explicitly checkout main and check working tree
- Normalize indentation of CLI commands
* Add expression docstring links to expr class docstring so sphinx finds them
* Add raw_enabled for :raw-html: directive
* Add Generic link
* format
* update user guide with link
* fix raw-html render
* bump version to 5.5.0
* expand urls
* Fix _continuous uniform probability distribution URL
---
RELEASING.md | 59 +++++++-------
altair/__init__.py | 2 +-
altair/expr/__init__.py | 113 +++++++++++++++++++++++++-
altair/vegalite/v5/schema/channels.py | 32 ++++----
altair/vegalite/v5/schema/core.py | 16 ++--
doc/conf.py | 2 +-
doc/user_guide/api.rst | 2 +
tools/generate_api_docs.py | 2 +
tools/markup.py | 21 +++--
tools/vega_expr.py | 51 +++++++++++-
10 files changed, 232 insertions(+), 68 deletions(-)
diff --git a/RELEASING.md b/RELEASING.md
index a3de236e4..6582af76a 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -2,24 +2,26 @@
Remove any existing environments managed by `hatch` so that it will create new ones
with the latest dependencies when executing the commands further below:
- hatch env prune
+ hatch env prune
-2. Make certain your branch is in sync with head. If you work on a fork, replace `origin` with `upstream`:
+2. Make certain your branch is in sync with head, and that you have no uncommitted modifications. If you work on a fork, replace `origin` with `upstream`:
- git pull origin main
+ git checkout main
+ git pull origin main
+ git status # Should show "nothing to commit, working tree clean"
3. Do a clean doc build:
- hatch run doc:clean-all
- hatch run doc:build-html
- hatch run doc:serve
+ hatch run doc:clean-all
+ hatch run doc:build-html
+ hatch run doc:serve
Navigate to http://localhost:8000 and ensure it looks OK (particularly
do a visual scan of the gallery thumbnails).
4. Create a new release branch:
- git switch -c version_5.0.0
+ git switch -c version_5.0.0
5. Update version to, e.g. 5.0.0:
@@ -28,56 +30,51 @@
6. Commit changes and push:
- git add . -u
- git commit -m "chore: Bump version to 5.0.0"
- git push
+ git add . -u
+ git commit -m "chore: Bump version to 5.0.0"
+ git push
7. Merge release branch into main, make sure that all required checks pass
-8. Tag the release:
-
- git tag -a v5.0.0 -m "version 5.0.0 release"
- git push origin v5.0.0
-
-9. On main, build source & wheel distributions. If you work on a fork, replace `origin` with `upstream`:
+8. On main, build source & wheel distributions. If you work on a fork, replace `origin` with `upstream`:
- git switch main
- git pull origin main
- hatch clean # clean old builds & distributions
- hatch build # create a source distribution and universal wheel
+ git switch main
+ git pull origin main
+ hatch clean # clean old builds & distributions
+ hatch build # create a source distribution and universal wheel
-10. publish to PyPI (Requires correct PyPI owner permissions):
+9. publish to PyPI (Requires correct PyPI owner permissions):
hatch publish
-11. build and publish docs (Requires write-access to altair-viz/altair-viz.github.io):
+10. build and publish docs (Requires write-access to altair-viz/altair-viz.github.io):
hatch run doc:publish-clean-build
-12. On main, tag the release. If you work on a fork, replace `origin` with `upstream`:
+11. On main, tag the release. If you work on a fork, replace `origin` with `upstream`:
- git tag -a v5.0.0 -m "Version 5.0.0 release"
- git push origin v5.0.0
+ git tag -a v5.0.0 -m "Version 5.0.0 release"
+ git push origin v5.0.0
-13. Create a new branch:
+12. Create a new branch:
git switch -c maint_5.1.0dev
-14. Update version and add 'dev' suffix, e.g. 5.1.0dev:
+13. Update version and add 'dev' suffix, e.g. 5.1.0dev:
- in ``altair/__init__.py``
- in ``doc/conf.py``
-15. Commit changes and push:
+14. Commit changes and push:
git add . -u
git commit -m "chore: Bump version to 5.1.0dev"
git push
-16. Merge maintenance branch into main
+15. Merge maintenance branch into main
-17. Double-check that a conda-forge pull request is generated from the updated
+16. Double-check that a conda-forge pull request is generated from the updated
pip package by the conda-forge bot (may take up to several hours):
https://github.com/conda-forge/altair-feedstock/pulls
-18. Publish a new release in https://github.com/vega/altair/releases/
+17. Publish a new release in https://github.com/vega/altair/releases/
diff --git a/altair/__init__.py b/altair/__init__.py
index 279cfec67..2c0904647 100644
--- a/altair/__init__.py
+++ b/altair/__init__.py
@@ -1,5 +1,5 @@
# ruff: noqa
-__version__ = "5.5.0dev"
+__version__ = "5.5.0"
# The content of __all__ is automatically written by
# tools/update_init_file.py. Do not modify directly.
diff --git a/altair/expr/__init__.py b/altair/expr/__init__.py
index 38d87f4c5..17e69357b 100644
--- a/altair/expr/__init__.py
+++ b/altair/expr/__init__.py
@@ -117,6 +117,115 @@ class expr(_ExprRef, metaclass=_ExprMeta):
}))},
shorthand: 'yval'
})
+
+ .. _Number.isNaN:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNan
+ .. _Number.isFinite:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite
+ .. _Math.abs:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs
+ .. _Math.acos:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acos
+ .. _Math.asin:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asin
+ .. _Math.atan:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan
+ .. _Math.atan2:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2
+ .. _Math.ceil:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil
+ .. _Math.cos:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos
+ .. _Math.exp:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/exp
+ .. _Math.floor:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
+ .. _Math.hypot:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
+ .. _Math.log:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log
+ .. _Math.max:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
+ .. _Math.min:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
+ .. _Math.pow:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow
+ .. _Math.random:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
+ .. _Math.round:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
+ .. _Math.sin:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin
+ .. _Math.sqrt:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt
+ .. _Math.tan:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan
+ .. _normal (Gaussian) probability distribution:
+ https://en.wikipedia.org/wiki/Normal_distribution
+ .. _cumulative distribution function:
+ https://en.wikipedia.org/wiki/Cumulative_distribution_function
+ .. _probability density function:
+ https://en.wikipedia.org/wiki/Probability_density_function
+ .. _log-normal probability distribution:
+ https://en.wikipedia.org/wiki/Log-normal_distribution
+ .. _continuous uniform probability distribution:
+ https://en.wikipedia.org/wiki/Continuous_uniform_distribution
+ .. _*unit*:
+ https://vega.github.io/vega/docs/api/time/#time-units
+ .. _JavaScript's String.replace:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
+ .. _d3-format specifier:
+ https://github.com/d3/d3-format/
+ .. _*units*:
+ https://vega.github.io/vega/docs/api/time/#time-units
+ .. _timeUnitSpecifier API documentation:
+ https://vega.github.io/vega/docs/api/time/#timeUnitSpecifier
+ .. _timeFormat:
+ https://vega.github.io/vega/docs/expressions/#timeFormat
+ .. _utcFormat:
+ https://vega.github.io/vega/docs/expressions/#utcFormat
+ .. _d3-time-format specifier:
+ https://github.com/d3/d3-time-format/
+ .. _TimeMultiFormat object:
+ https://vega.github.io/vega/docs/types/#TimeMultiFormat
+ .. _UTC:
+ https://en.wikipedia.org/wiki/Coordinated_Universal_Time
+ .. _JavaScript's RegExp:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
+ .. _RGB:
+ https://en.wikipedia.org/wiki/RGB_color_model
+ .. _d3-color's rgb function:
+ https://github.com/d3/d3-color#rgb
+ .. _HSL:
+ https://en.wikipedia.org/wiki/HSL_and_HSV
+ .. _d3-color's hsl function:
+ https://github.com/d3/d3-color#hsl
+ .. _CIE LAB:
+ https://en.wikipedia.org/wiki/Lab_color_space#CIELAB
+ .. _d3-color's lab function:
+ https://github.com/d3/d3-color#lab
+ .. _HCL:
+ https://en.wikipedia.org/wiki/Lab_color_space#CIELAB
+ .. _d3-color's hcl function:
+ https://github.com/d3/d3-color#hcl
+ .. _W3C Web Content Accessibility Guidelines:
+ https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef
+ .. _continuous color scheme:
+ https://vega.github.io/vega/docs/schemes
+ .. _geoArea:
+ https://github.com/d3/d3-geo#geoArea
+ .. _path.area:
+ https://github.com/d3/d3-geo#path_area
+ .. _geoBounds:
+ https://github.com/d3/d3-geo#geoBounds
+ .. _path.bounds:
+ https://github.com/d3/d3-geo#path_bounds
+ .. _geoCentroid:
+ https://github.com/d3/d3-geo#geoCentroid
+ .. _path.centroid:
+ https://github.com/d3/d3-geo#path_centroid
+ .. _window.screen:
+ https://developer.mozilla.org/en-US/docs/Web/API/Window/screen
"""
@override
@@ -643,13 +752,13 @@ def sampleUniform(
cls, min: IntoExpression = None, max: IntoExpression = None, /
) -> Expression:
"""
- Returns a sample from a univariate `continuous uniform probability distribution`_) over the interval [``min``, ``max``).
+ Returns a sample from a univariate `continuous uniform probability distribution`_ over the interval [``min``, ``max``).
If unspecified, ``min`` defaults to ``0`` and ``max`` defaults to ``1``. If only one
argument is provided, it is interpreted as the ``max`` value.
.. _continuous uniform probability distribution:
- https://en.wikipedia.org/wiki/Uniform_distribution_(continuous
+ https://en.wikipedia.org/wiki/Continuous_uniform_distribution
"""
return FunctionExpression("sampleUniform", (min, max))
diff --git a/altair/vegalite/v5/schema/channels.py b/altair/vegalite/v5/schema/channels.py
index 3562bc83e..a4a676c23 100644
--- a/altair/vegalite/v5/schema/channels.py
+++ b/altair/vegalite/v5/schema/channels.py
@@ -8308,8 +8308,8 @@ class Radius(FieldChannelMixin, core.PositionFieldDefBase):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -8644,8 +8644,8 @@ class RadiusDatum(DatumChannelMixin, core.PositionDatumDefBase):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -15197,8 +15197,8 @@ class Theta(FieldChannelMixin, core.PositionFieldDefBase):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -15529,8 +15529,8 @@ class ThetaDatum(DatumChannelMixin, core.PositionDatumDefBase):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -17067,8 +17067,8 @@ class X(FieldChannelMixin, core.PositionFieldDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -17550,8 +17550,8 @@ class XDatum(DatumChannelMixin, core.PositionDatumDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -19306,8 +19306,8 @@ class Y(FieldChannelMixin, core.PositionFieldDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -19789,8 +19789,8 @@ class YDatum(DatumChannelMixin, core.PositionDatumDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
diff --git a/altair/vegalite/v5/schema/core.py b/altair/vegalite/v5/schema/core.py
index 51ae8ab5d..fa2df587a 100644
--- a/altair/vegalite/v5/schema/core.py
+++ b/altair/vegalite/v5/schema/core.py
@@ -15216,8 +15216,8 @@ class PositionDatumDefBase(PolarDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -15410,8 +15410,8 @@ class PositionDatumDef(PositionDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -15681,8 +15681,8 @@ class PositionFieldDef(PositionDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
@@ -15963,8 +15963,8 @@ class PositionFieldDefBase(PolarDef):
stacked bar and area charts
`__ and pie charts
`with percentage tooltip
- `__). :raw-html:`
`
- -``"center"`` - stacking with center baseline (for `streamgraph
+ `__).
+ * ``"center"`` - stacking with center baseline (for `streamgraph
`__).
* ``null`` or ``false`` - No-stacking. This will produce layered `bar
`__ and area
diff --git a/doc/conf.py b/doc/conf.py
index a01b6b85d..b4bd6a7c0 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -79,7 +79,7 @@
# built documents.
#
# The short X.Y version.
-version = "5.5.0dev"
+version = "5.5.0"
# The full version, including alpha/beta/rc tags.
release = f"{version}"
diff --git a/doc/user_guide/api.rst b/doc/user_guide/api.rst
index d3c08f547..5793f0ae8 100644
--- a/doc/user_guide/api.rst
+++ b/doc/user_guide/api.rst
@@ -791,3 +791,5 @@ Typing
Optional
is_chart_type
+.. _Generic:
+ https://typing.readthedocs.io/en/latest/spec/generics.html#generics
diff --git a/tools/generate_api_docs.py b/tools/generate_api_docs.py
index b9c2a1a2a..55c68729e 100644
--- a/tools/generate_api_docs.py
+++ b/tools/generate_api_docs.py
@@ -110,6 +110,8 @@
{typing_objects}
+.. _Generic:
+ https://typing.readthedocs.io/en/latest/spec/generics.html#generics
"""
diff --git a/tools/markup.py b/tools/markup.py
index 440efe629..88239299c 100644
--- a/tools/markup.py
+++ b/tools/markup.py
@@ -40,7 +40,10 @@ def __init__(self) -> None:
def inline_html(self, token: Token, state: BlockState) -> str:
html = token["raw"]
- return rf"\ :raw-html:`{html}`\ "
+ if html == "
":
+ return "\n"
+ else:
+ return rf" :raw-html:`{html}` "
class RSTParse(_Markdown):
@@ -131,7 +134,9 @@ def process_text(self, text: str, state: InlineState) -> None:
state.append_token({"type": "text", "raw": _RE_LIQUID_INCLUDE.sub(r"", text)})
-def read_ast_tokens(source: Url | Path, /) -> list[Token]:
+def read_ast_tokens(
+ source: Url | Path, /, replacements: list[tuple[str, str]] | None = None
+) -> list[Token]:
"""
Read from ``source``, drop ``BlockState``.
@@ -139,11 +144,17 @@ def read_ast_tokens(source: Url | Path, /) -> list[Token]:
"""
markdown = _Markdown(renderer=None, inline=InlineParser())
if isinstance(source, Path):
- tokens = markdown.read(source)
+ token_text = source.read_text()
else:
with request.urlopen(source) as response:
- s = response.read().decode("utf-8")
- tokens = markdown.parse(s, markdown.block.state_cls())
+ token_text = response.read().decode("utf-8")
+
+ # Apply replacements
+ if replacements:
+ for replacement in replacements:
+ token_text = token_text.replace(replacement[0], replacement[1])
+
+ tokens = markdown.parse(token_text, markdown.block.state_cls())
return tokens[0]
diff --git a/tools/vega_expr.py b/tools/vega_expr.py
index 1941f64fd..aa42e5ed6 100644
--- a/tools/vega_expr.py
+++ b/tools/vega_expr.py
@@ -47,6 +47,14 @@
EXPRESSIONS_DOCS_URL: LiteralString = f"{VEGA_DOCS_URL}expressions/"
EXPRESSIONS_URL_TEMPLATE = "https://raw.githubusercontent.com/vega/vega/refs/tags/{version}/docs/docs/expressions.md"
+# Replacements to apply prior to parsing as markdown
+PRE_PARSE_REPLACEMENTS = [
+ # Closing paren messes up markdown parsing, replace with equivalent wikipedia URL
+ (
+ "https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)",
+ "https://en.wikipedia.org/wiki/Continuous_uniform_distribution",
+ )
+]
# NOTE: Regex patterns
FUNCTION_DEF_LINE: Pattern[str] = re.compile(
@@ -219,7 +227,7 @@ def PI(cls) -> {return_ann}:
CLS_TEMPLATE = '''\
class expr({base}, metaclass={metaclass}):
- """{doc}"""
+ """{doc}\n{links}"""
@override
def __new__(cls: type[{base}], expr: str) -> {base}: {type_ignore}
@@ -443,6 +451,20 @@ def __init__(self, name: str, children: Sequence[Token], /) -> None:
self.signature: str = ""
self._special: set[Special] = set()
+ def get_links(self, rst_renderer: RSTRenderer) -> dict[str, str]:
+ """Retrieve dict of link text to link url."""
+ from mistune import BlockState
+
+ links = {}
+ state = BlockState()
+ for t in self._children:
+ if t.get("type") == "link" and (url := t.get("attrs", {}).get("url")):
+ text = rst_renderer.render_children(t, state)
+ text = text.replace("`", "")
+ links[text] = expand_urls(url)
+
+ return links
+
def with_doc(self) -> Self:
"""
Parses docstring content in full.
@@ -917,13 +939,15 @@ def italics_to_backticks(s: str, names: Iterable[str], /) -> str:
return re.sub(pattern, r"\g``\g``\g", s)
-def parse_expressions(source: Url | Path, /) -> Iterator[VegaExprDef]:
+def parse_expressions(
+ source: Url | Path, /, replacements: list[tuple[str, str]] | None = None
+) -> Iterator[VegaExprDef]:
"""
Download remote or read local `.md` resource and eagerly parse signatures of relevant definitions.
Yields with docs to ensure each can use all remapped names, regardless of the order they appear.
"""
- tokens = read_ast_tokens(source)
+ tokens = read_ast_tokens(source, replacements=replacements)
expr_defs = tuple(VegaExprDef.from_tokens(tokens))
VegaExprDef.remap_title.refresh()
for expr_def in expr_defs:
@@ -943,6 +967,21 @@ def write_expr_module(version: str, output: Path, *, header: str) -> None:
"""
version = version if version.startswith("v") else f"v{version}"
url = EXPRESSIONS_URL_TEMPLATE.format(version=version)
+
+ # Retrieve all of the links used in expr method docstrings,
+ # so we can include them in the class docstrings, so that sphinx
+ # will find them.
+ expr_defs = parse_expressions(url, replacements=PRE_PARSE_REPLACEMENTS)
+
+ links = {}
+ rst_renderer = RSTRenderer()
+ for expr_def in expr_defs:
+ links.update(expr_def.get_links(rst_renderer))
+
+ links_rst = []
+ for anchor, link_target in links.items():
+ links_rst.append(f" .. _{anchor}:\n {link_target}")
+
content = (
MODULE_PRE.format(
header=header,
@@ -956,12 +995,16 @@ def write_expr_module(version: str, output: Path, *, header: str) -> None:
base="_ExprRef",
metaclass=CLS_META,
doc=CLS_DOC,
+ links="\n".join(links_rst),
type_ignore=IGNORE_MISC,
),
)
contents = chain(
content,
- (expr_def.render() for expr_def in parse_expressions(url)),
+ (
+ expr_def.render()
+ for expr_def in parse_expressions(url, replacements=PRE_PARSE_REPLACEMENTS)
+ ),
[MODULE_POST],
)
print(f"Generating\n {url!s}\n ->{output!s}")
From 3bda0ac5682693691e69cc0affc02dec1ae41ce9 Mon Sep 17 00:00:00 2001
From: Jon Mease
Date: Sat, 23 Nov 2024 19:12:34 -0500
Subject: [PATCH 30/53] chore: Bump version to 5.6.0dev (#3700)
---
altair/__init__.py | 2 +-
doc/conf.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/altair/__init__.py b/altair/__init__.py
index 2c0904647..c2d05e464 100644
--- a/altair/__init__.py
+++ b/altair/__init__.py
@@ -1,5 +1,5 @@
# ruff: noqa
-__version__ = "5.5.0"
+__version__ = "5.6.0dev"
# The content of __all__ is automatically written by
# tools/update_init_file.py. Do not modify directly.
diff --git a/doc/conf.py b/doc/conf.py
index b4bd6a7c0..be3cb95f3 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -79,7 +79,7 @@
# built documents.
#
# The short X.Y version.
-version = "5.5.0"
+version = "5.6.0dev"
# The full version, including alpha/beta/rc tags.
release = f"{version}"
From 922eac35da764d3faae928b870a2c70d0cf1435b Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Sun, 24 Nov 2024 13:32:14 +0000
Subject: [PATCH 31/53] ci: Temporal examples in `vegafusion` (#3702)
---
pyproject.toml | 1 -
tests/test_transformed_data.py | 57 ++++++++++++++++++++--------------
2 files changed, 34 insertions(+), 24 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 0887116c0..db733c9c4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -205,7 +205,6 @@ exclude = [
"__pycache__",
"tests/examples_arguments_syntax",
"tests/examples_methods_syntax",
- "tests/test_transformed_data.py",
]
[tool.ruff.lint]
diff --git a/tests/test_transformed_data.py b/tests/test_transformed_data.py
index 1196c7b07..47667b52f 100644
--- a/tests/test_transformed_data.py
+++ b/tests/test_transformed_data.py
@@ -1,26 +1,37 @@
import pkgutil
import sys
+from importlib.metadata import version
+from importlib.util import find_spec
+import narwhals.stable.v1 as nw
import pytest
-from vega_datasets import data
+from packaging.version import Version
import altair as alt
from altair.utils.execeval import eval_block
-from tests import examples_methods_syntax, slow, ignore_DataFrameGroupBy
-import narwhals.stable.v1 as nw
-
-try:
- import vegafusion as vf
-except ImportError:
- vf = None
+from tests import (
+ examples_methods_syntax,
+ ignore_DataFrameGroupBy,
+ skip_requires_vegafusion,
+ slow,
+)
+from vega_datasets import data
XDIST_ENABLED: bool = "xdist" in sys.modules
"""Use as an `xfail` condition, if running in parallel may cause the test to fail."""
-@ignore_DataFrameGroupBy
-@pytest.mark.skipif(vf is None, reason="vegafusion not installed")
+xfail_vegafusion_2: pytest.MarkDecorator = pytest.mark.xfail(
+ bool(find_spec("vegafusion"))
+ and Version(version("vegafusion")) >= Version("2.0.0a0"),
+ raises=ValueError,
+ reason="https://github.com/vega/altair/issues/3701",
+)
+
+
# fmt: off
-@pytest.mark.parametrize("filename,rows,cols", [
+@ignore_DataFrameGroupBy
+@skip_requires_vegafusion
+@pytest.mark.parametrize(("filename", "rows", "cols"), [
("annual_weather_heatmap.py", 366, ["monthdate_date_end", "max_temp_max"]),
("anscombe_plot.py", 44, ["Series", "X", "Y"]),
("bar_chart_sorted.py", 6, ["site", "sum_yield"]),
@@ -49,7 +60,7 @@
pytest.param("line_percent.py", 30, ["sex", "perc"], marks=slow),
("line_with_log_scale.py", 15, ["year", "sum_people"]),
("multifeature_scatter_plot.py", 150, ["petalWidth", "species"]),
- ("natural_disasters.py", 686, ["Deaths", "Year"]),
+ pytest.param("natural_disasters.py", 686, ["Deaths", "Year"], marks=xfail_vegafusion_2),
("normalized_stacked_area_chart.py", 51, ["source", "net_generation_start"]),
("normalized_stacked_bar_chart.py", 60, ["site", "sum_yield_start"]),
("parallel_coordinates.py", 600, ["key", "value"]),
@@ -69,9 +80,9 @@
("wilkinson-dot-plot.py", 21, ["data", "id"]),
("window_rank.py", 12, ["team", "diff"]),
])
-# fmt: on
@pytest.mark.parametrize("to_reconstruct", [True, False])
def test_primitive_chart_examples(filename, rows, cols, to_reconstruct):
+ # fmt: on
source = pkgutil.get_data(examples_methods_syntax.__name__, filename)
chart = eval_block(source, strict=True)
if to_reconstruct:
@@ -83,17 +94,17 @@ def test_primitive_chart_examples(filename, rows, cols, to_reconstruct):
assert df is not None
nw_df = nw.from_native(df, eager_only=True, strict=True)
- assert len(nw_df) == rows
+ assert len(nw_df) == rows
assert set(cols).issubset(set(nw_df.columns))
-@pytest.mark.skipif(vf is None, reason="vegafusion not installed")
# fmt: off
-@pytest.mark.parametrize("filename,all_rows,all_cols", [
+@skip_requires_vegafusion
+@pytest.mark.parametrize(("filename", "all_rows", "all_cols"), [
("errorbars_with_std.py", [10, 10], [["upper_yield"], ["extent_yield"]]),
("candlestick_chart.py", [44, 44], [["low"], ["close"]]),
("co2_concentration.py", [713, 7, 7], [["first_date"], ["scaled_date"], ["end"]]),
- ("falkensee.py", [2, 38, 38], [["event"], ["population"], ["population"]]),
+ pytest.param("falkensee.py", [2, 38, 38], [["event"], ["population"], ["population"]], marks=xfail_vegafusion_2),
("heat_lane.py", [10, 10], [["bin_count_start"], ["y2"]]),
("histogram_responsive.py", [20, 20], [["__count"], ["__count"]]),
("histogram_with_a_global_mean_overlay.py", [9, 1], [["__count"], ["mean_IMDB_Rating"]]),
@@ -127,9 +138,9 @@ def test_primitive_chart_examples(filename, rows, cols, to_reconstruct):
("us_employment.py", [120, 1, 2], [["month"], ["president"], ["president"]]),
("us_population_pyramid_over_time.py", [19, 38, 19], [["gender"], ["year"], ["gender"]]),
])
-# fmt: on
@pytest.mark.parametrize("to_reconstruct", [True, False])
def test_compound_chart_examples(filename, all_rows, all_cols, to_reconstruct):
+ # fmt: on
source = pkgutil.get_data(examples_methods_syntax.__name__, filename)
chart = eval_block(source, strict=True)
if to_reconstruct:
@@ -137,7 +148,7 @@ def test_compound_chart_examples(filename, all_rows, all_cols, to_reconstruct):
# then what might have been originally used. See
# https://github.com/hex-inc/vegafusion/issues/354 for more info.
chart = alt.Chart.from_dict(chart.to_dict())
-
+
assert isinstance(chart, (alt.LayerChart, alt.ConcatChart, alt.HConcatChart, alt.VConcatChart))
dfs = chart.transformed_data()
@@ -145,7 +156,7 @@ def test_compound_chart_examples(filename, all_rows, all_cols, to_reconstruct):
# Only run assert statements if the chart is not reconstructed. Reason
# is that for some charts, the original chart contained duplicated datasets
# which disappear when reconstructing the chart.
-
+
nw_dfs = (nw.from_native(d, eager_only=True, strict=True) for d in dfs)
assert len(dfs) == len(all_rows)
for df, rows, cols in zip(nw_dfs, all_rows, all_cols):
@@ -153,7 +164,7 @@ def test_compound_chart_examples(filename, all_rows, all_cols, to_reconstruct):
assert set(cols).issubset(set(df.columns))
-@pytest.mark.skipif(vf is None, reason="vegafusion not installed")
+@skip_requires_vegafusion
@pytest.mark.parametrize("to_reconstruct", [True, False])
def test_transformed_data_exclude(to_reconstruct):
source = data.wheat()
@@ -179,5 +190,5 @@ def test_transformed_data_exclude(to_reconstruct):
assert len(_datasets) == 2
assert len(_datasets[0]) == 52
assert "wheat_start" in _datasets[0]
- assert len(_datasets[1]) == 1
- assert "mean_wheat" in _datasets[1]
+ assert len(_datasets[1]) == 1
+ assert "mean_wheat" in _datasets[1]
From 9002472d65875a8486de920e4cc585420efdd276 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 2 Dec 2024 16:01:53 +0000
Subject: [PATCH 32/53] refactor(ruff): Apply `TC006` fixes (#3706)
Related
- https://github.com/astral-sh/ruff/issues/14676
- https://github.com/astral-sh/ruff/releases/tag/0.8.1
---
altair/utils/core.py | 2 +-
altair/utils/mimebundle.py | 2 +-
altair/utils/plugin_registry.py | 4 ++--
altair/vegalite/v5/api.py | 10 +++++-----
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/altair/utils/core.py b/altair/utils/core.py
index 1cac486b6..66a559fad 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -383,7 +383,7 @@ def to_list_if_array(val):
# We know that the column names are strings from the isinstance check
# further above but mypy thinks it is of type Hashable and therefore does not
# let us assign it to the col_name variable which is already of type str.
- col_name = cast(str, dtype_item[0])
+ col_name = cast("str", dtype_item[0])
dtype = dtype_item[1]
dtype_name = str(dtype)
if dtype_name == "category":
diff --git a/altair/utils/mimebundle.py b/altair/utils/mimebundle.py
index 575b3f71c..56cd05a7e 100644
--- a/altair/utils/mimebundle.py
+++ b/altair/utils/mimebundle.py
@@ -140,7 +140,7 @@ def spec_to_mimebundle(
if format in {"png", "svg", "pdf", "vega"}:
return _spec_to_mimebundle_with_engine(
spec,
- cast(Literal["png", "svg", "pdf", "vega"], format),
+ cast("Literal['png', 'svg', 'pdf', 'vega']", format),
internal_mode,
engine=engine,
format_locale=embed_options.get("formatLocale", None),
diff --git a/altair/utils/plugin_registry.py b/altair/utils/plugin_registry.py
index 81e34cb8d..91e9462eb 100644
--- a/altair/utils/plugin_registry.py
+++ b/altair/utils/plugin_registry.py
@@ -134,7 +134,7 @@ def __init__(
f"https://docs.astral.sh/ruff/rules/assert/"
)
deprecated_warn(msg, version="5.4.0")
- self.plugin_type = cast(IsPlugin, _is_type(plugin_type))
+ self.plugin_type = cast("IsPlugin", _is_type(plugin_type))
else:
self.plugin_type = plugin_type
self._active: Plugin[R] | None = None
@@ -214,7 +214,7 @@ def _enable(self, name: str, **options) -> None:
raise ValueError(self.entrypoint_err_messages[name]) from err
else:
raise NoSuchEntryPoint(self.entry_point_group, name) from err
- value = cast(PluginT, ep.load())
+ value = cast("PluginT", ep.load())
self.register(name, value)
self._active_name = name
self._active = self._plugins[name]
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index 909ed621e..5b3d93f86 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -798,7 +798,7 @@ def _parse_when_compose(
if constraints:
iters.append(_parse_when_constraints(constraints))
r = functools.reduce(operator.and_, itertools.chain.from_iterable(iters))
- return t.cast(_expr_core.BinaryExpression, r)
+ return t.cast("_expr_core.BinaryExpression", r)
def _parse_when(
@@ -1107,7 +1107,7 @@ def when(
conditions = self.to_dict()
current = conditions["condition"]
if isinstance(current, list):
- conditions = t.cast(_Conditional[_Conditions], conditions)
+ conditions = t.cast("_Conditional[_Conditions]", conditions)
return ChainedWhen(condition, conditions)
elif isinstance(current, dict):
cond = _reveal_parsed_shorthand(current)
@@ -1384,7 +1384,7 @@ def param(
parameter.empty = empty
elif empty in empty_remap:
utils.deprecated_warn(warn_msg, version="5.0.0")
- parameter.empty = empty_remap[t.cast(str, empty)]
+ parameter.empty = empty_remap[t.cast("str", empty)]
else:
raise ValueError(warn_msg)
@@ -3086,7 +3086,7 @@ def transform_filter(
verbose_composition = chart.transform_filter((datum.year == 2000) & (datum.sex == 1))
chart.transform_filter(year=2000, sex=1)
"""
- if depr_filter := t.cast(Any, constraints.pop("filter", None)):
+ if depr_filter := t.cast("Any", constraints.pop("filter", None)):
utils.deprecated_warn(
"Passing `filter` as a keyword is ambiguous.\n\n"
"Use a positional argument for `<5.5.0` behavior.\n"
@@ -3986,7 +3986,7 @@ def from_dict(
pass
# As a last resort, try using the Root vegalite object
- return t.cast(_TSchemaBase, core.Root.from_dict(dct, validate))
+ return t.cast("_TSchemaBase", core.Root.from_dict(dct, validate))
def to_dict(
self,
From 8d3991b93ee17dd639e0c9caac8100d1f32ed6ad Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Fri, 20 Dec 2024 19:53:01 +0000
Subject: [PATCH 33/53] chore: fix `ruff`, `mypy` warnings (#3717)
---
altair/utils/core.py | 2 +-
altair/utils/mimebundle.py | 2 +-
altair/utils/schemapi.py | 2 +-
pyproject.toml | 4 +++-
tests/utils/test_utils.py | 2 +-
tools/schemapi/schemapi.py | 2 +-
6 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/altair/utils/core.py b/altair/utils/core.py
index 66a559fad..98daa0d0d 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -325,7 +325,7 @@ def numpy_is_subtype(dtype: Any, subtype: Any) -> bool:
import numpy as np
try:
- return np.issubdtype(dtype, subtype)
+ return cast("bool", np.issubdtype(dtype, subtype))
except (NotImplementedError, TypeError):
return False
diff --git a/altair/utils/mimebundle.py b/altair/utils/mimebundle.py
index 56cd05a7e..9355d02bb 100644
--- a/altair/utils/mimebundle.py
+++ b/altair/utils/mimebundle.py
@@ -336,7 +336,7 @@ def _validate_normalize_engine(
def _pngxy(data):
"""
- read the (width, height) from a PNG header.
+ Read the (width, height) from a PNG header.
Taken from IPython.display
"""
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index 7eaab77c1..0416c3405 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -723,7 +723,7 @@ def _format_params_as_table(param_dict_keys: Iterable[str]) -> str:
max_column_width = 80
# Output a square table if not too big (since it is easier to read)
num_param_names = len(param_names)
- square_columns = int(ceil(num_param_names**0.5))
+ square_columns = ceil(num_param_names**0.5)
columns = min(max_column_width // max_name_length, square_columns)
# Compute roughly equal column heights to evenly divide the param names
diff --git a/pyproject.toml b/pyproject.toml
index db733c9c4..7bb051b35 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -69,7 +69,7 @@ all = [
]
dev = [
"hatch>=1.13.0",
- "ruff>=0.6.0",
+ "ruff>=0.8.4",
"duckdb>=1.0",
"ipython[kernel]",
"pandas>=1.1.3",
@@ -341,6 +341,8 @@ ignore = [
"B905",
# mutable-class-default
"RUF012",
+ # used-dummy-variable
+ "RUF052",
# suppressible-exception
# https://github.com/vega/altair/pull/3431#discussion_r1629808660
"SIM105",
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index 2e8ae1214..23120e616 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -177,7 +177,7 @@ def test_sanitize_dataframe_colnames():
# Test that non-string columns result in an error
df.columns = [4, "foo", "bar"]
- with pytest.raises(ValueError, match="Dataframe contains invalid column name: 4."):
+ with pytest.raises(ValueError, match=r"Dataframe contains invalid column name: 4."):
sanitize_pandas_dataframe(df)
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index b41c61a85..b19ddad73 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -721,7 +721,7 @@ def _format_params_as_table(param_dict_keys: Iterable[str]) -> str:
max_column_width = 80
# Output a square table if not too big (since it is easier to read)
num_param_names = len(param_names)
- square_columns = int(ceil(num_param_names**0.5))
+ square_columns = ceil(num_param_names**0.5)
columns = min(max_column_width // max_name_length, square_columns)
# Compute roughly equal column heights to evenly divide the param names
From 1208c5d79e7ff0c10c5cd60bc21462f1be2073c9 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Fri, 20 Dec 2024 22:04:03 +0000
Subject: [PATCH 34/53] ci: Switch from `hatch`, `pip` to `uv` in GitHub
Actions (#3719)
---
.github/workflows/build.yml | 23 +++++++++++++----------
.github/workflows/docbuild.yml | 14 +++++++++-----
.github/workflows/lint.yml | 17 ++++++++---------
3 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 4b72165af..a7ad3ffb7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -2,6 +2,9 @@ name: build
on: [push, pull_request]
+env:
+ UV_SYSTEM_PYTHON: 1
+
jobs:
build:
runs-on: ubuntu-latest
@@ -16,15 +19,15 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
+ - name: Install uv
+ uses: astral-sh/setup-uv@v4
- name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install ".[all, dev]"
+ run: uv pip install -e ".[dev, all]"
- name: Install specific jsonschema
# Only have to execute this if we don't want the latest jsonschema version
if: ${{ matrix.jsonschema-version != 'latest' }}
run: |
- pip install jsonschema==${{ matrix.jsonschema-version }}
+ uv pip install jsonschema==${{ matrix.jsonschema-version }}
- name: Maybe uninstall optional dependencies
# We uninstall pyarrow and vegafusion for one job to test that we have not
# accidentally introduced a hard dependency on these libraries.
@@ -32,17 +35,17 @@ jobs:
# Also see https://github.com/vega/altair/pull/3114
if: ${{ matrix.python-version == '3.9' }}
run: |
- pip uninstall -y pyarrow vegafusion vegafusion-python-embed vl-convert-python anywidget
+ uv pip uninstall pyarrow vegafusion vegafusion-python-embed vl-convert-python anywidget
- name: Maybe install lowest supported pandas version
# We install the lowest supported pandas version for one job to test that
# it still works. Downgrade to the oldest versions of pandas and numpy that include
# Python 3.9 wheels, so only run this job for Python 3.9
if: ${{ matrix.python-version == '3.9' }}
run: |
- pip install pandas==1.1.3 numpy==1.19.3
+ uv pip install pandas==1.1.3 numpy==1.19.3
- name: Test that schema generation has no effect
run: |
- pip install vl-convert-python
+ uv pip install vl-convert-python
python tools/generate_schema_wrapper.py
# This gets the paths of all files which were either deleted, modified
# or are not yet tracked by Git
@@ -66,7 +69,7 @@ jobs:
fi
- name: Test with pytest
run: |
- pytest --pyargs --numprocesses=logical --doctest-modules tests
+ uv run pytest --pyargs --numprocesses=logical --doctest-modules tests
- name: Validate Vega-Lite schema
run: |
# We install all 'format' dependencies of jsonschema as check-jsonschema
@@ -74,5 +77,5 @@ jobs:
# We can always use the latest jsonschema version here.
# uri-reference check is disabled as the URIs in the Vega-Lite schema do
# not conform RFC 3986.
- pip install 'jsonschema[format]' check-jsonschema --upgrade
- check-jsonschema --check-metaschema altair/vegalite/v5/schema/vega-lite-schema.json --disable-formats uri-reference
+ uv pip install 'jsonschema[format]' check-jsonschema --upgrade
+ uv run check-jsonschema --check-metaschema altair/vegalite/v5/schema/vega-lite-schema.json --disable-formats uri-reference
diff --git a/.github/workflows/docbuild.yml b/.github/workflows/docbuild.yml
index 585630bea..72db59734 100644
--- a/.github/workflows/docbuild.yml
+++ b/.github/workflows/docbuild.yml
@@ -2,6 +2,9 @@ name: docbuild
on: [push, pull_request]
+env:
+ UV_SYSTEM_PYTHON: 1
+
jobs:
build:
runs-on: ubuntu-latest
@@ -11,15 +14,16 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: "3.12"
+ - name: Install uv
+ uses: astral-sh/setup-uv@v4
- name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install hatch
+ run: uv pip install -e ".[dev, all, doc]"
- name: Run doc:build-html
run: |
- hatch run doc:build-html
+ mkdir -p doc/_images
+ uv run sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html
- name: Run doc:doctest
run: |
- hatch run doc:doctest
+ uv run sphinx-build -b doctest -d doc/_build/doctrees doc doc/_build/doctest
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 4e89e2777..c321fc9a4 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -7,23 +7,22 @@ jobs:
runs-on: ubuntu-latest
name: ruff-mypy
steps:
- - uses: actions/checkout@v4
- - name: Set up Python 3.12
+ - name: "Set up Python"
uses: actions/setup-python@v5
with:
python-version: "3.12"
+ - uses: actions/checkout@v4
+ - name: Install uv
+ uses: astral-sh/setup-uv@v4
# Installing all dependencies and not just the linters as mypy needs them for type checking
- name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install hatch
+ run: uv pip install -e ".[dev, all]" --system
- name: Lint with ruff
run: |
- hatch run ruff check .
+ uv run ruff check
- name: Check formatting with ruff
run: |
- hatch run ruff format --diff .
- hatch run ruff format --check .
+ uv run ruff format --check --diff
- name: Lint with mypy
run: |
- hatch run mypy altair tests
+ uv run mypy altair tests
From 7c2d97ffe80749a7cd1b24703547e40f4918172d Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Sun, 29 Dec 2024 19:03:27 +0000
Subject: [PATCH 35/53] ci(typing): Add bundled stubs to `pyright.ignore`
(#3724)
---
pyproject.toml | 1 +
1 file changed, 1 insertion(+)
diff --git a/pyproject.toml b/pyproject.toml
index 7bb051b35..3b555aa43 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -476,4 +476,5 @@ ignore=[
"./altair/jupyter/", # Mostly untyped
"./tests/test_jupyter_chart.py", # Based on untyped module
"../../../**/Lib", # stdlib
+ "../../../**/typeshed*" # typeshed-fallback
]
From 16e2ed7b2a2656b5bdc72c925bc19568a166f413 Mon Sep 17 00:00:00 2001
From: "Jason N. White"
Date: Wed, 1 Jan 2025 05:32:44 -0500
Subject: [PATCH 36/53] Update LICENSE, fix license year (#3726)
---
LICENSE | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/LICENSE b/LICENSE
index 03635b4b1..da22983b8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2023, Vega-Altair Developers
+Copyright (c) 2015-2025, Vega-Altair Developers
All rights reserved.
Redistribution and use in source and binary forms, with or without
From 48e976ef9388ce08a2e871a0f67ed012b914597a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 1 Jan 2025 14:17:42 +0000
Subject: [PATCH 37/53] ci: bump astral-sh/setup-uv from 4 to 5 in the
github-actions group (#3727)
Bumps the github-actions group with 1 update: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv).
Updates `astral-sh/setup-uv` from 4 to 5
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v4...v5)
---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: github-actions
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.github/workflows/build.yml | 2 +-
.github/workflows/docbuild.yml | 2 +-
.github/workflows/lint.yml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a7ad3ffb7..7010faa2c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -20,7 +20,7 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Install uv
- uses: astral-sh/setup-uv@v4
+ uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: uv pip install -e ".[dev, all]"
- name: Install specific jsonschema
diff --git a/.github/workflows/docbuild.yml b/.github/workflows/docbuild.yml
index 72db59734..1bd2aa0f6 100644
--- a/.github/workflows/docbuild.yml
+++ b/.github/workflows/docbuild.yml
@@ -15,7 +15,7 @@ jobs:
with:
python-version: "3.12"
- name: Install uv
- uses: astral-sh/setup-uv@v4
+ uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: uv pip install -e ".[dev, all, doc]"
- name: Run doc:build-html
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index c321fc9a4..815cad4d0 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -13,7 +13,7 @@ jobs:
python-version: "3.12"
- uses: actions/checkout@v4
- name: Install uv
- uses: astral-sh/setup-uv@v4
+ uses: astral-sh/setup-uv@v5
# Installing all dependencies and not just the linters as mypy needs them for type checking
- name: Install dependencies
run: uv pip install -e ".[dev, all]" --system
From cf73537e5108264588b35f52228cd55261c8f428 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 2 Jan 2025 13:31:41 +0000
Subject: [PATCH 38/53] chore(ruff): Fix ruff warnings (#3736)
---
altair/theme.py | 3 ++-
altair/utils/_vegafusion_data.py | 4 ++--
altair/utils/compiler.py | 3 ++-
altair/utils/core.py | 24 +++++++++++-------------
altair/utils/data.py | 13 ++-----------
altair/utils/display.py | 3 ++-
altair/utils/execeval.py | 3 ++-
altair/utils/plugin_registry.py | 3 ++-
altair/vegalite/data.py | 4 +++-
altair/vegalite/v5/api.py | 4 ++--
sphinxext/code_ref.py | 4 ++--
tests/expr/test_expr.py | 4 ++--
tests/utils/test_data.py | 5 ++++-
tests/utils/test_plugin_registry.py | 2 +-
tests/utils/test_schemapi.py | 4 ++--
tests/vegalite/v5/test_theme.py | 4 ++--
tools/schemapi/codegen.py | 4 ++--
tools/update_init_file.py | 6 ++++--
tools/vega_expr.py | 4 ++--
19 files changed, 51 insertions(+), 50 deletions(-)
diff --git a/altair/theme.py b/altair/theme.py
index e77a95eb8..54adbd16f 100644
--- a/altair/theme.py
+++ b/altair/theme.py
@@ -82,7 +82,8 @@
if TYPE_CHECKING:
import sys
- from typing import Any, Callable, Literal
+ from collections.abc import Callable
+ from typing import Any, Literal
if sys.version_info >= (3, 11):
from typing import LiteralString
diff --git a/altair/utils/_vegafusion_data.py b/altair/utils/_vegafusion_data.py
index e36fb3455..7fc4ff29d 100644
--- a/altair/utils/_vegafusion_data.py
+++ b/altair/utils/_vegafusion_data.py
@@ -2,7 +2,7 @@
import uuid
from importlib.metadata import version as importlib_version
-from typing import TYPE_CHECKING, Any, Callable, Final, TypedDict, Union, overload
+from typing import TYPE_CHECKING, Any, Final, TypedDict, Union, overload
from weakref import WeakValueDictionary
from narwhals.stable.v1.dependencies import is_into_dataframe
@@ -20,7 +20,7 @@
if TYPE_CHECKING:
import sys
- from collections.abc import MutableMapping
+ from collections.abc import Callable, MutableMapping
from narwhals.stable.v1.typing import IntoDataFrame
diff --git a/altair/utils/compiler.py b/altair/utils/compiler.py
index c8af2d3de..417c8d440 100644
--- a/altair/utils/compiler.py
+++ b/altair/utils/compiler.py
@@ -1,4 +1,5 @@
-from typing import Any, Callable
+from collections.abc import Callable
+from typing import Any
from altair.utils import PluginRegistry
diff --git a/altair/utils/core.py b/altair/utils/core.py
index 98daa0d0d..59c845165 100644
--- a/altair/utils/core.py
+++ b/altair/utils/core.py
@@ -8,11 +8,11 @@
import sys
import traceback
import warnings
-from collections.abc import Iterator, Mapping, MutableMapping
+from collections.abc import Callable, Iterator, Mapping, MutableMapping
from copy import deepcopy
from itertools import groupby
from operator import itemgetter
-from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, overload
+from typing import TYPE_CHECKING, Any, Literal, TypeVar, cast, overload
import jsonschema
import narwhals.stable.v1 as nw
@@ -32,8 +32,6 @@
if TYPE_CHECKING:
- import typing as t
-
import pandas as pd
from narwhals.stable.v1.typing import IntoExpr
@@ -287,7 +285,7 @@ def merge_props_geom(feat: dict[str, Any]) -> dict[str, Any]:
return props_geom
-def sanitize_geo_interface(geo: t.MutableMapping[Any, Any]) -> dict[str, Any]:
+def sanitize_geo_interface(geo: MutableMapping[Any, Any]) -> dict[str, Any]:
"""
Santize a geo_interface to prepare it for serialization.
@@ -768,21 +766,21 @@ def decorate(cb: WrapsFunc[R], /) -> WrappedMethod[T, P, R] | WrappedFunc[P, R]:
@overload
def update_nested(
- original: t.MutableMapping[Any, Any],
- update: t.Mapping[Any, Any],
+ original: MutableMapping[Any, Any],
+ update: Mapping[Any, Any],
copy: Literal[False] = ...,
-) -> t.MutableMapping[Any, Any]: ...
+) -> MutableMapping[Any, Any]: ...
@overload
def update_nested(
- original: t.Mapping[Any, Any],
- update: t.Mapping[Any, Any],
+ original: Mapping[Any, Any],
+ update: Mapping[Any, Any],
copy: Literal[True],
-) -> t.MutableMapping[Any, Any]: ...
+) -> MutableMapping[Any, Any]: ...
def update_nested(
original: Any,
- update: t.Mapping[Any, Any],
+ update: Mapping[Any, Any],
copy: bool = False,
-) -> t.MutableMapping[Any, Any]:
+) -> MutableMapping[Any, Any]:
"""
Update nested dictionaries.
diff --git a/altair/utils/data.py b/altair/utils/data.py
index 7964d15a0..565a6df7d 100644
--- a/altair/utils/data.py
+++ b/altair/utils/data.py
@@ -4,19 +4,10 @@
import json
import random
import sys
-from collections.abc import MutableMapping, Sequence
+from collections.abc import Callable, MutableMapping, Sequence
from functools import partial
from pathlib import Path
-from typing import (
- TYPE_CHECKING,
- Any,
- Callable,
- Literal,
- TypedDict,
- TypeVar,
- Union,
- overload,
-)
+from typing import TYPE_CHECKING, Any, Literal, TypedDict, TypeVar, Union, overload
import narwhals.stable.v1 as nw
from narwhals.stable.v1.dependencies import is_pandas_dataframe
diff --git a/altair/utils/display.py b/altair/utils/display.py
index 223417a11..475bd3244 100644
--- a/altair/utils/display.py
+++ b/altair/utils/display.py
@@ -4,7 +4,8 @@
import pkgutil
import textwrap
import uuid
-from typing import TYPE_CHECKING, Any, Callable, Union
+from collections.abc import Callable
+from typing import TYPE_CHECKING, Any, Union
from ._vegafusion_data import compile_with_vegafusion, using_vegafusion
from .mimebundle import spec_to_mimebundle
diff --git a/altair/utils/execeval.py b/altair/utils/execeval.py
index e5e855479..722021ac8 100644
--- a/altair/utils/execeval.py
+++ b/altair/utils/execeval.py
@@ -2,9 +2,10 @@
import ast
import sys
-from typing import TYPE_CHECKING, Any, Callable, Literal, overload
+from typing import TYPE_CHECKING, Any, Literal, overload
if TYPE_CHECKING:
+ from collections.abc import Callable
from os import PathLike
from _typeshed import ReadableBuffer
diff --git a/altair/utils/plugin_registry.py b/altair/utils/plugin_registry.py
index 91e9462eb..f25d9c90a 100644
--- a/altair/utils/plugin_registry.py
+++ b/altair/utils/plugin_registry.py
@@ -1,9 +1,10 @@
from __future__ import annotations
import sys
+from collections.abc import Callable
from functools import partial
from importlib.metadata import entry_points
-from typing import TYPE_CHECKING, Any, Callable, Generic, TypeVar, cast
+from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast
from altair.utils.deprecation import deprecated_warn
diff --git a/altair/vegalite/data.py b/altair/vegalite/data.py
index cb2d58a59..1e135a9b7 100644
--- a/altair/vegalite/data.py
+++ b/altair/vegalite/data.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import TYPE_CHECKING, Callable, overload
+from typing import TYPE_CHECKING, overload
from altair.utils.core import sanitize_pandas_dataframe
from altair.utils.data import DataTransformerRegistry as _DataTransformerRegistry
@@ -15,6 +15,8 @@
)
if TYPE_CHECKING:
+ from collections.abc import Callable
+
from altair.utils.data import DataType, ToValuesReturnType
from altair.utils.plugin_registry import PluginEnabler
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index 5b3d93f86..c34748fec 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -720,7 +720,7 @@ def _reveal_parsed_shorthand(obj: Map, /) -> dict[str, Any]:
def _is_extra(*objs: Any, kwds: Map) -> Iterator[bool]:
for el in objs:
- if isinstance(el, (SchemaBase, t.Mapping)):
+ if isinstance(el, (SchemaBase, Mapping)):
item = el.to_dict(validate=False) if isinstance(el, SchemaBase) else el
yield not (item.keys() - kwds.keys()).isdisjoint(utils.SHORTHAND_KEYS)
else:
@@ -854,7 +854,7 @@ def _parse_otherwise(
conditions.update(**kwds) # type: ignore[call-arg]
selection.condition = conditions["condition"]
else:
- if not isinstance(statement, t.Mapping):
+ if not isinstance(statement, Mapping):
statement = _parse_literal(statement)
selection = conditions
selection.update(**statement, **kwds) # type: ignore[call-arg]
diff --git a/sphinxext/code_ref.py b/sphinxext/code_ref.py
index 2eba68a6a..efe9ef5e1 100644
--- a/sphinxext/code_ref.py
+++ b/sphinxext/code_ref.py
@@ -14,8 +14,8 @@
if TYPE_CHECKING:
import sys
- from collections.abc import Iterable, Iterator, Mapping, Sequence
- from typing import Any, Callable, ClassVar, TypeVar, Union
+ from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
+ from typing import Any, ClassVar, TypeVar, Union
from docutils.parsers.rst.states import RSTState, RSTStateMachine
from docutils.statemachine import StringList
diff --git a/tests/expr/test_expr.py b/tests/expr/test_expr.py
index b2200184c..4c662a073 100644
--- a/tests/expr/test_expr.py
+++ b/tests/expr/test_expr.py
@@ -4,7 +4,7 @@
import operator
import sys
from inspect import classify_class_attrs, getmembers, signature
-from typing import TYPE_CHECKING, Any, Callable, TypeVar, cast
+from typing import TYPE_CHECKING, Any, TypeVar, cast
import pytest
from jsonschema.exceptions import ValidationError
@@ -14,7 +14,7 @@
from altair.expr.core import Expression, GetAttrExpression
if TYPE_CHECKING:
- from collections.abc import Iterable, Iterator
+ from collections.abc import Callable, Iterable, Iterator
from inspect import _IntrospectableCallable
T = TypeVar("T")
diff --git a/tests/utils/test_data.py b/tests/utils/test_data.py
index b4d16d3dd..a365f03dd 100644
--- a/tests/utils/test_data.py
+++ b/tests/utils/test_data.py
@@ -1,7 +1,7 @@
from __future__ import annotations
from pathlib import Path
-from typing import Any, Callable, SupportsIndex, TypeVar
+from typing import TYPE_CHECKING, Any, SupportsIndex, TypeVar
import narwhals.stable.v1 as nw
import pandas as pd
@@ -17,6 +17,9 @@
to_values,
)
+if TYPE_CHECKING:
+ from collections.abc import Callable
+
T = TypeVar("T")
diff --git a/tests/utils/test_plugin_registry.py b/tests/utils/test_plugin_registry.py
index 051d2cdcf..d200bbe96 100644
--- a/tests/utils/test_plugin_registry.py
+++ b/tests/utils/test_plugin_registry.py
@@ -1,4 +1,4 @@
-from typing import Callable
+from collections.abc import Callable
from altair.utils.plugin_registry import PluginRegistry
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index 72d01c0fb..1f847e8dd 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -11,7 +11,7 @@
import warnings
from collections import deque
from functools import partial
-from typing import TYPE_CHECKING, Any, Callable
+from typing import TYPE_CHECKING, Any
import jsonschema
import jsonschema.exceptions
@@ -35,7 +35,7 @@
from vega_datasets import data
if TYPE_CHECKING:
- from collections.abc import Iterable, Sequence
+ from collections.abc import Callable, Iterable, Sequence
from narwhals.stable.v1.typing import IntoDataFrame
diff --git a/tests/vegalite/v5/test_theme.py b/tests/vegalite/v5/test_theme.py
index 45eda9637..564f8a6ce 100644
--- a/tests/vegalite/v5/test_theme.py
+++ b/tests/vegalite/v5/test_theme.py
@@ -1,9 +1,9 @@
from __future__ import annotations
import json
-from collections.abc import Mapping, Set
+from collections.abc import Callable, Mapping, Set
from pathlib import Path
-from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, get_args
+from typing import TYPE_CHECKING, Any, Literal, TypeVar, cast, get_args
import pytest
diff --git a/tools/schemapi/codegen.py b/tools/schemapi/codegen.py
index dbb3f5974..ad1f4dcb1 100644
--- a/tools/schemapi/codegen.py
+++ b/tools/schemapi/codegen.py
@@ -5,11 +5,11 @@
import re
import sys
import textwrap
-from collections.abc import Iterable, Iterator
+from collections.abc import Callable, Iterable, Iterator
from dataclasses import dataclass
from itertools import chain, starmap
from operator import attrgetter
-from typing import Any, Callable, ClassVar, Final, Literal, TypeVar, Union
+from typing import Any, ClassVar, Final, Literal, TypeVar, Union
from .utils import (
Grouped,
diff --git a/tools/update_init_file.py b/tools/update_init_file.py
index 5ac9c7cb4..7faa837d3 100644
--- a/tools/update_init_file.py
+++ b/tools/update_init_file.py
@@ -2,8 +2,10 @@
from __future__ import annotations
+import collections.abc as cabc
import typing as t
import typing_extensions as te
+from collections.abc import Sequence
from importlib import import_module as _import_module
from importlib.util import find_spec as _find_spec
from inspect import getattr_static, ismodule
@@ -27,10 +29,10 @@
t.Any,
t.Literal,
t.Union,
- t.Iterable,
+ cabc.Iterable,
t.Protocol,
te.Protocol,
- t.Sequence,
+ Sequence,
t.IO,
annotations,
te.Required,
diff --git a/tools/vega_expr.py b/tools/vega_expr.py
index aa42e5ed6..942bcd6da 100644
--- a/tools/vega_expr.py
+++ b/tools/vega_expr.py
@@ -16,7 +16,7 @@
from itertools import chain
from textwrap import TextWrapper as _TextWrapper
from textwrap import indent
-from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal, overload
+from typing import TYPE_CHECKING, Any, ClassVar, Literal, overload
from tools.codemod import ruff
from tools.markup import RSTParse, Token, read_ast_tokens
@@ -25,7 +25,7 @@
if TYPE_CHECKING:
import sys
- from collections.abc import Iterable, Iterator, Mapping, Sequence
+ from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from pathlib import Path
from re import Match, Pattern
From 582a364fa2c9611099cab6840a26ff326b05074b Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 2 Jan 2025 14:15:47 +0000
Subject: [PATCH 39/53] feat: Show python types in `ValidationError` messages
(#3735)
---
altair/utils/schemapi.py | 59 +++++++++++++++++++++++++++---------
tests/utils/test_schemapi.py | 47 ++++++++++++++--------------
tools/schemapi/schemapi.py | 59 +++++++++++++++++++++++++++---------
3 files changed, 114 insertions(+), 51 deletions(-)
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index 0416c3405..cf5f2e10e 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -7,6 +7,7 @@
import datetime as dt
import inspect
import json
+import operator
import sys
import textwrap
from collections import defaultdict
@@ -48,6 +49,7 @@
from types import ModuleType
from typing import ClassVar
+ from jsonschema.exceptions import ValidationError
from referencing import Registry
from altair.typing import ChartType
@@ -589,7 +591,23 @@ def _resolve_references(
return schema
+def _validator_values(errors: Iterable[ValidationError], /) -> Iterator[str]:
+ """Unwrap each error's ``.validator_value``, convince ``mypy`` it stores a string."""
+ for err in errors:
+ yield cast("str", err.validator_value)
+
+
class SchemaValidationError(jsonschema.ValidationError):
+ _JS_TO_PY: ClassVar[Mapping[str, str]] = {
+ "boolean": "bool",
+ "integer": "int",
+ "number": "float",
+ "string": "str",
+ "null": "None",
+ "object": "Mapping[str, Any]",
+ "array": "Sequence",
+ }
+
def __init__(self, obj: SchemaBase, err: jsonschema.ValidationError) -> None:
"""
A wrapper for ``jsonschema.ValidationError`` with friendlier traceback.
@@ -762,26 +780,39 @@ def split_into_equal_parts(n: int, p: int) -> list[int]:
param_names_table += "\n"
return param_names_table
+ def _format_type_reprs(self, errors: Iterable[ValidationError], /) -> str:
+ """
+ Translate jsonschema types to how they appear in annotations.
+
+ Adapts parts of:
+ - `tools.schemapi.utils.sort_type_reprs`_
+ - `tools.schemapi.utils.SchemaInfo.to_type_repr`_
+
+ .. _tools.schemapi.utils.sort_type_reprs:
+ https://github.com/vega/altair/blob/48e976ef9388ce08a2e871a0f67ed012b914597a/tools/schemapi/utils.py#L1106-L1146
+ .. _tools.schemapi.utils.SchemaInfo.to_type_repr:
+ https://github.com/vega/altair/blob/48e976ef9388ce08a2e871a0f67ed012b914597a/tools/schemapi/utils.py#L449-L543
+ """
+ to_py_types = (
+ self._JS_TO_PY.get(val, val) for val in _validator_values(errors)
+ )
+ it = sorted(to_py_types, key=str.lower)
+ it = sorted(it, key=len)
+ it = sorted(it, key=partial(operator.eq, "None"))
+ return f"of type `{' | '.join(it)}`"
+
def _get_default_error_message(
self,
errors: ValidationErrorList,
) -> str:
bullet_points: list[str] = []
errors_by_validator = _group_errors_by_validator(errors)
- if "enum" in errors_by_validator:
- for error in errors_by_validator["enum"]:
- bullet_points.append(f"one of {error.validator_value}")
-
- if "type" in errors_by_validator:
- types = [f"'{err.validator_value}'" for err in errors_by_validator["type"]]
- point = "of type "
- if len(types) == 1:
- point += types[0]
- elif len(types) == 2:
- point += f"{types[0]} or {types[1]}"
- else:
- point += ", ".join(types[:-1]) + f", or {types[-1]}"
- bullet_points.append(point)
+ if errs_enum := errors_by_validator.get("enum", None):
+ bullet_points.extend(
+ f"one of {val}" for val in _validator_values(errs_enum)
+ )
+ if errs_type := errors_by_validator.get("type", None):
+ bullet_points.append(self._format_type_reprs(errs_type))
# It should not matter which error is specifically used as they are all
# about the same offending instance (i.e. invalid value), so we can just
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index 1f847e8dd..1059b35c1 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -7,6 +7,7 @@
import io
import json
import pickle
+import re
import types
import warnings
from collections import deque
@@ -661,7 +662,7 @@ def id_func_chart_error_example(val) -> str:
chart_funcs_error_message: list[tuple[Callable[..., Any], str]] = [
(
chart_error_example__invalid_y_option_value_unknown_x_option,
- r"""Multiple errors were found.
+ rf"""Multiple errors were found.
Error 1: `X` has no parameter named 'unknown'
@@ -676,21 +677,21 @@ def id_func_chart_error_example(val) -> str:
Error 2: 'asdf' is an invalid value for `stack`. Valid values are:
- One of \['zero', 'center', 'normalize'\]
- - Of type 'null' or 'boolean'$""",
+ - Of type {re.escape("`bool | None`")}$""",
),
(
chart_error_example__wrong_tooltip_type_in_faceted_chart,
- r"""'\['wrong'\]' is an invalid value for `field`. Valid values are of type 'string' or 'object'.$""",
+ rf"""'\['wrong'\]' is an invalid value for `field`. Valid values are of type {re.escape("`str | Mapping[str, Any]`")}.$""",
),
(
chart_error_example__wrong_tooltip_type_in_layered_chart,
- r"""'\['wrong'\]' is an invalid value for `field`. Valid values are of type 'string' or 'object'.$""",
+ rf"""'\['wrong'\]' is an invalid value for `field`. Valid values are of type {re.escape("`str | Mapping[str, Any]`")}.$""",
),
(
chart_error_example__two_errors_in_layered_chart,
- r"""Multiple errors were found.
+ rf"""Multiple errors were found.
- Error 1: '\['wrong'\]' is an invalid value for `field`. Valid values are of type 'string' or 'object'.
+ Error 1: '\['wrong'\]' is an invalid value for `field`. Valid values are of type {re.escape("`str | Mapping[str, Any]`")}.
Error 2: `Color` has no parameter named 'invalidArgument'
@@ -703,17 +704,17 @@ def id_func_chart_error_example(val) -> str:
),
(
chart_error_example__two_errors_in_complex_concat_layered_chart,
- r"""Multiple errors were found.
+ rf"""Multiple errors were found.
- Error 1: '\['wrong'\]' is an invalid value for `field`. Valid values are of type 'string' or 'object'.
+ Error 1: '\['wrong'\]' is an invalid value for `field`. Valid values are of type {re.escape("`str | Mapping[str, Any]`")}.
- Error 2: '4' is an invalid value for `bandPosition`. Valid values are of type 'number'.$""",
+ Error 2: '4' is an invalid value for `bandPosition`. Valid values are of type `float`.$""",
),
(
chart_error_example__three_errors_in_complex_concat_layered_chart,
- r"""Multiple errors were found.
+ rf"""Multiple errors were found.
- Error 1: '\['wrong'\]' is an invalid value for `field`. Valid values are of type 'string' or 'object'.
+ Error 1: '\['wrong'\]' is an invalid value for `field`. Valid values are of type {re.escape("`str | Mapping[str, Any]`")}.
Error 2: `Color` has no parameter named 'invalidArgument'
@@ -724,7 +725,7 @@ def id_func_chart_error_example(val) -> str:
See the help for `Color` to read the full description of these parameters
- Error 3: '4' is an invalid value for `bandPosition`. Valid values are of type 'number'.$""",
+ Error 3: '4' is an invalid value for `bandPosition`. Valid values are of type `float`.$""",
),
(
chart_error_example__two_errors_with_one_in_nested_layered_chart,
@@ -764,25 +765,25 @@ def id_func_chart_error_example(val) -> str:
),
(
chart_error_example__invalid_y_option_value,
- r"""'asdf' is an invalid value for `stack`. Valid values are:
+ rf"""'asdf' is an invalid value for `stack`. Valid values are:
- One of \['zero', 'center', 'normalize'\]
- - Of type 'null' or 'boolean'$""",
+ - Of type {re.escape("`bool | None`")}$""",
),
(
chart_error_example__invalid_y_option_value_with_condition,
- r"""'asdf' is an invalid value for `stack`. Valid values are:
+ rf"""'asdf' is an invalid value for `stack`. Valid values are:
- One of \['zero', 'center', 'normalize'\]
- - Of type 'null' or 'boolean'$""",
+ - Of type {re.escape("`bool | None`")}$""",
),
(
chart_error_example__hconcat,
- r"""'{'text': 'Horsepower', 'align': 'right'}' is an invalid value for `title`. Valid values are of type 'string', 'array', or 'null'.$""",
+ rf"""'{{'text': 'Horsepower', 'align': 'right'}}' is an invalid value for `title`. Valid values are of type {re.escape("`str | Sequence | None`")}.$""",
),
(
chart_error_example__invalid_timeunit_value,
- r"""'invalid_value' is an invalid value for `timeUnit`. Valid values are:
+ rf"""'invalid_value' is an invalid value for `timeUnit`. Valid values are:
- One of \['year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds'\]
- One of \['utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds'\]
@@ -790,20 +791,20 @@ def id_func_chart_error_example(val) -> str:
- One of \['utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds'\]
- One of \['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear'\]
- One of \['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear'\]
- - Of type 'object'$""",
+ - Of type {re.escape("`Mapping[str, Any]`")}$""",
),
(
chart_error_example__invalid_sort_value,
- r"""'invalid_value' is an invalid value for `sort`. Valid values are:
+ rf"""'invalid_value' is an invalid value for `sort`. Valid values are:
- One of \['ascending', 'descending'\]
- One of \['x', 'y', 'color', 'fill', 'stroke', 'strokeWidth', 'size', 'shape', 'fillOpacity', 'strokeOpacity', 'opacity', 'text'\]
- One of \['-x', '-y', '-color', '-fill', '-stroke', '-strokeWidth', '-size', '-shape', '-fillOpacity', '-strokeOpacity', '-opacity', '-text'\]
- - Of type 'array', 'object', or 'null'$""",
+ - Of type {re.escape("`Sequence | Mapping[str, Any] | None`")}$""",
),
(
chart_error_example__invalid_bandposition_value,
- r"""'4' is an invalid value for `bandPosition`. Valid values are of type 'number'.$""",
+ r"""'4' is an invalid value for `bandPosition`. Valid values are of type `float`.$""",
),
(
chart_error_example__invalid_type,
@@ -823,7 +824,7 @@ def id_func_chart_error_example(val) -> str:
),
(
chart_error_example__invalid_value_type,
- r"""'1' is an invalid value for `value`. Valid values are of type 'object', 'string', or 'null'.$""",
+ rf"""'1' is an invalid value for `value`. Valid values are of type {re.escape("`str | Mapping[str, Any] | None`")}.$""",
),
(
chart_error_example__four_errors_hide_fourth,
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index b19ddad73..5ee638266 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -5,6 +5,7 @@
import datetime as dt
import inspect
import json
+import operator
import sys
import textwrap
from collections import defaultdict
@@ -46,6 +47,7 @@
from types import ModuleType
from typing import ClassVar
+ from jsonschema.exceptions import ValidationError
from referencing import Registry
from altair.typing import ChartType
@@ -587,7 +589,23 @@ def _resolve_references(
return schema
+def _validator_values(errors: Iterable[ValidationError], /) -> Iterator[str]:
+ """Unwrap each error's ``.validator_value``, convince ``mypy`` it stores a string."""
+ for err in errors:
+ yield cast("str", err.validator_value)
+
+
class SchemaValidationError(jsonschema.ValidationError):
+ _JS_TO_PY: ClassVar[Mapping[str, str]] = {
+ "boolean": "bool",
+ "integer": "int",
+ "number": "float",
+ "string": "str",
+ "null": "None",
+ "object": "Mapping[str, Any]",
+ "array": "Sequence",
+ }
+
def __init__(self, obj: SchemaBase, err: jsonschema.ValidationError) -> None:
"""
A wrapper for ``jsonschema.ValidationError`` with friendlier traceback.
@@ -760,26 +778,39 @@ def split_into_equal_parts(n: int, p: int) -> list[int]:
param_names_table += "\n"
return param_names_table
+ def _format_type_reprs(self, errors: Iterable[ValidationError], /) -> str:
+ """
+ Translate jsonschema types to how they appear in annotations.
+
+ Adapts parts of:
+ - `tools.schemapi.utils.sort_type_reprs`_
+ - `tools.schemapi.utils.SchemaInfo.to_type_repr`_
+
+ .. _tools.schemapi.utils.sort_type_reprs:
+ https://github.com/vega/altair/blob/48e976ef9388ce08a2e871a0f67ed012b914597a/tools/schemapi/utils.py#L1106-L1146
+ .. _tools.schemapi.utils.SchemaInfo.to_type_repr:
+ https://github.com/vega/altair/blob/48e976ef9388ce08a2e871a0f67ed012b914597a/tools/schemapi/utils.py#L449-L543
+ """
+ to_py_types = (
+ self._JS_TO_PY.get(val, val) for val in _validator_values(errors)
+ )
+ it = sorted(to_py_types, key=str.lower)
+ it = sorted(it, key=len)
+ it = sorted(it, key=partial(operator.eq, "None"))
+ return f"of type `{' | '.join(it)}`"
+
def _get_default_error_message(
self,
errors: ValidationErrorList,
) -> str:
bullet_points: list[str] = []
errors_by_validator = _group_errors_by_validator(errors)
- if "enum" in errors_by_validator:
- for error in errors_by_validator["enum"]:
- bullet_points.append(f"one of {error.validator_value}")
-
- if "type" in errors_by_validator:
- types = [f"'{err.validator_value}'" for err in errors_by_validator["type"]]
- point = "of type "
- if len(types) == 1:
- point += types[0]
- elif len(types) == 2:
- point += f"{types[0]} or {types[1]}"
- else:
- point += ", ".join(types[:-1]) + f", or {types[-1]}"
- bullet_points.append(point)
+ if errs_enum := errors_by_validator.get("enum", None):
+ bullet_points.extend(
+ f"one of {val}" for val in _validator_values(errs_enum)
+ )
+ if errs_type := errors_by_validator.get("type", None):
+ bullet_points.append(self._format_type_reprs(errs_type))
# It should not matter which error is specifically used as they are all
# about the same offending instance (i.e. invalid value), so we can just
From 709bbdf298c1404b352c2e4733fdef96700d6fc3 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 2 Jan 2025 19:48:30 +0000
Subject: [PATCH 40/53] chore(typing): fix `mypy>=1.14.0` warnings (#3739)
---
tools/markup.py | 40 ++++++++++++++++++++++++++--------------
tools/vega_expr.py | 21 ++++-----------------
2 files changed, 30 insertions(+), 31 deletions(-)
diff --git a/tools/markup.py b/tools/markup.py
index 88239299c..176719022 100644
--- a/tools/markup.py
+++ b/tools/markup.py
@@ -34,6 +34,21 @@
_RE_LIQUID_INCLUDE: Pattern[str] = re.compile(r"( \{% include.+%\})")
+_PRE_PARSE_REPLACEMENTS: tuple[str, str] = (
+ "https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)",
+ "https://en.wikipedia.org/wiki/Continuous_uniform_distribution",
+)
+"""
+Replacement to apply *prior* to parsing as markdown.
+
+**HACK**: Closing parenthesis messes up markdown parsing, replace with resolved redirect wikipedia URL.
+
+TODO
+----
+Remove if this gets fixed upstream, via https://github.com/vega/vega/pull/3996
+"""
+
+
class RSTRenderer(_RSTRenderer):
def __init__(self) -> None:
super().__init__()
@@ -68,8 +83,11 @@ def __init__(
super().__init__(renderer, block, inline, plugins)
def __call__(self, s: str) -> str:
- s = super().__call__(s) # pyright: ignore[reportAssignmentType]
- return unescape(s).replace(r"\ ,", ",").replace(r"\ ", " ")
+ r = super().__call__(s)
+ if isinstance(r, str):
+ return unescape(r).replace(r"\ ,", ",").replace(r"\ ", " ")
+ msg = f"Expected `str` but got {type(r).__name__!r}"
+ raise TypeError(msg)
def render_tokens(self, tokens: Iterable[Token], /) -> str:
"""
@@ -129,14 +147,12 @@ def process_text(self, text: str, state: InlineState) -> None:
Removes `liquid`_ templating markup.
.. _liquid:
- https://shopify.github.io/liquid/
+ https://shopify.github.io/liquid/
"""
state.append_token({"type": "text", "raw": _RE_LIQUID_INCLUDE.sub(r"", text)})
-def read_ast_tokens(
- source: Url | Path, /, replacements: list[tuple[str, str]] | None = None
-) -> list[Token]:
+def read_ast_tokens(source: Url | Path, /) -> list[Token]:
"""
Read from ``source``, drop ``BlockState``.
@@ -144,17 +160,13 @@ def read_ast_tokens(
"""
markdown = _Markdown(renderer=None, inline=InlineParser())
if isinstance(source, Path):
- token_text = source.read_text()
+ text = source.read_text()
else:
with request.urlopen(source) as response:
- token_text = response.read().decode("utf-8")
-
- # Apply replacements
- if replacements:
- for replacement in replacements:
- token_text = token_text.replace(replacement[0], replacement[1])
+ text = response.read().decode("utf-8")
- tokens = markdown.parse(token_text, markdown.block.state_cls())
+ text = text.replace(*_PRE_PARSE_REPLACEMENTS)
+ tokens: Any = markdown.parse(text)
return tokens[0]
diff --git a/tools/vega_expr.py b/tools/vega_expr.py
index 942bcd6da..7e7a33035 100644
--- a/tools/vega_expr.py
+++ b/tools/vega_expr.py
@@ -47,14 +47,6 @@
EXPRESSIONS_DOCS_URL: LiteralString = f"{VEGA_DOCS_URL}expressions/"
EXPRESSIONS_URL_TEMPLATE = "https://raw.githubusercontent.com/vega/vega/refs/tags/{version}/docs/docs/expressions.md"
-# Replacements to apply prior to parsing as markdown
-PRE_PARSE_REPLACEMENTS = [
- # Closing paren messes up markdown parsing, replace with equivalent wikipedia URL
- (
- "https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)",
- "https://en.wikipedia.org/wiki/Continuous_uniform_distribution",
- )
-]
# NOTE: Regex patterns
FUNCTION_DEF_LINE: Pattern[str] = re.compile(
@@ -939,15 +931,13 @@ def italics_to_backticks(s: str, names: Iterable[str], /) -> str:
return re.sub(pattern, r"\g``\g``\g", s)
-def parse_expressions(
- source: Url | Path, /, replacements: list[tuple[str, str]] | None = None
-) -> Iterator[VegaExprDef]:
+def parse_expressions(source: Url | Path, /) -> Iterator[VegaExprDef]:
"""
Download remote or read local `.md` resource and eagerly parse signatures of relevant definitions.
Yields with docs to ensure each can use all remapped names, regardless of the order they appear.
"""
- tokens = read_ast_tokens(source, replacements=replacements)
+ tokens = read_ast_tokens(source)
expr_defs = tuple(VegaExprDef.from_tokens(tokens))
VegaExprDef.remap_title.refresh()
for expr_def in expr_defs:
@@ -971,7 +961,7 @@ def write_expr_module(version: str, output: Path, *, header: str) -> None:
# Retrieve all of the links used in expr method docstrings,
# so we can include them in the class docstrings, so that sphinx
# will find them.
- expr_defs = parse_expressions(url, replacements=PRE_PARSE_REPLACEMENTS)
+ expr_defs = parse_expressions(url)
links = {}
rst_renderer = RSTRenderer()
@@ -1001,10 +991,7 @@ def write_expr_module(version: str, output: Path, *, header: str) -> None:
)
contents = chain(
content,
- (
- expr_def.render()
- for expr_def in parse_expressions(url, replacements=PRE_PARSE_REPLACEMENTS)
- ),
+ (expr_def.render() for expr_def in parse_expressions(url)),
[MODULE_POST],
)
print(f"Generating\n {url!s}\n ->{output!s}")
From b6253ffc120c5a03661a6ec55e3c9375d716d873 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 2 Jan 2025 20:58:22 +0000
Subject: [PATCH 41/53] fix(typing): Resolve LSP violation for `ChartType.data`
(#3740)
---
altair/vegalite/v5/api.py | 15 +++++--------
altair/vegalite/v5/schema/core.py | 37 ++++++++++++++++---------------
tools/generate_schema_wrapper.py | 2 ++
tools/schemapi/utils.py | 5 +++++
4 files changed, 32 insertions(+), 27 deletions(-)
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index c34748fec..e46e3070a 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -3939,11 +3939,8 @@ def __init__(
height: Optional[int | dict | Step | Literal["container"]] = Undefined,
**kwargs: Any,
) -> None:
- # Data type hints won't match with what TopLevelUnitSpec expects
- # as there is some data processing happening when converting to
- # a VL spec
super().__init__(
- data=data, # type: ignore[arg-type]
+ data=data,
encoding=encoding,
mark=mark,
width=width,
@@ -4328,7 +4325,7 @@ def __init__(
) -> None:
for spec in concat:
_check_if_valid_subspec(spec, "ConcatChart")
- super().__init__(data=data, concat=list(concat), columns=columns, **kwargs) # type: ignore[arg-type]
+ super().__init__(data=data, concat=list(concat), columns=columns, **kwargs)
self.concat: list[ChartType]
self.params: Optional[Sequence[_Parameter]]
self.data: Optional[ChartDataType]
@@ -4432,7 +4429,7 @@ def __init__(
) -> None:
for spec in hconcat:
_check_if_valid_subspec(spec, "HConcatChart")
- super().__init__(data=data, hconcat=list(hconcat), **kwargs) # type: ignore[arg-type]
+ super().__init__(data=data, hconcat=list(hconcat), **kwargs)
self.hconcat: list[ChartType]
self.params: Optional[Sequence[_Parameter]]
self.data: Optional[ChartDataType]
@@ -4536,7 +4533,7 @@ def __init__(
) -> None:
for spec in vconcat:
_check_if_valid_subspec(spec, "VConcatChart")
- super().__init__(data=data, vconcat=list(vconcat), **kwargs) # type: ignore[arg-type]
+ super().__init__(data=data, vconcat=list(vconcat), **kwargs)
self.vconcat: list[ChartType]
self.params: Optional[Sequence[_Parameter]]
self.data: Optional[ChartDataType]
@@ -4644,7 +4641,7 @@ def __init__(
for spec in layer:
_check_if_valid_subspec(spec, "LayerChart")
_check_if_can_be_layered(spec)
- super().__init__(data=data, layer=list(layer), **kwargs) # type: ignore[arg-type]
+ super().__init__(data=data, layer=list(layer), **kwargs)
self.layer: list[ChartType]
self.params: Optional[Sequence[_Parameter]]
self.data: Optional[ChartDataType]
@@ -4775,7 +4772,7 @@ def __init__(
_spec_as_list = [spec]
params, _spec_as_list = _combine_subchart_params(params, _spec_as_list)
spec = _spec_as_list[0]
- super().__init__(data=data, spec=spec, facet=facet, params=params, **kwargs) # type: ignore[arg-type]
+ super().__init__(data=data, spec=spec, facet=facet, params=params, **kwargs)
self.data: Optional[ChartDataType]
self.spec: ChartType
self.params: Optional[Sequence[_Parameter]]
diff --git a/altair/vegalite/v5/schema/core.py b/altair/vegalite/v5/schema/core.py
index fa2df587a..a2481bafc 100644
--- a/altair/vegalite/v5/schema/core.py
+++ b/altair/vegalite/v5/schema/core.py
@@ -20,6 +20,7 @@
from altair import Parameter
from altair.typing import Optional
+ from altair.vegalite.v5.api import ChartDataType
from ._typing import * # noqa: F403
@@ -7887,7 +7888,7 @@ class GenericUnitSpecEncodingAnyMark(VegaLiteSchema):
def __init__(
self,
mark: Optional[SchemaBase | Map | Mark_T | CompositeMark_T] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
encoding: Optional[SchemaBase | Map] = Undefined,
name: Optional[str] = Undefined,
@@ -11062,7 +11063,7 @@ class LookupData(VegaLiteSchema):
def __init__(
self,
- data: Optional[SchemaBase | Map] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map] = Undefined,
key: Optional[str | SchemaBase] = Undefined,
fields: Optional[Sequence[str | SchemaBase]] = Undefined,
**kwds,
@@ -21055,7 +21056,7 @@ def __init__(
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool | SchemaBase | Map] = Undefined,
columns: Optional[float] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
resolve: Optional[SchemaBase | Map] = Undefined,
@@ -21182,7 +21183,7 @@ def __init__(
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool | SchemaBase | Map] = Undefined,
columns: Optional[float] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
resolve: Optional[SchemaBase | Map] = Undefined,
@@ -21340,7 +21341,7 @@ def __init__(
align: Optional[SchemaBase | Map | LayoutAlign_T] = Undefined,
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool | SchemaBase | Map] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
encoding: Optional[SchemaBase | Map] = Undefined,
height: Optional[float | SchemaBase | Literal["container"] | Map] = Undefined,
@@ -21429,7 +21430,7 @@ def __init__(
hconcat: Optional[Sequence[SchemaBase | Map]] = Undefined,
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
resolve: Optional[SchemaBase | Map] = Undefined,
@@ -21537,7 +21538,7 @@ class LayerSpec(Spec, NonNormalizedSpec):
def __init__(
self,
layer: Optional[Sequence[SchemaBase | Map]] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
encoding: Optional[SchemaBase | Map] = Undefined,
height: Optional[float | SchemaBase | Literal["container"] | Map] = Undefined,
@@ -21677,7 +21678,7 @@ def __init__(
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool | SchemaBase | Map] = Undefined,
columns: Optional[float] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
resolve: Optional[SchemaBase | Map] = Undefined,
@@ -21807,7 +21808,7 @@ def __init__(
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool | SchemaBase | Map] = Undefined,
columns: Optional[float] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
resolve: Optional[SchemaBase | Map] = Undefined,
@@ -24400,7 +24401,7 @@ def __init__(
center: Optional[bool | SchemaBase | Map] = Undefined,
columns: Optional[float] = Undefined,
config: Optional[SchemaBase | Map] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
datasets: Optional[SchemaBase | Map] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
@@ -24565,7 +24566,7 @@ class TopLevelFacetSpec(TopLevelSpec):
def __init__(
self,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
facet: Optional[SchemaBase | Map] = Undefined,
spec: Optional[SchemaBase | Map] = Undefined,
align: Optional[SchemaBase | Map | LayoutAlign_T] = Undefined,
@@ -24704,7 +24705,7 @@ def __init__(
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool] = Undefined,
config: Optional[SchemaBase | Map] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
datasets: Optional[SchemaBase | Map] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
@@ -24860,7 +24861,7 @@ def __init__(
str | Parameter | SchemaBase | Map | ColorName_T
] = Undefined,
config: Optional[SchemaBase | Map] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
datasets: Optional[SchemaBase | Map] = Undefined,
description: Optional[str] = Undefined,
encoding: Optional[SchemaBase | Map] = Undefined,
@@ -25067,7 +25068,7 @@ class TopLevelUnitSpec(TopLevelSpec):
def __init__(
self,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
mark: Optional[SchemaBase | Map | Mark_T | CompositeMark_T] = Undefined,
align: Optional[SchemaBase | Map | LayoutAlign_T] = Undefined,
autosize: Optional[SchemaBase | Map | AutosizeType_T] = Undefined,
@@ -25212,7 +25213,7 @@ def __init__(
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool] = Undefined,
config: Optional[SchemaBase | Map] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
datasets: Optional[SchemaBase | Map] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
@@ -26229,7 +26230,7 @@ class UnitSpec(VegaLiteSchema):
def __init__(
self,
mark: Optional[SchemaBase | Map | Mark_T | CompositeMark_T] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
encoding: Optional[SchemaBase | Map] = Undefined,
name: Optional[str] = Undefined,
@@ -26333,7 +26334,7 @@ class UnitSpecWithFrame(VegaLiteSchema):
def __init__(
self,
mark: Optional[SchemaBase | Map | Mark_T | CompositeMark_T] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
encoding: Optional[SchemaBase | Map] = Undefined,
height: Optional[float | SchemaBase | Literal["container"] | Map] = Undefined,
@@ -26460,7 +26461,7 @@ def __init__(
vconcat: Optional[Sequence[SchemaBase | Map]] = Undefined,
bounds: Optional[Literal["full", "flush"]] = Undefined,
center: Optional[bool] = Undefined,
- data: Optional[SchemaBase | Map | None] = Undefined,
+ data: Optional[SchemaBase | ChartDataType | Map | None] = Undefined,
description: Optional[str] = Undefined,
name: Optional[str] = Undefined,
resolve: Optional[SchemaBase | Map] = Undefined,
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index f68771e52..9dcda556a 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -269,6 +269,7 @@ class {name}(TypedDict{metaclass_kwds}):{comment}
BIN: Literal["Bin"] = "Bin"
IMPUTE: Literal["Impute"] = "Impute"
INTO_CONDITION: Literal["IntoCondition"] = "IntoCondition"
+CHART_DATA_TYPE: Literal["ChartDataType"] = "ChartDataType"
# NOTE: `core.py` typing imports
DATETIME: Literal["DateTime"] = "DateTime"
@@ -761,6 +762,7 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> ModuleDef[str]:
"from datetime import date, datetime",
"from altair import Parameter",
"from altair.typing import Optional",
+ f"from altair.vegalite.v5.api import {CHART_DATA_TYPE}",
"from ._typing import * # noqa: F403",
),
"\n" f"__all__ = {all_}\n",
diff --git a/tools/schemapi/utils.py b/tools/schemapi/utils.py
index caf2cec2b..000488cce 100644
--- a/tools/schemapi/utils.py
+++ b/tools/schemapi/utils.py
@@ -613,6 +613,8 @@ def title_to_type_reprs(self, *, use_concrete: bool) -> set[str]:
tps.add("Parameter")
if self.is_datetime():
tps.add("Temporal")
+ if self.is_top_level_spec_data():
+ tps.add("ChartDataType")
elif self.is_value():
value = self.properties["value"]
t = value.to_type_repr(target="annotation", use_concrete=use_concrete)
@@ -969,6 +971,9 @@ def is_theme_config_target(self) -> bool:
def is_datetime(self) -> bool:
return self.refname == "DateTime"
+ def is_top_level_spec_data(self) -> bool:
+ return self.refname == "Data"
+
class Grouped(Generic[T]):
"""
From be5e9ecd61d099c847dca44fb3a4283940c1e3b8 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Fri, 3 Jan 2025 17:53:46 +0000
Subject: [PATCH 42/53] chore(ruff): Fix `UP006` warnings during codegen
(#3746)
---
tools/generate_schema_wrapper.py | 12 ++++++++----
tools/schemapi/utils.py | 3 ++-
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index 9dcda556a..eab9afa71 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -753,7 +753,8 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> ModuleDef[str]:
all_ = [*sorted(it), "Root", "VegaLiteSchema", "SchemaBase", "load_schema"]
contents = [
HEADER,
- "from typing import Any, Literal, Union, Protocol, Sequence, List, Iterator, TYPE_CHECKING",
+ "from collections.abc import Iterator, Sequence",
+ "from typing import Any, Literal, Union, Protocol, TYPE_CHECKING",
"import pkgutil",
"import json\n",
"import narwhals.stable.v1 as nw\n",
@@ -871,7 +872,8 @@ def generate_vegalite_channel_wrappers(fp: Path, /) -> ModuleDef[list[str]]:
all_ = sorted(chain(it, COMPAT_EXPORTS))
imports = [
"import sys",
- "from typing import Any, overload, Sequence, List, Literal, Union, TYPE_CHECKING, TypedDict",
+ "from collections.abc import Sequence",
+ "from typing import Any, overload, Literal, Union, TYPE_CHECKING, TypedDict",
import_typing_extensions((3, 10), "TypeAlias"),
"import narwhals.stable.v1 as nw",
"from altair.utils.schemapi import Undefined, with_property_setters",
@@ -1226,7 +1228,8 @@ def vegalite_main(skip_download: bool = False) -> None:
fp_mixins = schemapath / "mixins.py"
print(f"Generating\n {schemafile!s}\n ->{fp_mixins!s}")
mixins_imports = (
- "from typing import Any, Sequence, List, Literal, Union",
+ "from collections.abc import Sequence",
+ "from typing import Any, Literal, Union",
"from altair.utils import use_signature, Undefined, SchemaBase",
"from . import core",
)
@@ -1256,7 +1259,8 @@ def vegalite_main(skip_download: bool = False) -> None:
fp_theme_config: Path = schemapath / "_config.py"
content_theme_config = [
HEADER,
- "from typing import Any, TYPE_CHECKING, Literal, Sequence, TypedDict, Union",
+ "from collections.abc import Sequence",
+ "from typing import Any, TYPE_CHECKING, Literal, TypedDict, Union",
import_typing_extensions((3, 14), "TypedDict", include_sys=True),
f"from ._typing import {ROW_COL_KWDS}, {PADDING_KWDS}",
"\n\n",
diff --git a/tools/schemapi/utils.py b/tools/schemapi/utils.py
index 000488cce..a9426f15c 100644
--- a/tools/schemapi/utils.py
+++ b/tools/schemapi/utils.py
@@ -124,7 +124,8 @@ def __init__(self, fmt: str = "{}_T") -> None:
"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",
+ "from collections.abc import Sequence, Mapping",
+ "from typing import Annotated, Any, Generic, Literal, TypeVar, Union, get_args",
"import re",
import_typing_extensions(
(3, 14), "TypedDict", reason="https://peps.python.org/pep-0728/"
From 2b7e9b3eab13feee1705484d6d1f2e882c93ae9f Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 6 Jan 2025 15:08:53 +0000
Subject: [PATCH 43/53] fix: Replace circular import in `schemapi.py` (#3751)
---
altair/utils/schemapi.py | 12 +++++-------
tools/schemapi/schemapi.py | 12 +++++-------
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index cf5f2e10e..638f2f50f 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -35,11 +35,6 @@
import narwhals.stable.v1 as nw
from packaging.version import Version
-# This leads to circular imports with the vegalite module. Currently, this works
-# but be aware that when you access it in this script, the vegalite module might
-# not yet be fully instantiated in case your code is being executed during import time
-from altair import vegalite
-
if sys.version_info >= (3, 12):
from typing import Protocol, TypeAliasType, runtime_checkable
else:
@@ -709,6 +704,8 @@ def _get_altair_class_for_error(
This should lead to more informative error messages pointing the user closer to the source of the issue.
"""
+ from altair import vegalite
+
for prop_name in reversed(error.absolute_path):
# Check if str as e.g. first item can be a 0
if isinstance(prop_name, str):
@@ -1597,14 +1594,15 @@ def __init__(self, prop: str, schema: dict[str, Any]) -> None:
self.schema = schema
def __get__(self, obj, cls):
+ from altair import vegalite
+
self.obj = obj
self.cls = cls
# The docs from the encoding class parameter (e.g. `bin` in X, Color,
# etc); this provides a general description of the parameter.
self.__doc__ = self.schema["description"].replace("__", "**")
property_name = f"{self.prop}"[0].upper() + f"{self.prop}"[1:]
- if hasattr(vegalite, property_name):
- altair_prop = getattr(vegalite, property_name)
+ if altair_prop := getattr(vegalite, property_name, None):
# Add the docstring from the helper class (e.g. `BinParams`) so
# that all the parameter names of the helper class are included in
# the final docstring
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index 5ee638266..24de6faae 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -33,11 +33,6 @@
import narwhals.stable.v1 as nw
from packaging.version import Version
-# This leads to circular imports with the vegalite module. Currently, this works
-# but be aware that when you access it in this script, the vegalite module might
-# not yet be fully instantiated in case your code is being executed during import time
-from altair import vegalite
-
if sys.version_info >= (3, 12):
from typing import Protocol, TypeAliasType, runtime_checkable
else:
@@ -707,6 +702,8 @@ def _get_altair_class_for_error(
This should lead to more informative error messages pointing the user closer to the source of the issue.
"""
+ from altair import vegalite
+
for prop_name in reversed(error.absolute_path):
# Check if str as e.g. first item can be a 0
if isinstance(prop_name, str):
@@ -1595,14 +1592,15 @@ def __init__(self, prop: str, schema: dict[str, Any]) -> None:
self.schema = schema
def __get__(self, obj, cls):
+ from altair import vegalite
+
self.obj = obj
self.cls = cls
# The docs from the encoding class parameter (e.g. `bin` in X, Color,
# etc); this provides a general description of the parameter.
self.__doc__ = self.schema["description"].replace("__", "**")
property_name = f"{self.prop}"[0].upper() + f"{self.prop}"[1:]
- if hasattr(vegalite, property_name):
- altair_prop = getattr(vegalite, property_name)
+ if altair_prop := getattr(vegalite, property_name, None):
# Add the docstring from the helper class (e.g. `BinParams`) so
# that all the parameter names of the helper class are included in
# the final docstring
From f0de7f24987ab87b3df825a7f5e8143bdd3e8645 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 6 Jan 2025 17:49:22 +0000
Subject: [PATCH 44/53] fix: Include `*(Datum|Value)` in
`SchemaValidationError` (#3750)
---
altair/utils/schemapi.py | 53 +++++++++++++++++++++++++++++-------
tests/utils/test_schemapi.py | 25 +++++++++++++----
tools/schemapi/schemapi.py | 53 +++++++++++++++++++++++++++++-------
3 files changed, 105 insertions(+), 26 deletions(-)
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index 638f2f50f..a4af084b9 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -592,6 +592,42 @@ def _validator_values(errors: Iterable[ValidationError], /) -> Iterator[str]:
yield cast("str", err.validator_value)
+def _iter_channels(tp: type[Any], spec: Mapping[str, Any], /) -> Iterator[type[Any]]:
+ from altair import vegalite
+
+ for channel_type in ("datum", "value"):
+ if channel_type in spec:
+ name = f"{tp.__name__}{channel_type.capitalize()}"
+ if narrower := getattr(vegalite, name, None):
+ yield narrower
+
+
+def _is_channel(obj: Any) -> TypeIs[dict[str, Any]]:
+ props = {"datum", "value"}
+ return (
+ _is_dict(obj)
+ and all(isinstance(k, str) for k in obj)
+ and not (props.isdisjoint(obj))
+ )
+
+
+def _maybe_channel(tp: type[Any], spec: Any, /) -> type[Any]:
+ """
+ Replace a channel type with a `more specific`_ one or passthrough unchanged.
+
+ Parameters
+ ----------
+ tp
+ An imported ``SchemaBase`` class.
+ spec
+ The instance that failed validation.
+
+ .. _more specific:
+ https://github.com/vega/altair/issues/2913#issuecomment-2571762700
+ """
+ return next(_iter_channels(tp, spec), tp) if _is_channel(spec) else tp
+
+
class SchemaValidationError(jsonschema.ValidationError):
_JS_TO_PY: ClassVar[Mapping[str, str]] = {
"boolean": "bool",
@@ -703,22 +739,19 @@ def _get_altair_class_for_error(
Try to get the lowest class possible in the chart hierarchy so it can be displayed in the error message.
This should lead to more informative error messages pointing the user closer to the source of the issue.
+
+ If we did not find a suitable class based on traversing the path so we fall
+ back on the class of the top-level object which created the SchemaValidationError
"""
from altair import vegalite
for prop_name in reversed(error.absolute_path):
# Check if str as e.g. first item can be a 0
if isinstance(prop_name, str):
- potential_class_name = prop_name[0].upper() + prop_name[1:]
- cls = getattr(vegalite, potential_class_name, None)
- if cls is not None:
- break
- else:
- # Did not find a suitable class based on traversing the path so we fall
- # back on the class of the top-level object which created
- # the SchemaValidationError
- cls = self.obj.__class__
- return cls
+ candidate = prop_name[0].upper() + prop_name[1:]
+ if tp := getattr(vegalite, candidate, None):
+ return _maybe_channel(tp, self.instance)
+ return type(self.obj)
@staticmethod
def _format_params_as_table(param_dict_keys: Iterable[str]) -> str:
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index 1059b35c1..86f7e925b 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -522,6 +522,11 @@ def chart_error_example__additional_datum_argument():
return alt.Chart().mark_point().encode(x=alt.datum(1, wrong_argument=1))
+def chart_error_example__additional_value_argument():
+ # Error: `ColorValue` has no parameter named 'predicate'
+ return alt.Chart().mark_point().encode(color=alt.value("red", predicate=True))
+
+
def chart_error_example__invalid_value_type():
# Error: Value cannot be an integer in this case
return (
@@ -812,15 +817,23 @@ def id_func_chart_error_example(val) -> str:
),
(
chart_error_example__additional_datum_argument,
- r"""`X` has no parameter named 'wrong_argument'
+ r"""`XDatum` has no parameter named 'wrong_argument'
+
+ Existing parameter names are:
+ datum impute title
+ axis scale type
+ bandPosition stack
+
+ See the help for `XDatum` to read the full description of these parameters$""",
+ ),
+ (
+ chart_error_example__additional_value_argument,
+ r"""`ColorValue` has no parameter named 'predicate'
Existing parameter names are:
- shorthand bin scale timeUnit
- aggregate field sort title
- axis impute stack type
- bandPosition
+ value condition
- See the help for `X` to read the full description of these parameters$""",
+ See the help for `ColorValue` to read the full description of these parameters$""",
),
(
chart_error_example__invalid_value_type,
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index 24de6faae..60e8182a7 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -590,6 +590,42 @@ def _validator_values(errors: Iterable[ValidationError], /) -> Iterator[str]:
yield cast("str", err.validator_value)
+def _iter_channels(tp: type[Any], spec: Mapping[str, Any], /) -> Iterator[type[Any]]:
+ from altair import vegalite
+
+ for channel_type in ("datum", "value"):
+ if channel_type in spec:
+ name = f"{tp.__name__}{channel_type.capitalize()}"
+ if narrower := getattr(vegalite, name, None):
+ yield narrower
+
+
+def _is_channel(obj: Any) -> TypeIs[dict[str, Any]]:
+ props = {"datum", "value"}
+ return (
+ _is_dict(obj)
+ and all(isinstance(k, str) for k in obj)
+ and not (props.isdisjoint(obj))
+ )
+
+
+def _maybe_channel(tp: type[Any], spec: Any, /) -> type[Any]:
+ """
+ Replace a channel type with a `more specific`_ one or passthrough unchanged.
+
+ Parameters
+ ----------
+ tp
+ An imported ``SchemaBase`` class.
+ spec
+ The instance that failed validation.
+
+ .. _more specific:
+ https://github.com/vega/altair/issues/2913#issuecomment-2571762700
+ """
+ return next(_iter_channels(tp, spec), tp) if _is_channel(spec) else tp
+
+
class SchemaValidationError(jsonschema.ValidationError):
_JS_TO_PY: ClassVar[Mapping[str, str]] = {
"boolean": "bool",
@@ -701,22 +737,19 @@ def _get_altair_class_for_error(
Try to get the lowest class possible in the chart hierarchy so it can be displayed in the error message.
This should lead to more informative error messages pointing the user closer to the source of the issue.
+
+ If we did not find a suitable class based on traversing the path so we fall
+ back on the class of the top-level object which created the SchemaValidationError
"""
from altair import vegalite
for prop_name in reversed(error.absolute_path):
# Check if str as e.g. first item can be a 0
if isinstance(prop_name, str):
- potential_class_name = prop_name[0].upper() + prop_name[1:]
- cls = getattr(vegalite, potential_class_name, None)
- if cls is not None:
- break
- else:
- # Did not find a suitable class based on traversing the path so we fall
- # back on the class of the top-level object which created
- # the SchemaValidationError
- cls = self.obj.__class__
- return cls
+ candidate = prop_name[0].upper() + prop_name[1:]
+ if tp := getattr(vegalite, candidate, None):
+ return _maybe_channel(tp, self.instance)
+ return type(self.obj)
@staticmethod
def _format_params_as_table(param_dict_keys: Iterable[str]) -> str:
From 367993e92a6b255b9b5a35ca43d60117fc8f14e5 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 6 Jan 2025 19:26:10 +0000
Subject: [PATCH 45/53] refactor: Centralize `Vega` project versioning (#3720)
---
NOTES_FOR_MAINTAINERS.md | 77 +++++----
RELEASING.md | 36 +++--
altair/utils/__init__.py | 10 +-
altair/utils/_importers.py | 6 +-
altair/utils/schemapi.py | 24 +++
pyproject.toml | 7 +
tools/__init__.py | 2 +
tools/generate_schema_wrapper.py | 15 +-
tools/versioning.py | 268 +++++++++++++++++++++++++++++++
9 files changed, 388 insertions(+), 57 deletions(-)
create mode 100644 tools/versioning.py
diff --git a/NOTES_FOR_MAINTAINERS.md b/NOTES_FOR_MAINTAINERS.md
index 03b4ede4e..50fadfdf8 100644
--- a/NOTES_FOR_MAINTAINERS.md
+++ b/NOTES_FOR_MAINTAINERS.md
@@ -27,11 +27,56 @@ The script output is designed to be deterministic; if the vega-lite version
is not changed, then running the script should overwrite the schema wrappers
with identical copies.
-## Updating the Vega-Lite version
+## Updating Vega versions
+All versions are maintained in [pyproject.toml](pyproject.toml).
-The vega & vega-lite versions for the Python code can be updated by manually
-changing the ``SCHEMA_VERSION`` definition within
-``tools/generate_schema_wrapper.py``, and then re-running the script.
+### Python Packages
+
+Projects which publish a package to PyPI are listed with a version bound in one of the following tables:
+
+- [`project.dependencies`](https://packaging.python.org/en/latest/specifications/pyproject-toml/#dependencies-optional-dependencies): Published dependencies.
+- [`project.optional-dependencies`](https://packaging.python.org/en/latest/specifications/pyproject-toml/#dependencies-optional-dependencies): Published optional dependencies, or "extras".
+- [`dependency-groups`](https://peps.python.org/pep-0735/): Local dependencies for development.
+
+> [!NOTE]
+> All are currently declared in sub-tables of `project.optional-dependencies`.
+
+The lower version bounds defined here are reused for [altair/utils/_importers.py](altair/utils/_importers.py).
+
+#### `vl-convert`
+
+We need to ensure that [vl-convert](https://github.com/vega/vl-convert) includes support for the new Vega-Lite version.
+Check the [vl-convert releases](https://github.com/vega/vl-convert/releases) to find the minimum
+version of `vl-convert` that includes support for the desired version of Vega-Lite (and [open
+an issue](https://github.com/vega/vl-convert/issues) if this version hasn't been
+included in a released yet).
+
+### Javascript/other
+
+Additional version constraints, including for [`Vega-Lite`](https://github.com/vega/vega-lite) itself are declared in `[tool.altair.vega]`.
+
+Whereas the [previous dependencies](#python-packages) are used primarily at *install-time*; this group is embedded into `altair` for use at *runtime* or when [generating the python code](#auto-generating-the-python-code):
+
+```toml
+[tool.altair.vega]
+vega-datasets = "..." # https://github.com/vega/vega-datasets
+vega-embed = "..." # https://github.com/vega/vega-embed
+vega-lite = "..." # https://github.com/vega/vega-lite
+```
+
+Some examples of where these propagate to:
+- [altair/jupyter/js/index.js](altair/jupyter/js/index.js)
+- [altair/utils/_importers.py](altair/utils/_importers.py)
+- [tools/generate_schema_wrapper.py](tools/generate_schema_wrapper.py)
+- [tools/versioning.py](tools/versioning.py)
+- [altair/utils/schemapi.py](https://github.com/vega/altair/blob/0e23fd33e9a755bab0ef73a856340c48c14897e6/altair/utils/schemapi.py#L1619-L1640)
+
+> [!IMPORTANT]
+> When updating **any** of these versions, be sure to [re-generate the python code](#auto-generating-the-python-code).
+
+#### Updating the Vega-Lite version
+
+The Vega-Lite version for the Python code propagates to `tools.generate_schema_wrapper.SCHEMA_VERSION`.
This will update all of the automatically-generated files in the ``schema``
directory for each version, but please note that it will *not* update other
@@ -50,30 +95,6 @@ of some docstrings.
Major version updates (e.g. Vega-Lite 1.X->2.X) have required substantial
rewrites, because the internal structure of the schema changed appreciably.
-### Updating the Vega-Lite in JupyterChart
-To update the Vega-Lite version used in JupyterChart, update the version in the
-esm.sh URL in `altair/jupyter/js/index.js`.
-
-For example, to update to Vega-Lite 5.15.1, Vega 5 and Vega-Embed 6, the URL
-should be:
-
-```javascript
-import embed from "https://esm.sh/vega-embed@6?deps=vega@5&deps=vega-lite@5.15.1";
-```
-
-### Updating vl-convert version bound
-
-When updating the version of Vega-Lite, it's important to ensure that
-[vl-convert](https://github.com/vega/vl-convert) includes support for the new Vega-Lite version.
-Check the [vl-convert releases](https://github.com/vega/vl-convert/releases) to find the minimum
-version of vl-convert that includes support for the desired version of Vega-Lite (and [open
-an issue](https://github.com/vega/vl-convert/issues) if this version hasn't been
-included in a released yet.). Update the vl-convert version check in `altair/utils/_importers.py`
-with the new minimum required version of vl-convert.
-
-Also, the version bound of the `vl-convert-python` package should be updated in the
-`[project.optional-dependencies]/all` dependency group in `pyproject.toml`.
-
## Releasing the Package
To cut a new release of Altair, follow the steps outlined in
diff --git a/RELEASING.md b/RELEASING.md
index 6582af76a..264081ebd 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -1,16 +1,18 @@
-1. Make sure to have an environment set up with `hatch` installed. See `CONTRIBUTING.md`.
+1. Check all [Vega project](https://github.com/orgs/vega/repositories?type=source) versions are up-to-date. See [NOTES_FOR_MAINTAINERS.md](NOTES_FOR_MAINTAINERS.md)
+
+2. Make sure to have an environment set up with `hatch` installed. See [CONTRIBUTING.md](CONTRIBUTING.md).
Remove any existing environments managed by `hatch` so that it will create new ones
with the latest dependencies when executing the commands further below:
hatch env prune
-2. Make certain your branch is in sync with head, and that you have no uncommitted modifications. If you work on a fork, replace `origin` with `upstream`:
+3. Make certain your branch is in sync with head, and that you have no uncommitted modifications. If you work on a fork, replace `origin` with `upstream`:
git checkout main
git pull origin main
git status # Should show "nothing to commit, working tree clean"
-3. Do a clean doc build:
+4. Do a clean doc build:
hatch run doc:clean-all
hatch run doc:build-html
@@ -19,62 +21,62 @@
Navigate to http://localhost:8000 and ensure it looks OK (particularly
do a visual scan of the gallery thumbnails).
-4. Create a new release branch:
+5. Create a new release branch:
git switch -c version_5.0.0
-5. Update version to, e.g. 5.0.0:
+6. Update version to, e.g. 5.0.0:
- in ``altair/__init__.py``
- in ``doc/conf.py``
-6. Commit changes and push:
+7. Commit changes and push:
git add . -u
git commit -m "chore: Bump version to 5.0.0"
git push
-7. Merge release branch into main, make sure that all required checks pass
+8. Merge release branch into main, make sure that all required checks pass
-8. On main, build source & wheel distributions. If you work on a fork, replace `origin` with `upstream`:
+9. On main, build source & wheel distributions. If you work on a fork, replace `origin` with `upstream`:
git switch main
git pull origin main
hatch clean # clean old builds & distributions
hatch build # create a source distribution and universal wheel
-9. publish to PyPI (Requires correct PyPI owner permissions):
+10. publish to PyPI (Requires correct PyPI owner permissions):
hatch publish
-10. build and publish docs (Requires write-access to altair-viz/altair-viz.github.io):
+11. build and publish docs (Requires write-access to altair-viz/altair-viz.github.io):
hatch run doc:publish-clean-build
-11. On main, tag the release. If you work on a fork, replace `origin` with `upstream`:
+12. On main, tag the release. If you work on a fork, replace `origin` with `upstream`:
git tag -a v5.0.0 -m "Version 5.0.0 release"
git push origin v5.0.0
-12. Create a new branch:
+13. Create a new branch:
git switch -c maint_5.1.0dev
-13. Update version and add 'dev' suffix, e.g. 5.1.0dev:
+14. Update version and add 'dev' suffix, e.g. 5.1.0dev:
- in ``altair/__init__.py``
- in ``doc/conf.py``
-14. Commit changes and push:
+15. Commit changes and push:
git add . -u
git commit -m "chore: Bump version to 5.1.0dev"
git push
-15. Merge maintenance branch into main
+16. Merge maintenance branch into main
-16. Double-check that a conda-forge pull request is generated from the updated
+17. Double-check that a conda-forge pull request is generated from the updated
pip package by the conda-forge bot (may take up to several hours):
https://github.com/conda-forge/altair-feedstock/pulls
-17. Publish a new release in https://github.com/vega/altair/releases/
+18. Publish a new release in https://github.com/vega/altair/releases/
diff --git a/altair/utils/__init__.py b/altair/utils/__init__.py
index bfcb52eff..68697ce33 100644
--- a/altair/utils/__init__.py
+++ b/altair/utils/__init__.py
@@ -12,10 +12,18 @@
from .deprecation import AltairDeprecationWarning, deprecated, deprecated_warn
from .html import spec_to_html
from .plugin_registry import PluginRegistry
-from .schemapi import Optional, SchemaBase, SchemaLike, Undefined, is_undefined
+from .schemapi import (
+ VERSIONS,
+ Optional,
+ SchemaBase,
+ SchemaLike,
+ Undefined,
+ is_undefined,
+)
__all__ = (
"SHORTHAND_KEYS",
+ "VERSIONS",
"AltairDeprecationWarning",
"Optional",
"PluginRegistry",
diff --git a/altair/utils/_importers.py b/altair/utils/_importers.py
index efe48df8b..d2b601804 100644
--- a/altair/utils/_importers.py
+++ b/altair/utils/_importers.py
@@ -5,12 +5,14 @@
from packaging.version import Version
+from altair.utils.schemapi import VERSIONS
+
if TYPE_CHECKING:
from types import ModuleType
def import_vegafusion() -> ModuleType:
- min_version = "1.5.0"
+ min_version = VERSIONS["vegafusion"]
try:
import vegafusion as vf
@@ -45,7 +47,7 @@ def import_vegafusion() -> ModuleType:
def import_vl_convert() -> ModuleType:
- min_version = "1.6.0"
+ min_version = VERSIONS["vl-convert-python"]
try:
version = importlib_version("vl-convert-python")
if Version(version) < Version(min_version):
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index a4af084b9..a5cb0bf11 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -1676,3 +1676,27 @@ def with_property_setters(cls: type[TSchemaBase]) -> type[TSchemaBase]:
for prop, propschema in schema.get("properties", {}).items():
setattr(cls, prop, _PropertySetter(prop, propschema))
return cls
+
+
+VERSIONS: Mapping[
+ Literal[
+ "vega-datasets", "vega-embed", "vega-lite", "vegafusion", "vl-convert-python"
+ ],
+ str,
+] = {
+ "vega-datasets": "v2.11.0",
+ "vega-embed": "6",
+ "vega-lite": "v5.20.1",
+ "vegafusion": "1.6.6",
+ "vl-convert-python": "1.7.0",
+}
+"""
+Version pins for non-``python`` `vega projects`_.
+
+Notes
+-----
+When cutting a new release, make sure to update ``[tool.altair.vega]`` in ``pyproject.toml``.
+
+.. _vega projects:
+ https://github.com/vega
+"""
diff --git a/pyproject.toml b/pyproject.toml
index 3b555aa43..5e52b5d2f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -84,6 +84,7 @@ dev = [
"types-setuptools",
"geopandas",
"polars>=0.20.3",
+ "tomli; python_version<\"3.11\""
]
doc = [
"sphinx",
@@ -99,6 +100,12 @@ doc = [
"scipy",
]
+[tool.altair.vega]
+# Minimum/exact versions, for projects under the `vega` organization
+vega-datasets = "v2.11.0" # https://github.com/vega/vega-datasets
+vega-embed = "6" # https://github.com/vega/vega-embed
+vega-lite = "v5.20.1" # https://github.com/vega/vega-lite
+
[tool.hatch.version]
path = "altair/__init__.py"
diff --git a/tools/__init__.py b/tools/__init__.py
index 46fc97553..00ce52b6d 100644
--- a/tools/__init__.py
+++ b/tools/__init__.py
@@ -4,6 +4,7 @@
markup,
schemapi,
update_init_file,
+ versioning,
)
__all__ = [
@@ -12,4 +13,5 @@
"markup",
"schemapi",
"update_init_file",
+ "versioning",
]
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index eab9afa71..df1b32681 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -41,6 +41,7 @@
spell_literal,
)
from tools.vega_expr import write_expr_module
+from tools.versioning import VERSIONS
if TYPE_CHECKING:
from collections.abc import Iterable, Iterator
@@ -50,7 +51,7 @@
T = TypeVar("T", bound="str | Iterable[str]")
-SCHEMA_VERSION: Final = "v5.20.1"
+SCHEMA_VERSION: Final = VERSIONS["vega-lite"]
HEADER_COMMENT = """\
@@ -633,9 +634,8 @@ def copy_schemapi_util() -> None:
destination_fp.open("w", encoding="utf8") as dest,
):
dest.write(HEADER_COMMENT)
- dest.writelines(source.readlines())
- if sys.platform == "win32":
- ruff.format(destination_fp)
+ dest.writelines(chain(source.readlines(), VERSIONS.iter_inline_literal()))
+ ruff.format(destination_fp)
def recursive_dict_update(schema: dict, root: dict, def_dict: dict) -> None:
@@ -1390,13 +1390,10 @@ def main() -> None:
"--skip-download", action="store_true", help="skip downloading schema files"
)
args = parser.parse_args()
+ VERSIONS.update_all()
copy_schemapi_util()
vegalite_main(args.skip_download)
- write_expr_module(
- vlc.get_vega_version(),
- output=EXPR_FILE,
- header=HEADER_COMMENT,
- )
+ write_expr_module(VERSIONS.vlc_vega, output=EXPR_FILE, header=HEADER_COMMENT)
# The modules below are imported after the generation of the new schema files
# as these modules import Altair. This allows them to use the new changes
diff --git a/tools/versioning.py b/tools/versioning.py
new file mode 100644
index 000000000..25e7a226e
--- /dev/null
+++ b/tools/versioning.py
@@ -0,0 +1,268 @@
+"""
+Versioning utils, specfic to `vega projects`_.
+
+Includes non-`python` projects.
+
+.. _vega projects:
+ https://github.com/vega
+
+Examples
+--------
+>>> from tools.versioning import VERSIONS # doctest: +SKIP
+>>> VERSIONS["vega-lite"] # doctest: +SKIP
+'v5.20.1'
+
+>>> VERSIONS # doctest: +SKIP
+{'vega-datasets': 'v2.11.0',
+ 'vega-embed': '6',
+ 'vega-lite': 'v5.20.1',
+ 'vegafusion': '1.5.0',
+ 'vl-convert-python': '1.7.0'}
+"""
+
+from __future__ import annotations
+
+import sys
+from collections import deque
+from itertools import chain
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, ClassVar, Literal
+
+if sys.version_info >= (3, 11):
+ import tomllib
+else:
+ # NOTE: See https://github.com/hukkin/tomli?tab=readme-ov-file#building-a-tomlitomllib-compatibility-layer
+ import tomli as tomllib # type: ignore
+from packaging.requirements import Requirement
+from packaging.version import parse as parse_version
+
+import vl_convert as vlc
+from tools.schemapi.utils import spell_literal
+
+if TYPE_CHECKING:
+ from collections.abc import (
+ ItemsView,
+ Iterable,
+ Iterator,
+ KeysView,
+ Mapping,
+ Sequence,
+ )
+
+ 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
+
+__all__ = ["VERSIONS"]
+
+_REPO_ROOT: Path = Path(__file__).parent.parent
+_JUPYTER_INDEX = "altair/jupyter/js/index.js"
+_PYPROJECT: Literal["pyproject.toml"] = "pyproject.toml"
+_LOWER_BOUNDS = frozenset((">=", "==", "~=", "==="))
+
+VegaProjectPy: TypeAlias = Literal["vegafusion", "vl-convert-python"]
+VegaProject: TypeAlias = Literal[
+ "vega-datasets", "vega-embed", "vega-lite", "vegafusion", "vl-convert-python"
+]
+
+VERSIONS: _Versions
+"""Singleton ``_Versions`` instance."""
+
+
+def _read_pyproject_toml(fp: Path | None = None, /) -> dict[str, Any]:
+ source = fp or Path(__file__).parent.parent / _PYPROJECT
+ return tomllib.loads(source.read_text("utf-8"))
+
+
+def _keypath(mapping: Mapping[str, Any], path: Iterable[str], /) -> Any:
+ """Get a nested table from ``mapping`` by following ``path``."""
+ mut = dict[str, Any](**mapping)
+ for key in path:
+ mut = mut[key]
+ return mut
+
+
+class _Versions:
+ _TABLE_PATH: ClassVar[Sequence[LiteralString]] = "tool", "altair", "vega"
+ """
+ The table header path split by ``"."``::
+
+ [tool.altair.vega] -> "tool", "altair", "vega"
+ """
+ _PY_DEPS_PATH: ClassVar[Sequence[LiteralString]] = (
+ "project",
+ "optional-dependencies",
+ )
+ _PY_DEPS: ClassVar[frozenset[VegaProjectPy]] = frozenset(
+ ("vl-convert-python", "vegafusion")
+ )
+
+ _CONST_NAME: ClassVar[Literal["VERSIONS"]] = "VERSIONS"
+ """Variable name for the exported literal."""
+
+ _mapping: Mapping[VegaProject, str]
+
+ def __init__(self) -> None:
+ pyproject = _read_pyproject_toml()
+ py_deps = _keypath(pyproject, self._PY_DEPS_PATH)
+ js_deps = _keypath(pyproject, self._TABLE_PATH)
+ all_deps = chain(js_deps.items(), self._iter_py_deps_versions(py_deps))
+ self._mapping = dict(sorted(all_deps))
+
+ def __getitem__(self, key: VegaProject) -> str:
+ return self._mapping[key]
+
+ def __repr__(self) -> str:
+ return repr(self._mapping)
+
+ def projects(self) -> KeysView[VegaProject]:
+ return self._mapping.keys()
+
+ def items(self) -> ItemsView[VegaProject, str]:
+ return self._mapping.items()
+
+ @property
+ def vlc_vega(self) -> str:
+ """
+ Returns version of `Vega`_ bundled with `vl-convert`_.
+
+ .. _Vega:
+ https://github.com/vega/vega
+ .. _vl-convert:
+ https://github.com/vega/vl-convert
+ """
+ return vlc.get_vega_version()
+
+ @property
+ def vlc_vega_embed(self) -> str:
+ """
+ Returns version of `Vega-Embed`_ bundled with `vl-convert`_.
+
+ .. _Vega-Embed:
+ https://github.com/vega/vega-embed
+ .. _vl-convert:
+ https://github.com/vega/vl-convert
+ """
+ return vlc.get_vega_embed_version()
+
+ @property
+ def vlc_vega_themes(self) -> str:
+ """
+ Returns version of `Vega-Themes`_ bundled with `vl-convert`_.
+
+ .. _Vega-Themes:
+ https://github.com/vega/vega-themes
+ .. _vl-convert:
+ https://github.com/vega/vl-convert.
+ """
+ return vlc.get_vega_themes_version()
+
+ @property
+ def vlc_vegalite(self) -> list[str]:
+ """
+ Returns versions of `Vega-Lite`_ bundled with `vl-convert`_.
+
+ .. _Vega-Lite:
+ https://github.com/vega/vega-lite
+ .. _vl-convert:
+ https://github.com/vega/vl-convert
+ """
+ return vlc.get_vegalite_versions()
+
+ @property
+ def _annotation(self) -> str:
+ return f"Mapping[{spell_literal(self.projects())}, str]"
+
+ @property
+ def _header(self) -> str:
+ return f"[{'.'.join(self._TABLE_PATH)}]"
+
+ def iter_inline_literal(self) -> Iterator[str]:
+ """
+ Yields the ``[tool.altair.vega]`` table as an inline ``dict``.
+
+ Includes a type annotation and docstring.
+
+ Notes
+ -----
+ - Write at the bottom of ``altair.utils.schemapi``.
+ - Used in ``altair.utils._importers``.
+ """
+ yield f"{self._CONST_NAME}: {self._annotation} = {self!r}\n"
+ yield '"""\n'
+ yield (
+ "Version pins for non-``python`` `vega projects`_.\n\n"
+ "Notes\n"
+ "-----\n"
+ f"When cutting a new release, make sure to update ``{self._header}`` in ``pyproject.toml``.\n\n"
+ ".. _vega projects:\n"
+ " https://github.com/vega\n"
+ )
+ yield '"""\n'
+
+ def update_all(self) -> None:
+ """Update all static version pins."""
+ print("Updating Vega project pins")
+ self.update_vega_embed()
+
+ def update_vega_embed(self) -> None:
+ """Updates the **Vega-Lite** version used in ``JupyterChart``."""
+ fp = _REPO_ROOT / _JUPYTER_INDEX
+ embed = self["vega-embed"]
+ vega = parse_version(self.vlc_vega).major
+ vegalite = self["vega-lite"].lstrip("v")
+ stmt = f'import vegaEmbed from "https://esm.sh/vega-embed@{embed}?deps=vega@{vega}&deps=vega-lite@{vegalite}";\n'
+
+ with fp.open("r", encoding="utf-8", newline="\n") as f:
+ lines = deque(f.readlines())
+ lines.popleft()
+ print(f"Updating import in {fp.as_posix()!r}, to:\n {stmt!r}")
+ lines.appendleft(stmt)
+ with fp.open("w", encoding="utf-8", newline="\n") as f:
+ f.writelines(lines)
+
+ def _iter_py_deps_versions(
+ self, dep_groups: dict[str, Sequence[str]], /
+ ) -> Iterator[tuple[VegaProjectPy, str]]:
+ """
+ Extract the name and lower version bound for all Vega python packages.
+
+ Parameters
+ ----------
+ dep_groups
+ Mapping of dependency/extra groups to requirement strings.
+
+ .. note::
+ It is expected that this is **either** `project.optional-dependencies`_ or `dependency-groups`_.
+
+ .. _project.optional-dependencies:
+ https://packaging.python.org/en/latest/specifications/pyproject-toml/#dependencies-optional-dependencies
+ .. _dependency-groups:
+ https://peps.python.org/pep-0735/
+ """
+ for deps in dep_groups.values():
+ for req_string in deps:
+ req = Requirement(req_string)
+ if req.name in self._PY_DEPS:
+ it = (
+ parse_version(sp.version)
+ for sp in req.specifier
+ if sp.operator in _LOWER_BOUNDS
+ )
+ version = str(min(it))
+ yield req.name, version
+
+
+def __getattr__(name: str) -> _Versions:
+ if name == "VERSIONS":
+ global VERSIONS
+ VERSIONS = _Versions()
+ return VERSIONS
+ else:
+ msg = f"module {__name__!r} has no attribute {name!r}"
+ raise AttributeError(msg)
From 17baaa23175bf15b57f73b48c1a0e855e3a5b3c7 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Wed, 8 Jan 2025 13:21:38 +0000
Subject: [PATCH 46/53] feat: Update `vega-lite` to `5.21.0` (#3761)
---
altair/jupyter/js/index.js | 2 +-
altair/utils/schemapi.py | 2 +-
altair/vegalite/v5/schema/__init__.py | 4 +-
altair/vegalite/v5/schema/_config.py | 18 +++
altair/vegalite/v5/schema/_typing.py | 5 +-
altair/vegalite/v5/schema/channels.py | 80 +++++-----
altair/vegalite/v5/schema/core.py | 100 ++++++++-----
.../vegalite/v5/schema/vega-lite-schema.json | 137 +++++++++---------
pyproject.toml | 2 +-
tests/utils/test_schemapi.py | 3 +-
tools/versioning.py | 2 +-
11 files changed, 200 insertions(+), 155 deletions(-)
diff --git a/altair/jupyter/js/index.js b/altair/jupyter/js/index.js
index 58b936091..85ce25e7c 100644
--- a/altair/jupyter/js/index.js
+++ b/altair/jupyter/js/index.js
@@ -1,4 +1,4 @@
-import vegaEmbed from "https://esm.sh/vega-embed@6?deps=vega@5&deps=vega-lite@5.20.1";
+import vegaEmbed from "https://esm.sh/vega-embed@6?deps=vega@5&deps=vega-lite@5.21.0";
import lodashDebounce from "https://esm.sh/lodash-es@4.17.21/debounce";
// Note: For offline support, the import lines above are removed and the remaining script
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index a5cb0bf11..e7708f0d7 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -1686,7 +1686,7 @@ def with_property_setters(cls: type[TSchemaBase]) -> type[TSchemaBase]:
] = {
"vega-datasets": "v2.11.0",
"vega-embed": "6",
- "vega-lite": "v5.20.1",
+ "vega-lite": "v5.21.0",
"vegafusion": "1.6.6",
"vl-convert-python": "1.7.0",
}
diff --git a/altair/vegalite/v5/schema/__init__.py b/altair/vegalite/v5/schema/__init__.py
index 3be8148db..0786b0f0d 100644
--- a/altair/vegalite/v5/schema/__init__.py
+++ b/altair/vegalite/v5/schema/__init__.py
@@ -6,9 +6,9 @@
from altair.vegalite.v5.schema.channels import *
from altair.vegalite.v5.schema.core import *
-SCHEMA_VERSION = "v5.20.1"
+SCHEMA_VERSION = "v5.21.0"
-SCHEMA_URL = "https://vega.github.io/schema/vega-lite/v5.20.1.json"
+SCHEMA_URL = "https://vega.github.io/schema/vega-lite/v5.21.0.json"
__all__ = [
"SCHEMA_URL",
diff --git a/altair/vegalite/v5/schema/_config.py b/altair/vegalite/v5/schema/_config.py
index b5d4020ff..bce4d5b10 100644
--- a/altair/vegalite/v5/schema/_config.py
+++ b/altair/vegalite/v5/schema/_config.py
@@ -6627,6 +6627,11 @@ class TickConfigKwds(TypedDict, total=False):
``"middle"``, ``"bottom"``.
**Note:** Expression reference is *not* supported for range marks.
+ binSpacing
+ Offset between bars for binned field. The ideal value for this is either 0
+ (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).
+
+ **Default value:** ``1``
blend
The color blend mode for drawing an item on its current background. Any valid `CSS
mix-blend-mode `__
@@ -6645,6 +6650,10 @@ class TickConfigKwds(TypedDict, total=False):
`__.
* The ``fill`` and ``stroke`` properties have higher precedence than ``color`` and
will override ``color``.
+ continuousBandSize
+ The default size of the bars on continuous scales.
+
+ **Default value:** ``5``
cornerRadius
The radius in pixels of rounded rectangles or arcs' corners.
@@ -6679,6 +6688,9 @@ class TickConfigKwds(TypedDict, total=False):
the limit parameter.
**Default value:** ``"ltr"``
+ discreteBandSize
+ The default size of the bars with discrete dimensions. If unspecified, the default
+ size is ``step-2``, which provides 2 pixel offset between bars.
dx
The horizontal offset, in pixels, between the text label and its anchor point. The
offset is applied after rotation by the *angle* property.
@@ -6795,6 +6807,8 @@ class TickConfigKwds(TypedDict, total=False):
lineHeight
The line height in pixels (the spacing between subsequent lines of text) for
multi-line text marks.
+ minBandSize
+ The minimum band size for bar and rectangle marks. **Default value:** ``0.25``
opacity
The overall opacity (value between [0,1]).
@@ -6974,8 +6988,10 @@ class TickConfigKwds(TypedDict, total=False):
aspect: bool
bandSize: float
baseline: TextBaseline_T
+ binSpacing: float
blend: Blend_T
color: ColorHex | LinearGradientKwds | RadialGradientKwds | ColorName_T
+ continuousBandSize: float
cornerRadius: float
cornerRadiusBottomLeft: float
cornerRadiusBottomRight: float
@@ -6984,6 +7000,7 @@ class TickConfigKwds(TypedDict, total=False):
cursor: Cursor_T
description: str
dir: TextDirection_T
+ discreteBandSize: float
dx: float
dy: float
ellipsis: str
@@ -7003,6 +7020,7 @@ class TickConfigKwds(TypedDict, total=False):
limit: float
lineBreak: str
lineHeight: float
+ minBandSize: float
opacity: float
order: bool | None
orient: Orientation_T
diff --git a/altair/vegalite/v5/schema/_typing.py b/altair/vegalite/v5/schema/_typing.py
index fd6383ad7..db33b422b 100644
--- a/altair/vegalite/v5/schema/_typing.py
+++ b/altair/vegalite/v5/schema/_typing.py
@@ -487,6 +487,7 @@ class PaddingKwds(TypedDict, total=False):
"set3",
"tableau10",
"tableau20",
+ "observable10",
"blues",
"tealblues",
"teals",
@@ -1051,6 +1052,8 @@ class PaddingKwds(TypedDict, total=False):
SelectionResolution_T: TypeAlias = Literal["global", "union", "intersect"]
SelectionType_T: TypeAlias = Literal["point", "interval"]
SingleDefUnitChannel_T: TypeAlias = Literal[
+ "text",
+ "shape",
"x",
"y",
"xOffset",
@@ -1075,9 +1078,7 @@ class PaddingKwds(TypedDict, total=False):
"strokeDash",
"size",
"angle",
- "shape",
"key",
- "text",
"href",
"url",
"description",
diff --git a/altair/vegalite/v5/schema/channels.py b/altair/vegalite/v5/schema/channels.py
index a4a676c23..c5de8c292 100644
--- a/altair/vegalite/v5/schema/channels.py
+++ b/altair/vegalite/v5/schema/channels.py
@@ -390,7 +390,7 @@ class Angle(FieldChannelMixin, core.FieldOrDatumDefWithConditionMarkPropFieldDef
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -1208,7 +1208,7 @@ class Color(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -2013,7 +2013,7 @@ class Column(FieldChannelMixin, core.RowColumnEncodingFieldDef):
**Default value**: Depends on ``"spacing"`` property of `the view composition
configuration `__
(``20`` by default)
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -2390,7 +2390,7 @@ class Description(FieldChannelMixin, core.StringFieldDefWithCondition):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -2796,7 +2796,7 @@ class Detail(FieldChannelMixin, core.FieldDefWithoutScale):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -3126,7 +3126,7 @@ class Facet(FieldChannelMixin, core.FacetEncodingFieldDef):
**Default value**: Depends on ``"spacing"`` property of `the view composition
configuration `__
(``20`` by default)
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -3553,7 +3553,7 @@ class Fill(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -4375,7 +4375,7 @@ class FillOpacity(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -5170,7 +5170,7 @@ class Href(FieldChannelMixin, core.StringFieldDefWithCondition):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -5570,7 +5570,7 @@ class Key(FieldChannelMixin, core.FieldDefWithoutScale):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -5808,7 +5808,7 @@ class Latitude(FieldChannelMixin, core.LatLongFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -6162,7 +6162,7 @@ class Latitude2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -6466,7 +6466,7 @@ class Longitude(FieldChannelMixin, core.LatLongFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -6820,7 +6820,7 @@ class Longitude2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -7193,7 +7193,7 @@ class Opacity(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -7949,7 +7949,7 @@ class Order(FieldChannelMixin, core.OrderFieldDef):
if ``aggregate`` is ``count``.
sort : :class:`SortOrder`, Literal['ascending', 'descending']
The sort order. One of ``"ascending"`` (default) or ``"descending"``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -8322,7 +8322,7 @@ class Radius(FieldChannelMixin, core.PositionFieldDefBase):
**See also:** `stack `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -8914,7 +8914,7 @@ class Radius2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -9270,7 +9270,7 @@ class Row(FieldChannelMixin, core.RowColumnEncodingFieldDef):
**Default value**: Depends on ``"spacing"`` property of `the view composition
configuration `__
(``20`` by default)
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -9674,7 +9674,7 @@ class Shape(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -10494,7 +10494,7 @@ class Size(FieldChannelMixin, core.FieldOrDatumDefWithConditionMarkPropFieldDefn
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -11312,7 +11312,7 @@ class Stroke(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -12138,7 +12138,7 @@ class StrokeDash(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -12963,7 +12963,7 @@ class StrokeOpacity(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -13788,7 +13788,7 @@ class StrokeWidth(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -14583,7 +14583,7 @@ class Text(FieldChannelMixin, core.FieldOrDatumDefWithConditionStringFieldDefTex
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -15211,7 +15211,7 @@ class Theta(FieldChannelMixin, core.PositionFieldDefBase):
**See also:** `stack `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -15799,7 +15799,7 @@ class Theta2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -16142,7 +16142,7 @@ class Tooltip(FieldChannelMixin, core.StringFieldDefWithCondition):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -16585,7 +16585,7 @@ class Url(FieldChannelMixin, core.StringFieldDefWithCondition):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -17081,7 +17081,7 @@ class X(FieldChannelMixin, core.PositionFieldDef):
**See also:** `stack `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -17954,7 +17954,7 @@ class X2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -18257,7 +18257,7 @@ class XError(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -18440,7 +18440,7 @@ class XError2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -18671,7 +18671,7 @@ class XOffset(FieldChannelMixin, core.ScaleFieldDef):
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -19320,7 +19320,7 @@ class Y(FieldChannelMixin, core.PositionFieldDef):
**See also:** `stack `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -20193,7 +20193,7 @@ class Y2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -20496,7 +20496,7 @@ class YError(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -20679,7 +20679,7 @@ class YError2(FieldChannelMixin, core.SecondaryFieldDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -20910,7 +20910,7 @@ class YOffset(FieldChannelMixin, core.ScaleFieldDef):
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
diff --git a/altair/vegalite/v5/schema/core.py b/altair/vegalite/v5/schema/core.py
index a2481bafc..278aac0ae 100644
--- a/altair/vegalite/v5/schema/core.py
+++ b/altair/vegalite/v5/schema/core.py
@@ -3486,8 +3486,8 @@ class BinnedTimeUnit(VegaLiteSchema):
_schema = {"$ref": "#/definitions/BinnedTimeUnit"}
- def __init__(self, *args, **kwds):
- super().__init__(*args, **kwds)
+ def __init__(self, *args):
+ super().__init__(*args)
class Blend(VegaLiteSchema):
@@ -4235,7 +4235,7 @@ class ConditionalParameterStringFieldDef(ConditionalStringFieldDef):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -4455,7 +4455,7 @@ class ConditionalPredicateStringFieldDef(ConditionalStringFieldDef):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -6484,7 +6484,7 @@ class FacetEncodingFieldDef(VegaLiteSchema):
**Default value**: Depends on ``"spacing"`` property of `the view composition
configuration `__
(``20`` by default)
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -6715,7 +6715,7 @@ class FacetFieldDef(VegaLiteSchema):
**Default value:** ``"ascending"``
**Note:** ``null`` is not supported for ``row`` and ``column``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -7352,7 +7352,7 @@ class FieldDefWithoutScale(VegaLiteSchema):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -7580,7 +7580,7 @@ class FieldOrDatumDefWithConditionStringFieldDefstring(VegaLiteSchema):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -8799,7 +8799,7 @@ class IntervalSelectionConfig(VegaLiteSchema):
**See also:** `clear examples
`__ in the
documentation.
- encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'shape', 'key', 'text', 'href', 'url', 'description']]
+ encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['text', 'shape', 'x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'key', 'href', 'url', 'description']]
An array of encoding channels. The corresponding data field values must match for a
data tuple to fall within the selection.
@@ -8920,7 +8920,7 @@ class IntervalSelectionConfigWithoutType(VegaLiteSchema):
**See also:** `clear examples
`__ in the
documentation.
- encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'shape', 'key', 'text', 'href', 'url', 'description']]
+ encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['text', 'shape', 'x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'key', 'href', 'url', 'description']]
An array of encoding channels. The corresponding data field values must match for a
data tuple to fall within the selection.
@@ -9171,7 +9171,7 @@ class LatLongFieldDef(LatLongDef):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -12612,7 +12612,7 @@ class FieldOrDatumDefWithConditionMarkPropFieldDefGradientstringnull(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -13262,7 +13262,7 @@ class FieldOrDatumDefWithConditionMarkPropFieldDefnumberArray(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -13671,7 +13671,7 @@ class FieldOrDatumDefWithConditionMarkPropFieldDefnumber(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -13883,7 +13883,7 @@ class OrderFieldDef(VegaLiteSchema):
if ``aggregate`` is ``count``.
sort : :class:`SortOrder`, Literal['ascending', 'descending']
The sort order. One of ``"ascending"`` (default) or ``"descending"``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -14716,8 +14716,8 @@ class ParseValue(VegaLiteSchema):
_schema = {"$ref": "#/definitions/ParseValue"}
- def __init__(self, *args, **kwds):
- super().__init__(*args, **kwds)
+ def __init__(self, *args):
+ super().__init__(*args)
class Point(Geometry):
@@ -14776,7 +14776,7 @@ class PointSelectionConfig(VegaLiteSchema):
**See also:** `clear examples
`__ in the
documentation.
- encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'shape', 'key', 'text', 'href', 'url', 'description']]
+ encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['text', 'shape', 'x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'key', 'href', 'url', 'description']]
An array of encoding channels. The corresponding data field values must match for a
data tuple to fall within the selection.
@@ -14894,7 +14894,7 @@ class PointSelectionConfigWithoutType(VegaLiteSchema):
**See also:** `clear examples
`__ in the
documentation.
- encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'shape', 'key', 'text', 'href', 'url', 'description']]
+ encodings : Sequence[:class:`SingleDefUnitChannel`, Literal['text', 'shape', 'x', 'y', 'xOffset', 'yOffset', 'x2', 'y2', 'longitude', 'latitude', 'longitude2', 'latitude2', 'theta', 'theta2', 'radius', 'radius2', 'color', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'strokeWidth', 'strokeDash', 'size', 'angle', 'key', 'href', 'url', 'description']]
An array of encoding channels. The corresponding data field values must match for a
data tuple to fall within the selection.
@@ -15696,7 +15696,7 @@ class PositionFieldDef(PositionDef):
**See also:** `stack `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -15978,7 +15978,7 @@ class PositionFieldDefBase(PolarDef):
**See also:** `stack `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -16231,7 +16231,7 @@ class FieldEqualPredicate(Predicate):
The value that the field should be equal to.
field : str, :class:`FieldName`
Field to be tested.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16261,7 +16261,7 @@ class FieldGTEPredicate(Predicate):
Field to be tested.
gte : str, dict, float, :class:`ExprRef`, :class:`DateTime`
The value that the field should be greater than or equals to.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16291,7 +16291,7 @@ class FieldGTPredicate(Predicate):
Field to be tested.
gt : str, dict, float, :class:`ExprRef`, :class:`DateTime`
The value that the field should be greater than.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16319,7 +16319,7 @@ class FieldLTEPredicate(Predicate):
Field to be tested.
lte : str, dict, float, :class:`ExprRef`, :class:`DateTime`
The value that the field should be less than or equals to.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16349,7 +16349,7 @@ class FieldLTPredicate(Predicate):
Field to be tested.
lt : str, dict, float, :class:`ExprRef`, :class:`DateTime`
The value that the field should be less than.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16378,7 +16378,7 @@ class FieldOneOfPredicate(Predicate):
oneOf : Sequence[str], Sequence[bool], Sequence[float], Sequence[dict, :class:`DateTime`]
A set of values that the ``field``'s value should be a member of, for a data item
included in the filtered data.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16412,7 +16412,7 @@ class FieldRangePredicate(Predicate):
range : dict, :class:`ExprRef`, Sequence[dict, float, :class:`ExprRef`, :class:`DateTime`, None]
An array of inclusive minimum and maximum values for a field value of a data item to
be included in the filtered data.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -16447,7 +16447,7 @@ class FieldValidPredicate(Predicate):
If set to true the field's value has to be valid, meaning both not ``null`` and not
`NaN
`__.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit for the field to be tested.
"""
@@ -17888,7 +17888,7 @@ class RowColumnEncodingFieldDef(VegaLiteSchema):
**Default value**: Depends on ``"spacing"`` property of `the view composition
configuration `__
(``20`` by default)
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -18238,7 +18238,7 @@ class Scale(VegaLiteSchema):
snapping to the pixel grid.
**Default value:** ``false``.
- scheme : dict, :class:`ExprRef`, :class:`Cyclical`, :class:`Diverging`, :class:`Categorical`, :class:`ColorScheme`, :class:`SchemeParams`, :class:`SequentialMultiHue`, :class:`SequentialSingleHue`, Literal['accent', 'category10', 'category20', 'category20b', 'category20c', 'dark2', 'paired', 'pastel1', 'pastel2', 'set1', 'set2', 'set3', 'tableau10', 'tableau20', 'blueorange', 'blueorange-3', 'blueorange-4', 'blueorange-5', 'blueorange-6', 'blueorange-7', 'blueorange-8', 'blueorange-9', 'blueorange-10', 'blueorange-11', 'brownbluegreen', 'brownbluegreen-3', 'brownbluegreen-4', 'brownbluegreen-5', 'brownbluegreen-6', 'brownbluegreen-7', 'brownbluegreen-8', 'brownbluegreen-9', 'brownbluegreen-10', 'brownbluegreen-11', 'purplegreen', 'purplegreen-3', 'purplegreen-4', 'purplegreen-5', 'purplegreen-6', 'purplegreen-7', 'purplegreen-8', 'purplegreen-9', 'purplegreen-10', 'purplegreen-11', 'pinkyellowgreen', 'pinkyellowgreen-3', 'pinkyellowgreen-4', 'pinkyellowgreen-5', 'pinkyellowgreen-6', 'pinkyellowgreen-7', 'pinkyellowgreen-8', 'pinkyellowgreen-9', 'pinkyellowgreen-10', 'pinkyellowgreen-11', 'purpleorange', 'purpleorange-3', 'purpleorange-4', 'purpleorange-5', 'purpleorange-6', 'purpleorange-7', 'purpleorange-8', 'purpleorange-9', 'purpleorange-10', 'purpleorange-11', 'redblue', 'redblue-3', 'redblue-4', 'redblue-5', 'redblue-6', 'redblue-7', 'redblue-8', 'redblue-9', 'redblue-10', 'redblue-11', 'redgrey', 'redgrey-3', 'redgrey-4', 'redgrey-5', 'redgrey-6', 'redgrey-7', 'redgrey-8', 'redgrey-9', 'redgrey-10', 'redgrey-11', 'redyellowblue', 'redyellowblue-3', 'redyellowblue-4', 'redyellowblue-5', 'redyellowblue-6', 'redyellowblue-7', 'redyellowblue-8', 'redyellowblue-9', 'redyellowblue-10', 'redyellowblue-11', 'redyellowgreen', 'redyellowgreen-3', 'redyellowgreen-4', 'redyellowgreen-5', 'redyellowgreen-6', 'redyellowgreen-7', 'redyellowgreen-8', 'redyellowgreen-9', 'redyellowgreen-10', 'redyellowgreen-11', 'spectral', 'spectral-3', 'spectral-4', 'spectral-5', 'spectral-6', 'spectral-7', 'spectral-8', 'spectral-9', 'spectral-10', 'spectral-11', 'blues', 'tealblues', 'teals', 'greens', 'browns', 'greys', 'purples', 'warmgreys', 'reds', 'oranges', 'rainbow', 'sinebow', 'turbo', 'viridis', 'inferno', 'magma', 'plasma', 'cividis', 'bluegreen', 'bluegreen-3', 'bluegreen-4', 'bluegreen-5', 'bluegreen-6', 'bluegreen-7', 'bluegreen-8', 'bluegreen-9', 'bluepurple', 'bluepurple-3', 'bluepurple-4', 'bluepurple-5', 'bluepurple-6', 'bluepurple-7', 'bluepurple-8', 'bluepurple-9', 'goldgreen', 'goldgreen-3', 'goldgreen-4', 'goldgreen-5', 'goldgreen-6', 'goldgreen-7', 'goldgreen-8', 'goldgreen-9', 'goldorange', 'goldorange-3', 'goldorange-4', 'goldorange-5', 'goldorange-6', 'goldorange-7', 'goldorange-8', 'goldorange-9', 'goldred', 'goldred-3', 'goldred-4', 'goldred-5', 'goldred-6', 'goldred-7', 'goldred-8', 'goldred-9', 'greenblue', 'greenblue-3', 'greenblue-4', 'greenblue-5', 'greenblue-6', 'greenblue-7', 'greenblue-8', 'greenblue-9', 'orangered', 'orangered-3', 'orangered-4', 'orangered-5', 'orangered-6', 'orangered-7', 'orangered-8', 'orangered-9', 'purplebluegreen', 'purplebluegreen-3', 'purplebluegreen-4', 'purplebluegreen-5', 'purplebluegreen-6', 'purplebluegreen-7', 'purplebluegreen-8', 'purplebluegreen-9', 'purpleblue', 'purpleblue-3', 'purpleblue-4', 'purpleblue-5', 'purpleblue-6', 'purpleblue-7', 'purpleblue-8', 'purpleblue-9', 'purplered', 'purplered-3', 'purplered-4', 'purplered-5', 'purplered-6', 'purplered-7', 'purplered-8', 'purplered-9', 'redpurple', 'redpurple-3', 'redpurple-4', 'redpurple-5', 'redpurple-6', 'redpurple-7', 'redpurple-8', 'redpurple-9', 'yellowgreenblue', 'yellowgreenblue-3', 'yellowgreenblue-4', 'yellowgreenblue-5', 'yellowgreenblue-6', 'yellowgreenblue-7', 'yellowgreenblue-8', 'yellowgreenblue-9', 'yellowgreen', 'yellowgreen-3', 'yellowgreen-4', 'yellowgreen-5', 'yellowgreen-6', 'yellowgreen-7', 'yellowgreen-8', 'yellowgreen-9', 'yelloworangebrown', 'yelloworangebrown-3', 'yelloworangebrown-4', 'yelloworangebrown-5', 'yelloworangebrown-6', 'yelloworangebrown-7', 'yelloworangebrown-8', 'yelloworangebrown-9', 'yelloworangered', 'yelloworangered-3', 'yelloworangered-4', 'yelloworangered-5', 'yelloworangered-6', 'yelloworangered-7', 'yelloworangered-8', 'yelloworangered-9', 'darkblue', 'darkblue-3', 'darkblue-4', 'darkblue-5', 'darkblue-6', 'darkblue-7', 'darkblue-8', 'darkblue-9', 'darkgold', 'darkgold-3', 'darkgold-4', 'darkgold-5', 'darkgold-6', 'darkgold-7', 'darkgold-8', 'darkgold-9', 'darkgreen', 'darkgreen-3', 'darkgreen-4', 'darkgreen-5', 'darkgreen-6', 'darkgreen-7', 'darkgreen-8', 'darkgreen-9', 'darkmulti', 'darkmulti-3', 'darkmulti-4', 'darkmulti-5', 'darkmulti-6', 'darkmulti-7', 'darkmulti-8', 'darkmulti-9', 'darkred', 'darkred-3', 'darkred-4', 'darkred-5', 'darkred-6', 'darkred-7', 'darkred-8', 'darkred-9', 'lightgreyred', 'lightgreyred-3', 'lightgreyred-4', 'lightgreyred-5', 'lightgreyred-6', 'lightgreyred-7', 'lightgreyred-8', 'lightgreyred-9', 'lightgreyteal', 'lightgreyteal-3', 'lightgreyteal-4', 'lightgreyteal-5', 'lightgreyteal-6', 'lightgreyteal-7', 'lightgreyteal-8', 'lightgreyteal-9', 'lightmulti', 'lightmulti-3', 'lightmulti-4', 'lightmulti-5', 'lightmulti-6', 'lightmulti-7', 'lightmulti-8', 'lightmulti-9', 'lightorange', 'lightorange-3', 'lightorange-4', 'lightorange-5', 'lightorange-6', 'lightorange-7', 'lightorange-8', 'lightorange-9', 'lighttealblue', 'lighttealblue-3', 'lighttealblue-4', 'lighttealblue-5', 'lighttealblue-6', 'lighttealblue-7', 'lighttealblue-8', 'lighttealblue-9']
+ scheme : dict, :class:`ExprRef`, :class:`Cyclical`, :class:`Diverging`, :class:`Categorical`, :class:`ColorScheme`, :class:`SchemeParams`, :class:`SequentialMultiHue`, :class:`SequentialSingleHue`, Literal['accent', 'category10', 'category20', 'category20b', 'category20c', 'dark2', 'paired', 'pastel1', 'pastel2', 'set1', 'set2', 'set3', 'tableau10', 'tableau20', 'observable10', 'blueorange', 'blueorange-3', 'blueorange-4', 'blueorange-5', 'blueorange-6', 'blueorange-7', 'blueorange-8', 'blueorange-9', 'blueorange-10', 'blueorange-11', 'brownbluegreen', 'brownbluegreen-3', 'brownbluegreen-4', 'brownbluegreen-5', 'brownbluegreen-6', 'brownbluegreen-7', 'brownbluegreen-8', 'brownbluegreen-9', 'brownbluegreen-10', 'brownbluegreen-11', 'purplegreen', 'purplegreen-3', 'purplegreen-4', 'purplegreen-5', 'purplegreen-6', 'purplegreen-7', 'purplegreen-8', 'purplegreen-9', 'purplegreen-10', 'purplegreen-11', 'pinkyellowgreen', 'pinkyellowgreen-3', 'pinkyellowgreen-4', 'pinkyellowgreen-5', 'pinkyellowgreen-6', 'pinkyellowgreen-7', 'pinkyellowgreen-8', 'pinkyellowgreen-9', 'pinkyellowgreen-10', 'pinkyellowgreen-11', 'purpleorange', 'purpleorange-3', 'purpleorange-4', 'purpleorange-5', 'purpleorange-6', 'purpleorange-7', 'purpleorange-8', 'purpleorange-9', 'purpleorange-10', 'purpleorange-11', 'redblue', 'redblue-3', 'redblue-4', 'redblue-5', 'redblue-6', 'redblue-7', 'redblue-8', 'redblue-9', 'redblue-10', 'redblue-11', 'redgrey', 'redgrey-3', 'redgrey-4', 'redgrey-5', 'redgrey-6', 'redgrey-7', 'redgrey-8', 'redgrey-9', 'redgrey-10', 'redgrey-11', 'redyellowblue', 'redyellowblue-3', 'redyellowblue-4', 'redyellowblue-5', 'redyellowblue-6', 'redyellowblue-7', 'redyellowblue-8', 'redyellowblue-9', 'redyellowblue-10', 'redyellowblue-11', 'redyellowgreen', 'redyellowgreen-3', 'redyellowgreen-4', 'redyellowgreen-5', 'redyellowgreen-6', 'redyellowgreen-7', 'redyellowgreen-8', 'redyellowgreen-9', 'redyellowgreen-10', 'redyellowgreen-11', 'spectral', 'spectral-3', 'spectral-4', 'spectral-5', 'spectral-6', 'spectral-7', 'spectral-8', 'spectral-9', 'spectral-10', 'spectral-11', 'blues', 'tealblues', 'teals', 'greens', 'browns', 'greys', 'purples', 'warmgreys', 'reds', 'oranges', 'rainbow', 'sinebow', 'turbo', 'viridis', 'inferno', 'magma', 'plasma', 'cividis', 'bluegreen', 'bluegreen-3', 'bluegreen-4', 'bluegreen-5', 'bluegreen-6', 'bluegreen-7', 'bluegreen-8', 'bluegreen-9', 'bluepurple', 'bluepurple-3', 'bluepurple-4', 'bluepurple-5', 'bluepurple-6', 'bluepurple-7', 'bluepurple-8', 'bluepurple-9', 'goldgreen', 'goldgreen-3', 'goldgreen-4', 'goldgreen-5', 'goldgreen-6', 'goldgreen-7', 'goldgreen-8', 'goldgreen-9', 'goldorange', 'goldorange-3', 'goldorange-4', 'goldorange-5', 'goldorange-6', 'goldorange-7', 'goldorange-8', 'goldorange-9', 'goldred', 'goldred-3', 'goldred-4', 'goldred-5', 'goldred-6', 'goldred-7', 'goldred-8', 'goldred-9', 'greenblue', 'greenblue-3', 'greenblue-4', 'greenblue-5', 'greenblue-6', 'greenblue-7', 'greenblue-8', 'greenblue-9', 'orangered', 'orangered-3', 'orangered-4', 'orangered-5', 'orangered-6', 'orangered-7', 'orangered-8', 'orangered-9', 'purplebluegreen', 'purplebluegreen-3', 'purplebluegreen-4', 'purplebluegreen-5', 'purplebluegreen-6', 'purplebluegreen-7', 'purplebluegreen-8', 'purplebluegreen-9', 'purpleblue', 'purpleblue-3', 'purpleblue-4', 'purpleblue-5', 'purpleblue-6', 'purpleblue-7', 'purpleblue-8', 'purpleblue-9', 'purplered', 'purplered-3', 'purplered-4', 'purplered-5', 'purplered-6', 'purplered-7', 'purplered-8', 'purplered-9', 'redpurple', 'redpurple-3', 'redpurple-4', 'redpurple-5', 'redpurple-6', 'redpurple-7', 'redpurple-8', 'redpurple-9', 'yellowgreenblue', 'yellowgreenblue-3', 'yellowgreenblue-4', 'yellowgreenblue-5', 'yellowgreenblue-6', 'yellowgreenblue-7', 'yellowgreenblue-8', 'yellowgreenblue-9', 'yellowgreen', 'yellowgreen-3', 'yellowgreen-4', 'yellowgreen-5', 'yellowgreen-6', 'yellowgreen-7', 'yellowgreen-8', 'yellowgreen-9', 'yelloworangebrown', 'yelloworangebrown-3', 'yelloworangebrown-4', 'yelloworangebrown-5', 'yelloworangebrown-6', 'yelloworangebrown-7', 'yelloworangebrown-8', 'yelloworangebrown-9', 'yelloworangered', 'yelloworangered-3', 'yelloworangered-4', 'yelloworangered-5', 'yelloworangered-6', 'yelloworangered-7', 'yelloworangered-8', 'yelloworangered-9', 'darkblue', 'darkblue-3', 'darkblue-4', 'darkblue-5', 'darkblue-6', 'darkblue-7', 'darkblue-8', 'darkblue-9', 'darkgold', 'darkgold-3', 'darkgold-4', 'darkgold-5', 'darkgold-6', 'darkgold-7', 'darkgold-8', 'darkgold-9', 'darkgreen', 'darkgreen-3', 'darkgreen-4', 'darkgreen-5', 'darkgreen-6', 'darkgreen-7', 'darkgreen-8', 'darkgreen-9', 'darkmulti', 'darkmulti-3', 'darkmulti-4', 'darkmulti-5', 'darkmulti-6', 'darkmulti-7', 'darkmulti-8', 'darkmulti-9', 'darkred', 'darkred-3', 'darkred-4', 'darkred-5', 'darkred-6', 'darkred-7', 'darkred-8', 'darkred-9', 'lightgreyred', 'lightgreyred-3', 'lightgreyred-4', 'lightgreyred-5', 'lightgreyred-6', 'lightgreyred-7', 'lightgreyred-8', 'lightgreyred-9', 'lightgreyteal', 'lightgreyteal-3', 'lightgreyteal-4', 'lightgreyteal-5', 'lightgreyteal-6', 'lightgreyteal-7', 'lightgreyteal-8', 'lightgreyteal-9', 'lightmulti', 'lightmulti-3', 'lightmulti-4', 'lightmulti-5', 'lightmulti-6', 'lightmulti-7', 'lightmulti-8', 'lightmulti-9', 'lightorange', 'lightorange-3', 'lightorange-4', 'lightorange-5', 'lightorange-6', 'lightorange-7', 'lightorange-8', 'lightorange-9', 'lighttealblue', 'lighttealblue-3', 'lighttealblue-4', 'lighttealblue-5', 'lighttealblue-6', 'lighttealblue-7', 'lighttealblue-8', 'lighttealblue-9']
A string indicating a color `scheme
`__ name (e.g.,
``"category10"`` or ``"blues"``) or a `scheme parameter object
@@ -18888,7 +18888,7 @@ class ScaleFieldDef(OffsetDef):
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -19748,7 +19748,7 @@ class SchemeParams(VegaLiteSchema):
Parameters
----------
- name : :class:`Cyclical`, :class:`Diverging`, :class:`Categorical`, :class:`ColorScheme`, :class:`SequentialMultiHue`, :class:`SequentialSingleHue`, Literal['accent', 'category10', 'category20', 'category20b', 'category20c', 'dark2', 'paired', 'pastel1', 'pastel2', 'set1', 'set2', 'set3', 'tableau10', 'tableau20', 'blueorange', 'blueorange-3', 'blueorange-4', 'blueorange-5', 'blueorange-6', 'blueorange-7', 'blueorange-8', 'blueorange-9', 'blueorange-10', 'blueorange-11', 'brownbluegreen', 'brownbluegreen-3', 'brownbluegreen-4', 'brownbluegreen-5', 'brownbluegreen-6', 'brownbluegreen-7', 'brownbluegreen-8', 'brownbluegreen-9', 'brownbluegreen-10', 'brownbluegreen-11', 'purplegreen', 'purplegreen-3', 'purplegreen-4', 'purplegreen-5', 'purplegreen-6', 'purplegreen-7', 'purplegreen-8', 'purplegreen-9', 'purplegreen-10', 'purplegreen-11', 'pinkyellowgreen', 'pinkyellowgreen-3', 'pinkyellowgreen-4', 'pinkyellowgreen-5', 'pinkyellowgreen-6', 'pinkyellowgreen-7', 'pinkyellowgreen-8', 'pinkyellowgreen-9', 'pinkyellowgreen-10', 'pinkyellowgreen-11', 'purpleorange', 'purpleorange-3', 'purpleorange-4', 'purpleorange-5', 'purpleorange-6', 'purpleorange-7', 'purpleorange-8', 'purpleorange-9', 'purpleorange-10', 'purpleorange-11', 'redblue', 'redblue-3', 'redblue-4', 'redblue-5', 'redblue-6', 'redblue-7', 'redblue-8', 'redblue-9', 'redblue-10', 'redblue-11', 'redgrey', 'redgrey-3', 'redgrey-4', 'redgrey-5', 'redgrey-6', 'redgrey-7', 'redgrey-8', 'redgrey-9', 'redgrey-10', 'redgrey-11', 'redyellowblue', 'redyellowblue-3', 'redyellowblue-4', 'redyellowblue-5', 'redyellowblue-6', 'redyellowblue-7', 'redyellowblue-8', 'redyellowblue-9', 'redyellowblue-10', 'redyellowblue-11', 'redyellowgreen', 'redyellowgreen-3', 'redyellowgreen-4', 'redyellowgreen-5', 'redyellowgreen-6', 'redyellowgreen-7', 'redyellowgreen-8', 'redyellowgreen-9', 'redyellowgreen-10', 'redyellowgreen-11', 'spectral', 'spectral-3', 'spectral-4', 'spectral-5', 'spectral-6', 'spectral-7', 'spectral-8', 'spectral-9', 'spectral-10', 'spectral-11', 'blues', 'tealblues', 'teals', 'greens', 'browns', 'greys', 'purples', 'warmgreys', 'reds', 'oranges', 'rainbow', 'sinebow', 'turbo', 'viridis', 'inferno', 'magma', 'plasma', 'cividis', 'bluegreen', 'bluegreen-3', 'bluegreen-4', 'bluegreen-5', 'bluegreen-6', 'bluegreen-7', 'bluegreen-8', 'bluegreen-9', 'bluepurple', 'bluepurple-3', 'bluepurple-4', 'bluepurple-5', 'bluepurple-6', 'bluepurple-7', 'bluepurple-8', 'bluepurple-9', 'goldgreen', 'goldgreen-3', 'goldgreen-4', 'goldgreen-5', 'goldgreen-6', 'goldgreen-7', 'goldgreen-8', 'goldgreen-9', 'goldorange', 'goldorange-3', 'goldorange-4', 'goldorange-5', 'goldorange-6', 'goldorange-7', 'goldorange-8', 'goldorange-9', 'goldred', 'goldred-3', 'goldred-4', 'goldred-5', 'goldred-6', 'goldred-7', 'goldred-8', 'goldred-9', 'greenblue', 'greenblue-3', 'greenblue-4', 'greenblue-5', 'greenblue-6', 'greenblue-7', 'greenblue-8', 'greenblue-9', 'orangered', 'orangered-3', 'orangered-4', 'orangered-5', 'orangered-6', 'orangered-7', 'orangered-8', 'orangered-9', 'purplebluegreen', 'purplebluegreen-3', 'purplebluegreen-4', 'purplebluegreen-5', 'purplebluegreen-6', 'purplebluegreen-7', 'purplebluegreen-8', 'purplebluegreen-9', 'purpleblue', 'purpleblue-3', 'purpleblue-4', 'purpleblue-5', 'purpleblue-6', 'purpleblue-7', 'purpleblue-8', 'purpleblue-9', 'purplered', 'purplered-3', 'purplered-4', 'purplered-5', 'purplered-6', 'purplered-7', 'purplered-8', 'purplered-9', 'redpurple', 'redpurple-3', 'redpurple-4', 'redpurple-5', 'redpurple-6', 'redpurple-7', 'redpurple-8', 'redpurple-9', 'yellowgreenblue', 'yellowgreenblue-3', 'yellowgreenblue-4', 'yellowgreenblue-5', 'yellowgreenblue-6', 'yellowgreenblue-7', 'yellowgreenblue-8', 'yellowgreenblue-9', 'yellowgreen', 'yellowgreen-3', 'yellowgreen-4', 'yellowgreen-5', 'yellowgreen-6', 'yellowgreen-7', 'yellowgreen-8', 'yellowgreen-9', 'yelloworangebrown', 'yelloworangebrown-3', 'yelloworangebrown-4', 'yelloworangebrown-5', 'yelloworangebrown-6', 'yelloworangebrown-7', 'yelloworangebrown-8', 'yelloworangebrown-9', 'yelloworangered', 'yelloworangered-3', 'yelloworangered-4', 'yelloworangered-5', 'yelloworangered-6', 'yelloworangered-7', 'yelloworangered-8', 'yelloworangered-9', 'darkblue', 'darkblue-3', 'darkblue-4', 'darkblue-5', 'darkblue-6', 'darkblue-7', 'darkblue-8', 'darkblue-9', 'darkgold', 'darkgold-3', 'darkgold-4', 'darkgold-5', 'darkgold-6', 'darkgold-7', 'darkgold-8', 'darkgold-9', 'darkgreen', 'darkgreen-3', 'darkgreen-4', 'darkgreen-5', 'darkgreen-6', 'darkgreen-7', 'darkgreen-8', 'darkgreen-9', 'darkmulti', 'darkmulti-3', 'darkmulti-4', 'darkmulti-5', 'darkmulti-6', 'darkmulti-7', 'darkmulti-8', 'darkmulti-9', 'darkred', 'darkred-3', 'darkred-4', 'darkred-5', 'darkred-6', 'darkred-7', 'darkred-8', 'darkred-9', 'lightgreyred', 'lightgreyred-3', 'lightgreyred-4', 'lightgreyred-5', 'lightgreyred-6', 'lightgreyred-7', 'lightgreyred-8', 'lightgreyred-9', 'lightgreyteal', 'lightgreyteal-3', 'lightgreyteal-4', 'lightgreyteal-5', 'lightgreyteal-6', 'lightgreyteal-7', 'lightgreyteal-8', 'lightgreyteal-9', 'lightmulti', 'lightmulti-3', 'lightmulti-4', 'lightmulti-5', 'lightmulti-6', 'lightmulti-7', 'lightmulti-8', 'lightmulti-9', 'lightorange', 'lightorange-3', 'lightorange-4', 'lightorange-5', 'lightorange-6', 'lightorange-7', 'lightorange-8', 'lightorange-9', 'lighttealblue', 'lighttealblue-3', 'lighttealblue-4', 'lighttealblue-5', 'lighttealblue-6', 'lighttealblue-7', 'lighttealblue-8', 'lighttealblue-9']
+ name : :class:`Cyclical`, :class:`Diverging`, :class:`Categorical`, :class:`ColorScheme`, :class:`SequentialMultiHue`, :class:`SequentialSingleHue`, Literal['accent', 'category10', 'category20', 'category20b', 'category20c', 'dark2', 'paired', 'pastel1', 'pastel2', 'set1', 'set2', 'set3', 'tableau10', 'tableau20', 'observable10', 'blueorange', 'blueorange-3', 'blueorange-4', 'blueorange-5', 'blueorange-6', 'blueorange-7', 'blueorange-8', 'blueorange-9', 'blueorange-10', 'blueorange-11', 'brownbluegreen', 'brownbluegreen-3', 'brownbluegreen-4', 'brownbluegreen-5', 'brownbluegreen-6', 'brownbluegreen-7', 'brownbluegreen-8', 'brownbluegreen-9', 'brownbluegreen-10', 'brownbluegreen-11', 'purplegreen', 'purplegreen-3', 'purplegreen-4', 'purplegreen-5', 'purplegreen-6', 'purplegreen-7', 'purplegreen-8', 'purplegreen-9', 'purplegreen-10', 'purplegreen-11', 'pinkyellowgreen', 'pinkyellowgreen-3', 'pinkyellowgreen-4', 'pinkyellowgreen-5', 'pinkyellowgreen-6', 'pinkyellowgreen-7', 'pinkyellowgreen-8', 'pinkyellowgreen-9', 'pinkyellowgreen-10', 'pinkyellowgreen-11', 'purpleorange', 'purpleorange-3', 'purpleorange-4', 'purpleorange-5', 'purpleorange-6', 'purpleorange-7', 'purpleorange-8', 'purpleorange-9', 'purpleorange-10', 'purpleorange-11', 'redblue', 'redblue-3', 'redblue-4', 'redblue-5', 'redblue-6', 'redblue-7', 'redblue-8', 'redblue-9', 'redblue-10', 'redblue-11', 'redgrey', 'redgrey-3', 'redgrey-4', 'redgrey-5', 'redgrey-6', 'redgrey-7', 'redgrey-8', 'redgrey-9', 'redgrey-10', 'redgrey-11', 'redyellowblue', 'redyellowblue-3', 'redyellowblue-4', 'redyellowblue-5', 'redyellowblue-6', 'redyellowblue-7', 'redyellowblue-8', 'redyellowblue-9', 'redyellowblue-10', 'redyellowblue-11', 'redyellowgreen', 'redyellowgreen-3', 'redyellowgreen-4', 'redyellowgreen-5', 'redyellowgreen-6', 'redyellowgreen-7', 'redyellowgreen-8', 'redyellowgreen-9', 'redyellowgreen-10', 'redyellowgreen-11', 'spectral', 'spectral-3', 'spectral-4', 'spectral-5', 'spectral-6', 'spectral-7', 'spectral-8', 'spectral-9', 'spectral-10', 'spectral-11', 'blues', 'tealblues', 'teals', 'greens', 'browns', 'greys', 'purples', 'warmgreys', 'reds', 'oranges', 'rainbow', 'sinebow', 'turbo', 'viridis', 'inferno', 'magma', 'plasma', 'cividis', 'bluegreen', 'bluegreen-3', 'bluegreen-4', 'bluegreen-5', 'bluegreen-6', 'bluegreen-7', 'bluegreen-8', 'bluegreen-9', 'bluepurple', 'bluepurple-3', 'bluepurple-4', 'bluepurple-5', 'bluepurple-6', 'bluepurple-7', 'bluepurple-8', 'bluepurple-9', 'goldgreen', 'goldgreen-3', 'goldgreen-4', 'goldgreen-5', 'goldgreen-6', 'goldgreen-7', 'goldgreen-8', 'goldgreen-9', 'goldorange', 'goldorange-3', 'goldorange-4', 'goldorange-5', 'goldorange-6', 'goldorange-7', 'goldorange-8', 'goldorange-9', 'goldred', 'goldred-3', 'goldred-4', 'goldred-5', 'goldred-6', 'goldred-7', 'goldred-8', 'goldred-9', 'greenblue', 'greenblue-3', 'greenblue-4', 'greenblue-5', 'greenblue-6', 'greenblue-7', 'greenblue-8', 'greenblue-9', 'orangered', 'orangered-3', 'orangered-4', 'orangered-5', 'orangered-6', 'orangered-7', 'orangered-8', 'orangered-9', 'purplebluegreen', 'purplebluegreen-3', 'purplebluegreen-4', 'purplebluegreen-5', 'purplebluegreen-6', 'purplebluegreen-7', 'purplebluegreen-8', 'purplebluegreen-9', 'purpleblue', 'purpleblue-3', 'purpleblue-4', 'purpleblue-5', 'purpleblue-6', 'purpleblue-7', 'purpleblue-8', 'purpleblue-9', 'purplered', 'purplered-3', 'purplered-4', 'purplered-5', 'purplered-6', 'purplered-7', 'purplered-8', 'purplered-9', 'redpurple', 'redpurple-3', 'redpurple-4', 'redpurple-5', 'redpurple-6', 'redpurple-7', 'redpurple-8', 'redpurple-9', 'yellowgreenblue', 'yellowgreenblue-3', 'yellowgreenblue-4', 'yellowgreenblue-5', 'yellowgreenblue-6', 'yellowgreenblue-7', 'yellowgreenblue-8', 'yellowgreenblue-9', 'yellowgreen', 'yellowgreen-3', 'yellowgreen-4', 'yellowgreen-5', 'yellowgreen-6', 'yellowgreen-7', 'yellowgreen-8', 'yellowgreen-9', 'yelloworangebrown', 'yelloworangebrown-3', 'yelloworangebrown-4', 'yelloworangebrown-5', 'yelloworangebrown-6', 'yelloworangebrown-7', 'yelloworangebrown-8', 'yelloworangebrown-9', 'yelloworangered', 'yelloworangered-3', 'yelloworangered-4', 'yelloworangered-5', 'yelloworangered-6', 'yelloworangered-7', 'yelloworangered-8', 'yelloworangered-9', 'darkblue', 'darkblue-3', 'darkblue-4', 'darkblue-5', 'darkblue-6', 'darkblue-7', 'darkblue-8', 'darkblue-9', 'darkgold', 'darkgold-3', 'darkgold-4', 'darkgold-5', 'darkgold-6', 'darkgold-7', 'darkgold-8', 'darkgold-9', 'darkgreen', 'darkgreen-3', 'darkgreen-4', 'darkgreen-5', 'darkgreen-6', 'darkgreen-7', 'darkgreen-8', 'darkgreen-9', 'darkmulti', 'darkmulti-3', 'darkmulti-4', 'darkmulti-5', 'darkmulti-6', 'darkmulti-7', 'darkmulti-8', 'darkmulti-9', 'darkred', 'darkred-3', 'darkred-4', 'darkred-5', 'darkred-6', 'darkred-7', 'darkred-8', 'darkred-9', 'lightgreyred', 'lightgreyred-3', 'lightgreyred-4', 'lightgreyred-5', 'lightgreyred-6', 'lightgreyred-7', 'lightgreyred-8', 'lightgreyred-9', 'lightgreyteal', 'lightgreyteal-3', 'lightgreyteal-4', 'lightgreyteal-5', 'lightgreyteal-6', 'lightgreyteal-7', 'lightgreyteal-8', 'lightgreyteal-9', 'lightmulti', 'lightmulti-3', 'lightmulti-4', 'lightmulti-5', 'lightmulti-6', 'lightmulti-7', 'lightmulti-8', 'lightmulti-9', 'lightorange', 'lightorange-3', 'lightorange-4', 'lightorange-5', 'lightorange-6', 'lightorange-7', 'lightorange-8', 'lightorange-9', 'lighttealblue', 'lighttealblue-3', 'lighttealblue-4', 'lighttealblue-5', 'lighttealblue-6', 'lighttealblue-7', 'lighttealblue-8', 'lighttealblue-9']
A color scheme name for ordinal scales (e.g., ``"category10"`` or ``"blues"``).
For the full list of supported schemes, please refer to the `Vega Scheme
@@ -19834,7 +19834,7 @@ class SecondaryFieldDef(Position2Def):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -20460,7 +20460,7 @@ class FieldOrDatumDefWithConditionMarkPropFieldDefTypeForShapestringnull(
**See also:** `sort `__
documentation.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -22110,7 +22110,7 @@ class StringFieldDef(VegaLiteSchema):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -22333,7 +22333,7 @@ class StringFieldDefWithCondition(VegaLiteSchema):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -22903,7 +22903,7 @@ class FieldOrDatumDefWithConditionStringFieldDefText(TextDef):
* ``"time"`` for temporal fields and ordinal and nominal fields with ``timeUnit``.
* ``"number"`` for quantitative fields as well as ordinal and nominal fields without
``timeUnit``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
@@ -23093,6 +23093,11 @@ class TickConfig(AnyMarkConfig):
``"middle"``, ``"bottom"``.
**Note:** Expression reference is *not* supported for range marks.
+ binSpacing : float
+ Offset between bars for binned field. The ideal value for this is either 0
+ (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).
+
+ **Default value:** ``1``
blend : dict, :class:`Blend`, :class:`ExprRef`, Literal[None, 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity']
The color blend mode for drawing an item on its current background. Any valid `CSS
mix-blend-mode `__
@@ -23111,6 +23116,10 @@ class TickConfig(AnyMarkConfig):
`__.
* The ``fill`` and ``stroke`` properties have higher precedence than ``color`` and
will override ``color``.
+ continuousBandSize : float
+ The default size of the bars on continuous scales.
+
+ **Default value:** ``5``
cornerRadius : dict, float, :class:`ExprRef`
The radius in pixels of rounded rectangles or arcs' corners.
@@ -23145,6 +23154,9 @@ class TickConfig(AnyMarkConfig):
the limit parameter.
**Default value:** ``"ltr"``
+ discreteBandSize : dict, float, :class:`RelativeBandSize`
+ The default size of the bars with discrete dimensions. If unspecified, the default
+ size is ``step-2``, which provides 2 pixel offset between bars.
dx : dict, float, :class:`ExprRef`
The horizontal offset, in pixels, between the text label and its anchor point. The
offset is applied after rotation by the *angle* property.
@@ -23261,6 +23273,8 @@ class TickConfig(AnyMarkConfig):
lineHeight : dict, float, :class:`ExprRef`
The line height in pixels (the spacing between subsequent lines of text) for
multi-line text marks.
+ minBandSize : dict, float, :class:`ExprRef`
+ The minimum band size for bar and rectangle marks. **Default value:** ``0.25``
opacity : dict, float, :class:`ExprRef`
The overall opacity (value between [0,1]).
@@ -23444,8 +23458,10 @@ def __init__(
aspect: Optional[bool | Parameter | SchemaBase | Map] = Undefined,
bandSize: Optional[float] = Undefined,
baseline: Optional[Parameter | SchemaBase | Map | TextBaseline_T] = Undefined,
+ binSpacing: Optional[float] = Undefined,
blend: Optional[Parameter | SchemaBase | Map | Blend_T] = Undefined,
color: Optional[str | Parameter | SchemaBase | Map | ColorName_T] = Undefined,
+ continuousBandSize: Optional[float] = Undefined,
cornerRadius: Optional[float | Parameter | SchemaBase | Map] = Undefined,
cornerRadiusBottomLeft: Optional[
float | Parameter | SchemaBase | Map
@@ -23460,6 +23476,7 @@ def __init__(
cursor: Optional[Parameter | SchemaBase | Map | Cursor_T] = Undefined,
description: Optional[str | Parameter | SchemaBase | Map] = Undefined,
dir: Optional[Parameter | SchemaBase | Map | TextDirection_T] = Undefined,
+ discreteBandSize: Optional[float | SchemaBase | Map] = Undefined,
dx: Optional[float | Parameter | SchemaBase | Map] = Undefined,
dy: Optional[float | Parameter | SchemaBase | Map] = Undefined,
ellipsis: Optional[str | Parameter | SchemaBase | Map] = Undefined,
@@ -23481,6 +23498,7 @@ def __init__(
limit: Optional[float | Parameter | SchemaBase | Map] = Undefined,
lineBreak: Optional[str | Parameter | SchemaBase | Map] = Undefined,
lineHeight: Optional[float | Parameter | SchemaBase | Map] = Undefined,
+ minBandSize: Optional[float | Parameter | SchemaBase | Map] = Undefined,
opacity: Optional[float | Parameter | SchemaBase | Map] = Undefined,
order: Optional[bool | None] = Undefined,
orient: Optional[SchemaBase | Orientation_T] = Undefined,
@@ -23540,8 +23558,10 @@ def __init__(
aspect=aspect,
bandSize=bandSize,
baseline=baseline,
+ binSpacing=binSpacing,
blend=blend,
color=color,
+ continuousBandSize=continuousBandSize,
cornerRadius=cornerRadius,
cornerRadiusBottomLeft=cornerRadiusBottomLeft,
cornerRadiusBottomRight=cornerRadiusBottomRight,
@@ -23550,6 +23570,7 @@ def __init__(
cursor=cursor,
description=description,
dir=dir,
+ discreteBandSize=discreteBandSize,
dx=dx,
dy=dy,
ellipsis=ellipsis,
@@ -23569,6 +23590,7 @@ def __init__(
limit=limit,
lineBreak=lineBreak,
lineHeight=lineHeight,
+ minBandSize=minBandSize,
opacity=opacity,
order=order,
orient=orient,
@@ -26057,7 +26079,7 @@ class TypedFieldDef(VegaLiteSchema):
about escaping in the `field documentation
`__. 2) ``field`` is not required
if ``aggregate`` is ``count``.
- timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
+ timeUnit : dict, :class:`TimeUnit`, :class:`MultiTimeUnit`, :class:`BinnedTimeUnit`, :class:`SingleTimeUnit`, :class:`TimeUnitParams`, :class:`UtcMultiTimeUnit`, :class:`UtcSingleTimeUnit`, :class:`LocalMultiTimeUnit`, :class:`LocalSingleTimeUnit`, Literal['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear', 'utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds', 'year', 'quarter', 'month', 'week', 'day', 'dayofyear', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 'utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds', 'yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds']
Time unit (e.g., ``year``, ``yearmonth``, ``month``, ``hours``) for a temporal
field. or `a temporal field that gets casted as ordinal
`__.
diff --git a/altair/vegalite/v5/schema/vega-lite-schema.json b/altair/vegalite/v5/schema/vega-lite-schema.json
index b6c6b5a1f..c99b9e876 100644
--- a/altair/vegalite/v5/schema/vega-lite-schema.json
+++ b/altair/vegalite/v5/schema/vega-lite-schema.json
@@ -4428,46 +4428,37 @@
]
},
"BinnedTimeUnit": {
- "anyOf": [
- {
- "enum": [
- "binnedyear",
- "binnedyearquarter",
- "binnedyearquartermonth",
- "binnedyearmonth",
- "binnedyearmonthdate",
- "binnedyearmonthdatehours",
- "binnedyearmonthdatehoursminutes",
- "binnedyearmonthdatehoursminutesseconds",
- "binnedyearweek",
- "binnedyearweekday",
- "binnedyearweekdayhours",
- "binnedyearweekdayhoursminutes",
- "binnedyearweekdayhoursminutesseconds",
- "binnedyeardayofyear"
- ],
- "type": "string"
- },
- {
- "enum": [
- "binnedutcyear",
- "binnedutcyearquarter",
- "binnedutcyearquartermonth",
- "binnedutcyearmonth",
- "binnedutcyearmonthdate",
- "binnedutcyearmonthdatehours",
- "binnedutcyearmonthdatehoursminutes",
- "binnedutcyearmonthdatehoursminutesseconds",
- "binnedutcyearweek",
- "binnedutcyearweekday",
- "binnedutcyearweekdayhours",
- "binnedutcyearweekdayhoursminutes",
- "binnedutcyearweekdayhoursminutesseconds",
- "binnedutcyeardayofyear"
- ],
- "type": "string"
- }
- ]
+ "enum": [
+ "binnedyear",
+ "binnedyearquarter",
+ "binnedyearquartermonth",
+ "binnedyearmonth",
+ "binnedyearmonthdate",
+ "binnedyearmonthdatehours",
+ "binnedyearmonthdatehoursminutes",
+ "binnedyearmonthdatehoursminutesseconds",
+ "binnedyearweek",
+ "binnedyearweekday",
+ "binnedyearweekdayhours",
+ "binnedyearweekdayhoursminutes",
+ "binnedyearweekdayhoursminutesseconds",
+ "binnedyeardayofyear",
+ "binnedutcyear",
+ "binnedutcyearquarter",
+ "binnedutcyearquartermonth",
+ "binnedutcyearmonth",
+ "binnedutcyearmonthdate",
+ "binnedutcyearmonthdatehours",
+ "binnedutcyearmonthdatehoursminutes",
+ "binnedutcyearmonthdatehoursminutesseconds",
+ "binnedutcyearweek",
+ "binnedutcyearweekday",
+ "binnedutcyearweekdayhours",
+ "binnedutcyearweekdayhoursminutes",
+ "binnedutcyearweekdayhoursminutesseconds",
+ "binnedutcyeardayofyear"
+ ],
+ "type": "string"
},
"Blend": {
"enum": [
@@ -4761,7 +4752,8 @@
"set2",
"set3",
"tableau10",
- "tableau20"
+ "tableau20",
+ "observable10"
],
"type": "string"
},
@@ -19238,29 +19230,9 @@
"type": "object"
},
"ParseValue": {
- "anyOf": [
- {
- "type": "null"
- },
- {
- "type": "string"
- },
- {
- "const": "string",
- "type": "string"
- },
- {
- "const": "boolean",
- "type": "string"
- },
- {
- "const": "date",
- "type": "string"
- },
- {
- "const": "number",
- "type": "string"
- }
+ "type": [
+ "string",
+ "null"
]
},
"PivotTransform": {
@@ -27685,6 +27657,8 @@
},
"SingleDefUnitChannel": {
"enum": [
+ "text",
+ "shape",
"x",
"y",
"xOffset",
@@ -27709,9 +27683,7 @@
"strokeDash",
"size",
"angle",
- "shape",
"key",
- "text",
"href",
"url",
"description"
@@ -28336,6 +28308,11 @@
],
"description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
},
+ "binSpacing": {
+ "description": "Offset between bars for binned field. The ideal value for this is either 0 (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).\n\n__Default value:__ `1`",
+ "minimum": 0,
+ "type": "number"
+ },
"blend": {
"anyOf": [
{
@@ -28361,6 +28338,11 @@
],
"description": "Default color.\n\n__Default value:__ ■ `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
},
+ "continuousBandSize": {
+ "description": "The default size of the bars on continuous scales.\n\n__Default value:__ `5`",
+ "minimum": 0,
+ "type": "number"
+ },
"cornerRadius": {
"anyOf": [
{
@@ -28449,6 +28431,18 @@
}
]
},
+ "discreteBandSize": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "$ref": "#/definitions/RelativeBandSize"
+ }
+ ],
+ "description": "The default size of the bars with discrete dimensions. If unspecified, the default size is `step-2`, which provides 2 pixel offset between bars.",
+ "minimum": 0
+ },
"dx": {
"anyOf": [
{
@@ -28661,6 +28655,17 @@
}
]
},
+ "minBandSize": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "$ref": "#/definitions/ExprRef"
+ }
+ ],
+ "description": "The minimum band size for bar and rectangle marks. __Default value:__ `0.25`"
+ },
"opacity": {
"anyOf": [
{
diff --git a/pyproject.toml b/pyproject.toml
index 5e52b5d2f..190c7131a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -104,7 +104,7 @@ doc = [
# Minimum/exact versions, for projects under the `vega` organization
vega-datasets = "v2.11.0" # https://github.com/vega/vega-datasets
vega-embed = "6" # https://github.com/vega/vega-embed
-vega-lite = "v5.20.1" # https://github.com/vega/vega-lite
+vega-lite = "v5.21.0" # https://github.com/vega/vega-lite
[tool.hatch.version]
path = "altair/__init__.py"
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index 86f7e925b..af528d9b7 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -794,8 +794,7 @@ def id_func_chart_error_example(val) -> str:
- One of \['utcyear', 'utcquarter', 'utcmonth', 'utcweek', 'utcday', 'utcdayofyear', 'utcdate', 'utchours', 'utcminutes', 'utcseconds', 'utcmilliseconds'\]
- One of \['yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 'yearmonthdatehoursminutes', 'yearmonthdatehoursminutesseconds', 'yearweek', 'yearweekday', 'yearweekdayhours', 'yearweekdayhoursminutes', 'yearweekdayhoursminutesseconds', 'yeardayofyear', 'quartermonth', 'monthdate', 'monthdatehours', 'monthdatehoursminutes', 'monthdatehoursminutesseconds', 'weekday', 'weekdayhours', 'weekdayhoursminutes', 'weekdayhoursminutesseconds', 'dayhours', 'dayhoursminutes', 'dayhoursminutesseconds', 'hoursminutes', 'hoursminutesseconds', 'minutesseconds', 'secondsmilliseconds'\]
- One of \['utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 'utcyearmonthdatehours', 'utcyearmonthdatehoursminutes', 'utcyearmonthdatehoursminutesseconds', 'utcyearweek', 'utcyearweekday', 'utcyearweekdayhours', 'utcyearweekdayhoursminutes', 'utcyearweekdayhoursminutesseconds', 'utcyeardayofyear', 'utcquartermonth', 'utcmonthdate', 'utcmonthdatehours', 'utcmonthdatehoursminutes', 'utcmonthdatehoursminutesseconds', 'utcweekday', 'utcweekdayhours', 'utcweekdayhoursminutes', 'utcweekdayhoursminutesseconds', 'utcdayhours', 'utcdayhoursminutes', 'utcdayhoursminutesseconds', 'utchoursminutes', 'utchoursminutesseconds', 'utcminutesseconds', 'utcsecondsmilliseconds'\]
- - One of \['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear'\]
- - One of \['binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear'\]
+ - One of \['binnedyear', 'binnedyearquarter', 'binnedyearquartermonth', 'binnedyearmonth', 'binnedyearmonthdate', 'binnedyearmonthdatehours', 'binnedyearmonthdatehoursminutes', 'binnedyearmonthdatehoursminutesseconds', 'binnedyearweek', 'binnedyearweekday', 'binnedyearweekdayhours', 'binnedyearweekdayhoursminutes', 'binnedyearweekdayhoursminutesseconds', 'binnedyeardayofyear', 'binnedutcyear', 'binnedutcyearquarter', 'binnedutcyearquartermonth', 'binnedutcyearmonth', 'binnedutcyearmonthdate', 'binnedutcyearmonthdatehours', 'binnedutcyearmonthdatehoursminutes', 'binnedutcyearmonthdatehoursminutesseconds', 'binnedutcyearweek', 'binnedutcyearweekday', 'binnedutcyearweekdayhours', 'binnedutcyearweekdayhoursminutes', 'binnedutcyearweekdayhoursminutesseconds', 'binnedutcyeardayofyear'\]
- Of type {re.escape("`Mapping[str, Any]`")}$""",
),
(
diff --git a/tools/versioning.py b/tools/versioning.py
index 25e7a226e..5a1ebb09d 100644
--- a/tools/versioning.py
+++ b/tools/versioning.py
@@ -255,7 +255,7 @@ def _iter_py_deps_versions(
if sp.operator in _LOWER_BOUNDS
)
version = str(min(it))
- yield req.name, version
+ yield req.name, version # type: ignore[misc]
def __getattr__(name: str) -> _Versions:
From 23b189103b8c5ac38928876cdde5ec5f71fcadc3 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 9 Jan 2025 12:42:50 +0000
Subject: [PATCH 47/53] ci: Unpin `pillow`, allow `>=10.0.0` (#3764)
---
pyproject.toml | 2 +-
sphinxext/utils.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 190c7131a..be5241455 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -92,7 +92,7 @@ doc = [
"sphinxext_altair",
"jinja2",
"numpydoc",
- "pillow>=9,<10",
+ "pillow",
"pydata-sphinx-theme>=0.14.1",
"myst-parser",
"sphinx_copybutton",
diff --git a/sphinxext/utils.py b/sphinxext/utils.py
index 743cf0913..ed3e974c6 100644
--- a/sphinxext/utils.py
+++ b/sphinxext/utils.py
@@ -30,7 +30,7 @@ def create_thumbnail(
final_height = height
final_width = int(im_width * height_factor)
- thumb = im.resize((final_width, final_height), Image.ANTIALIAS)
+ thumb = im.resize((final_width, final_height), Image.Resampling.LANCZOS)
thumb.save(thumb_filename)
From 8a6f65c02e18c9acd3a08e02f73670795c0a7e66 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Fri, 10 Jan 2025 14:25:37 +0000
Subject: [PATCH 48/53] chore(ruff): Update to `0.9.0` (#3766)
---
altair/utils/save.py | 2 +-
altair/utils/schemapi.py | 2 +-
altair/vegalite/v5/api.py | 10 +-
altair/vegalite/v5/display.py | 2 +-
pyproject.toml | 284 +++++++++-------------------
sphinxext/code_ref.py | 2 +-
sphinxext/schematable.py | 2 +-
tests/__init__.py | 2 +-
tests/utils/test_plugin_registry.py | 4 +-
tests/utils/test_schemapi.py | 4 +-
tools/generate_schema_wrapper.py | 8 +-
tools/schemapi/schemapi.py | 2 +-
tools/update_init_file.py | 5 +-
tools/vega_expr.py | 3 +-
14 files changed, 113 insertions(+), 219 deletions(-)
diff --git a/altair/utils/save.py b/altair/utils/save.py
index 042d457dc..0b17c8e1f 100644
--- a/altair/utils/save.py
+++ b/altair/utils/save.py
@@ -65,7 +65,7 @@ def set_inspect_mode_argument(
mode = "vega-lite"
if mode != "vega-lite":
- msg = "mode must be 'vega-lite', " f"not '{mode}'"
+ msg = f"mode must be 'vega-lite', not '{mode}'"
raise ValueError(msg)
if mode == "vega-lite" and vegalite_version is None:
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index e7708f0d7..3a49b928d 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -58,7 +58,7 @@
from typing import Never, Self
else:
from typing_extensions import Never, Self
- _OptionalModule: TypeAlias = "ModuleType | None"
+ _OptionalModule: TypeAlias = "ModuleType | None" # noqa: TC008
ValidationErrorList: TypeAlias = list[jsonschema.exceptions.ValidationError]
GroupedValidationErrors: TypeAlias = dict[str, ValidationErrorList]
diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py
index e46e3070a..9a6feb667 100644
--- a/altair/vegalite/v5/api.py
+++ b/altair/vegalite/v5/api.py
@@ -1138,7 +1138,7 @@ def __repr__(self) -> str:
args = f"{COND}{self.condition!r}".replace("\n", "\n ")
else:
conds = "\n ".join(f"{c!r}" for c in self.condition)
- args = f"{COND}[\n " f"{conds}\n ]"
+ args = f"{COND}[\n {conds}\n ]"
return f"{name}({LB}\n {args}\n{RB})"
@@ -1166,9 +1166,7 @@ def __init__(
def __repr__(self) -> str:
return (
- f"{type(self).__name__}(\n"
- f" {self._conditions!r},\n {self._condition!r}\n"
- ")"
+ f"{type(self).__name__}(\n {self._conditions!r},\n {self._condition!r}\n)"
)
def then(self, statement: _StatementType, /, **kwds: Any) -> Then[_Conditions]:
@@ -3771,7 +3769,7 @@ def show(self) -> None:
def _set_resolve(self, **kwargs: Any): # noqa: ANN202
"""Copy the chart and update the resolve property with kwargs."""
if not hasattr(self, "resolve"):
- msg = f"{self.__class__} object has no attribute " "'resolve'"
+ msg = f"{self.__class__} object has no attribute 'resolve'"
raise ValueError(msg)
copy = _top_schema_base(self).copy(deep=["resolve"])
if copy.resolve is Undefined:
@@ -4726,7 +4724,7 @@ def interactive(
"""
if not self.layer:
- msg = "LayerChart: cannot call interactive() until a " "layer is defined"
+ msg = "LayerChart: cannot call interactive() until a layer is defined"
raise ValueError(msg)
copy = self.copy(deep=["layer"])
copy.layer[0] = copy.layer[0].interactive(
diff --git a/altair/vegalite/v5/display.py b/altair/vegalite/v5/display.py
index dcc506958..9c909b2d0 100644
--- a/altair/vegalite/v5/display.py
+++ b/altair/vegalite/v5/display.py
@@ -41,7 +41,7 @@
# The display message when rendering fails
DEFAULT_DISPLAY: Final = f"""\
-
+
If you see this message, it means the renderer has not been properly enabled
for the frontend that you are using. For more information, see
diff --git a/pyproject.toml b/pyproject.toml
index be5241455..db119806e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -203,193 +203,102 @@ publish-clean-build = [
]
[tool.ruff]
-target-version = "py39"
-line-length = 88
-indent-width = 4
exclude = [
".git",
- "build",
"__pycache__",
+ "build",
"tests/examples_arguments_syntax",
"tests/examples_methods_syntax",
]
+indent-width = 4
+line-length = 88
+target-version = "py39"
[tool.ruff.lint]
-# https://docs.astral.sh/ruff/preview/
-preview = true
-
-# https://docs.astral.sh/ruff/settings/#lint_extend-safe-fixes
-extend-safe-fixes=[
- # unnecessary-comprehension-in-call
- "C419",
- # literal-membership
- "PLR6201",
- # from __future__ import annotations #
- # ---------------------------------- #
- "UP006",
- "UP007",
- "UP008",
- "TCH",
- # assign exception msg to variable #
- # -------------------------------- #
- "EM101",
- "EM102",
- # trailing-whitespace
- "W291",
- # blank line contains whitespace
- "W293",
- # unsorted-dunder-all
- "RUF022",
- # pydocstyle #
- # ---------- #
- # fits-on-one-line
- "D200",
- # escape-sequence-in-docstring
- "D301",
- # ends-in-period
- "D400",
- # missing-return-type-special-method
- "ANN204",
- # unnecessary-dict-comprehension-for-iterable
- "C420",
+extend-safe-fixes = [ # https://docs.astral.sh/ruff/settings/#lint_extend-safe-fixes
+ "ANN204", # missing-return-type-special-method
+ "C419", # unnecessary-comprehension-in-call
+ "C420", # unnecessary-dict-comprehension-for-iterable
+ "D200", # fits-on-one-line
+ "D301", # escape-sequence-in-docstring
+ "D400", # ends-in-period
+ "EM101", # raw-string-in-exception
+ "EM102", # f-string-in-exception
+ "PLR6201", # literal-membership
+ "TC", # flake8-type-checking
+ "UP006", # non-pep585-annotation
+ "UP007", # non-pep604-annotation-union
+ "UP008", # super-call-with-parameters
+ "W291", # trailing-whitespace
+ "W293", # blank line contains whitespace
]
-
-# https://docs.astral.sh/ruff/preview/#using-rules-that-are-in-preview
-extend-select=[
- # refurb
- "FURB",
- # pylint (preview) autofix #
- # ------------------------ #
- # unnecessary-dunder-call
- "PLC2801",
- # unnecessary-dict-index-lookup
- "PLR1733",
- # unnecessary-list-index-lookup
- "PLR1736",
- # literal-membership
- "PLR6201",
- # unspecified-encoding
- "PLW1514",
+extend-select = [ # https://docs.astral.sh/ruff/preview/#using-rules-that-are-in-preview
+ "FURB", # refurb
+ "PLC2801", # unnecessary-dunder-call
+ "PLR1733", # unnecessary-dict-index-lookup
+ "PLR1736", # unnecessary-list-index-lookup
+ "PLR6201", # literal-membership
+ "PLW1514", # unspecified-encoding
]
-select = [
- # flake8-bugbear
- "B",
- # flake8-comprehensions
- "C4",
- # pycodestyle-error
- "E",
- # flake8-errmsg
- "EM",
- # pyflakes
- "F",
- # flake8-future-annotations
- "FA",
- # flynt
- "FLY",
- # flake8-pie
- "PIE",
- # flake8-pytest-style
- "PT",
- # flake8-use-pathlib
- "PTH",
- # Ruff-specific rules
- "RUF",
- # flake8-simplify
- "SIM",
- # flake8-type-checking
- "TCH",
- # flake8-tidy-imports
- "TID",
- # pyupgrade
- "UP",
- # pycodestyle-warning
- "W",
- # pylint (stable) autofix #
- # ----------------------- #
- # iteration-over-set
- "PLC0208",
- # manual-from-import
- "PLR0402",
- # useless-return
- "PLR1711",
- # repeated-equality-comparison
- "PLR1714",
- # collapsible-else-if
- "PLR5501",
- # useless-else-on-loop
- "PLW0120",
- # subprocess-run-without-check
- "PLW1510",
- # nested-min-max
- "PLW3301",
- # pydocstyle #
- # ---------- #
- "D",
- # multi-line-summary-second-line
- "D213",
- # numpy-specific-rules
- "NPY",
- # flake8-annotations
- "ANN",
- # unsorted-imports
- "I001",
- # complex-structure
- "C901",
+ignore = [
+ "ANN401", # any-type
+ "D100", # undocumented-public-module
+ "D101", # undocumented-public-class
+ "D102", # undocumented-public-method
+ "D103", # undocumented-public-function
+ "D104", # undocumented-public-package
+ "D105", # undocumented-magic-method
+ "D107", # undocumented-public-init
+ "D206", # indent-with-spaces
+ "D212", # multi-line-summary-first-line ((D213) is the opposite of this)
+ "D401", # non-imperative-mood
+ "D413", # missing-blank-line-after-last-section
+ "E501", # line-too-long (https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules)
+ "RUF012", # mutable-class-default
+ "RUF052", # used-dummy-variable
+ "SIM105", # suppressible-exception (https://github.com/vega/altair/pull/3431#discussion_r1629808660)
+ "W505", # doc-line-too-long
]
-ignore = [
- # Whitespace before ':'
- "E203",
- # Too many leading '#' for block comment
- "E266",
- # Line too long
- "E501",
- # zip() without an explicit strict= parameter set.
- # python>=3.10 only
- "B905",
- # mutable-class-default
- "RUF012",
- # used-dummy-variable
- "RUF052",
- # suppressible-exception
- # https://github.com/vega/altair/pull/3431#discussion_r1629808660
- "SIM105",
- # pydocstyle/ https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules #
- # ------------------------------------------------------------------------- #
- # undocumented-public-module
- "D100",
- # undocumented-public-class
- "D101",
- # undocumented-public-method
- "D102",
- # undocumented-public-function
- "D103",
- # undocumented-public-package
- "D104",
- # undocumented-magic-method
- "D105",
- # undocumented-public-init
- "D107",
- # indent-with-spaces
- "D206",
- # multi-line-summary-first-line ((D213) is the opposite of this)
- "D212",
- # Imperative mood
- "D401",
- # Blank line after last section
- "D413",
- # doc-line-too-long
- "W505",
- # Any as annotation
- "ANN401"
+mccabe.max-complexity = 10
+preview = true # https://docs.astral.sh/ruff/preview/
+pydocstyle.convention = "numpy" # https://docs.astral.sh/ruff/settings/#lintpydocstyle
+select = [
+ "ANN", # flake8-annotations
+ "B", # flake8-bugbear
+ "C4", # flake8-comprehensions
+ "C901", # complex-structure
+ "D", # pydocstyle
+ "D213", # multi-line-summary-second-line
+ "E", # pycodestyle-error
+ "EM", # flake8-errmsg
+ "F", # pyflakes
+ "FA", # flake8-future-annotations
+ "FLY", # flynt
+ "I001", # unsorted-imports
+ "NPY", # numpy-specific-rules
+ "PIE", # flake8-pie
+ "PLC0208", # iteration-over-set
+ "PLR0402", # manual-from-import
+ "PLR1711", # useless-return
+ "PLR1714", # repeated-equality-comparison
+ "PLR5501", # collapsible-else-if
+ "PLW0120", # useless-else-on-loop
+ "PLW1510", # subprocess-run-without-check
+ "PLW3301", # nested-min-max
+ "PT", # flake8-pytest-style
+ "PTH", # flake8-use-pathlib
+ "RUF", # Ruff-specific rules
+ "SIM", # flake8-simplify
+ "TC", # flake8-type-checking
+ "TID", # flake8-tidy-imports
+ "UP", # pyupgrade
+ "W", # pycodestyle-warning
]
-# https://docs.astral.sh/ruff/settings/#lintpydocstyle
-pydocstyle={ convention="numpy" }
-mccabe={ max-complexity=10 }
[tool.ruff.lint.isort]
-classes = ["expr", "datum"]
+classes = ["datum", "expr"]
extra-standard-library = ["typing_extensions"]
-known-first-party=[
+known-first-party = [
"altair_tiles",
"sphinxext_altair",
"vega_datasets",
@@ -400,37 +309,30 @@ split-on-trailing-comma = false
[tool.ruff.lint.flake8-tidy-imports.banned-api]
# https://docs.astral.sh/ruff/settings/#lint_flake8-tidy-imports_banned-api
-"typing.Optional".msg = """
-Use `Union[T, None]` instead.
-`typing.Optional` is likely to be confused with `altair.typing.Optional`, \
-which have a similar but different semantic meaning.
-See https://github.com/vega/altair/pull/3449
-"""
"narwhals.dependencies".msg = """
Import `dependencies` from `narwhals.stable.v1` instead.
"""
+"narwhals.dtypes".msg = """
+Import `dtypes` from `narwhals.stable.v1` instead.
+"""
"narwhals.typing".msg = """
Import `typing` from `narwhals.stable.v1` instead.
"""
-"narwhals.dtypes".msg = """
-Import `dtypes` from `narwhals.stable.v1` instead.
+"typing.Optional".msg = """
+Use `Union[T, None]` instead.
+`typing.Optional` is likely to be confused with `altair.typing.Optional`, \
+which have a similar but different semantic meaning.
+See https://github.com/vega/altair/pull/3449
"""
[tool.ruff.lint.per-file-ignores]
-# Only enforce type annotation rules on public api
-"!altair/vegalite/v5/api.py" = ["ANN"]
-# Allow complex if/elif branching during tests
-"tests/**/*.py"= ["C901"]
-
+"!altair/vegalite/v5/api.py" = ["ANN"] # Only enforce annotation rules on public api
+"tests/**/*.py" = ["C901"] # Allow complex if/elif branching during tests
[tool.ruff.format]
-quote-style = "double"
-indent-style = "space"
-skip-magic-trailing-comma = false
-line-ending = "lf"
-# https://docs.astral.sh/ruff/formatter/#docstring-formatting
-docstring-code-format = true
+docstring-code-format = true # https://docs.astral.sh/ruff/formatter/#docstring-formatting
docstring-code-line-length = 88
+line-ending = "lf"
[tool.pytest.ini_options]
# Pytest does not need to search these folders for test functions.
diff --git a/sphinxext/code_ref.py b/sphinxext/code_ref.py
index efe9ef5e1..4ddea8a60 100644
--- a/sphinxext/code_ref.py
+++ b/sphinxext/code_ref.py
@@ -64,7 +64,7 @@ def validate_packages(packages: Any) -> str:
if len(split) == 1:
return f'["{split[0]}"]'
else:
- return f'[{",".join(split)}]'
+ return f"[{','.join(split)}]"
def raw_html(text: str, /) -> nodes.raw:
diff --git a/sphinxext/schematable.py b/sphinxext/schematable.py
index 323f8dfe7..0b3a9c3c6 100644
--- a/sphinxext/schematable.py
+++ b/sphinxext/schematable.py
@@ -40,7 +40,7 @@ def type_description(schema: dict[str, Any]) -> str:
)
else:
warnings.warn(
- f"cannot infer type for schema with keys {schema.keys()}" "",
+ f"cannot infer type for schema with keys {schema.keys()}",
stacklevel=1,
)
return "--"
diff --git a/tests/__init__.py b/tests/__init__.py
index 617cfca80..706f6d181 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -22,7 +22,7 @@
from _pytest.mark import ParameterSet
MarksType: TypeAlias = (
- "pytest.MarkDecorator | Collection[pytest.MarkDecorator | pytest.Mark]"
+ "pytest.MarkDecorator | Collection[pytest.MarkDecorator | pytest.Mark]" # noqa: TC008
)
diff --git a/tests/utils/test_plugin_registry.py b/tests/utils/test_plugin_registry.py
index d200bbe96..759a316df 100644
--- a/tests/utils/test_plugin_registry.py
+++ b/tests/utils/test_plugin_registry.py
@@ -32,7 +32,7 @@ def test_plugin_registry():
assert plugins.active == ""
assert plugins.get() is None
assert repr(plugins) == (
- "TypedCallableRegistry(active='', " "registered=['new_plugin'])"
+ "TypedCallableRegistry(active='', registered=['new_plugin'])"
)
plugins.enable("new_plugin")
@@ -42,7 +42,7 @@ def test_plugin_registry():
assert fn is not None
assert fn(3) == 9
assert repr(plugins) == (
- "TypedCallableRegistry(active='new_plugin', " "registered=['new_plugin'])"
+ "TypedCallableRegistry(active='new_plugin', registered=['new_plugin'])"
)
diff --git a/tests/utils/test_schemapi.py b/tests/utils/test_schemapi.py
index af528d9b7..f8b994153 100644
--- a/tests/utils/test_schemapi.py
+++ b/tests/utils/test_schemapi.py
@@ -362,9 +362,7 @@ def test_attribute_error():
invalid_attr = "invalid_attribute"
with pytest.raises(AttributeError) as err:
getattr(m, invalid_attr)
- assert str(err.value) == (
- "'MySchema' object has no attribute " "'invalid_attribute'"
- )
+ assert str(err.value) == ("'MySchema' object has no attribute 'invalid_attribute'")
def test_to_from_json(dct):
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index df1b32681..1200de88e 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -766,7 +766,7 @@ def generate_vegalite_schema_wrapper(fp: Path, /) -> ModuleDef[str]:
f"from altair.vegalite.v5.api import {CHART_DATA_TYPE}",
"from ._typing import * # noqa: F403",
),
- "\n" f"__all__ = {all_}\n",
+ f"\n__all__ = {all_}\n",
LOAD_SCHEMA.format(schemafile=SCHEMA_FILE),
BASE_SCHEMA.format(basename=basename),
schema_class(
@@ -905,7 +905,7 @@ def generate_vegalite_channel_wrappers(fp: Path, /) -> ModuleDef[list[str]]:
f"from altair.vegalite.v5.api import {', '.join(TYPING_API)}",
textwrap.indent(import_typing_extensions((3, 11), "Self"), " "),
),
- "\n" f"__all__ = {all_}\n",
+ f"\n__all__ = {all_}\n",
CHANNEL_MIXINS,
*class_defs,
*generate_encoding_artifacts(
@@ -1016,9 +1016,7 @@ def generate_typed_dict(
f"{args}\n "
f"__extra_items__: {finalize_type_reprs(kwds_all_tps, target=TARGET)}"
)
- doc = (
- f"{doc}\n" f"{EXTRA_ITEMS_MESSAGE.format(invalid_kwds=repr(sorted(kwds)))}"
- )
+ doc = f"{doc}\n{EXTRA_ITEMS_MESSAGE.format(invalid_kwds=repr(sorted(kwds)))}"
return UNIVERSAL_TYPED_DICT.format(
name=name,
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index 60e8182a7..0b926ec69 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -56,7 +56,7 @@
from typing import Never, Self
else:
from typing_extensions import Never, Self
- _OptionalModule: TypeAlias = "ModuleType | None"
+ _OptionalModule: TypeAlias = "ModuleType | None" # noqa: TC008
ValidationErrorList: TypeAlias = list[jsonschema.exceptions.ValidationError]
GroupedValidationErrors: TypeAlias = dict[str, ValidationErrorList]
diff --git a/tools/update_init_file.py b/tools/update_init_file.py
index 7faa837d3..0dfbd6c62 100644
--- a/tools/update_init_file.py
+++ b/tools/update_init_file.py
@@ -83,7 +83,7 @@ def update__all__variable() -> None:
ruff.write_lint_format(init_path, new_lines)
for source in DYNAMIC_ALL:
- print(f"Updating `__all__`\n " f"{source!r}\n ->{normalize_source(source)!s}")
+ print(f"Updating `__all__`\n {source!r}\n ->{normalize_source(source)!s}")
update_dynamic__all__(source)
@@ -149,8 +149,7 @@ def _retrieve_all(name: str, /) -> list[str]:
found = _import_module(name).__all__
if not found:
msg = (
- f"Expected to find a populated `__all__` for {name!r},\n"
- f"but got: {found!r}"
+ f"Expected to find a populated `__all__` for {name!r},\nbut got: {found!r}"
)
raise AttributeError(msg)
return found
diff --git a/tools/vega_expr.py b/tools/vega_expr.py
index 7e7a33035..9f7e010a3 100644
--- a/tools/vega_expr.py
+++ b/tools/vega_expr.py
@@ -391,8 +391,7 @@ def _compile(self) -> Pattern[str]:
if not self._mapping:
name = self._mapping.__qualname__ # type: ignore[attr-defined]
msg = (
- f"Requires {name!r} to be populated, but got:\n"
- f"{name}={self._mapping!r}"
+ f"Requires {name!r} to be populated, but got:\n{name}={self._mapping!r}"
)
raise TypeError(msg)
return re.compile(rf"{self._fmt_match.format('|'.join(self._mapping))}")
From 4bb957bdf8242ffce9ad3f771f89f2d9bbc5f401 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Mon, 13 Jan 2025 17:06:30 +0000
Subject: [PATCH 49/53] feat: Show `user_rows` in `MaxRowsError` message
(#3768)
---
altair/utils/data.py | 40 +++++++++++++++++++++++-----------------
1 file changed, 23 insertions(+), 17 deletions(-)
diff --git a/altair/utils/data.py b/altair/utils/data.py
index 565a6df7d..63ae7ffb0 100644
--- a/altair/utils/data.py
+++ b/altair/utils/data.py
@@ -106,6 +106,26 @@ def consolidate_datasets(self, value: bool) -> None:
class MaxRowsError(Exception):
"""Raised when a data model has too many rows."""
+ def __init__(self, message: str, /) -> None:
+ self.message = message
+ super().__init__(self.message)
+
+ @classmethod
+ def from_limit_rows(cls, user_rows: int, max_rows: int, /) -> MaxRowsError:
+ msg = (
+ f"The number of rows in your dataset ({user_rows}) is greater "
+ f"than the maximum allowed ({max_rows}).\n\n"
+ "Try enabling the VegaFusion data transformer which "
+ "raises this limit by pre-evaluating data\n"
+ "transformations in Python.\n"
+ " >> import altair as alt\n"
+ ' >> alt.data_transformers.enable("vegafusion")\n\n'
+ "Or, see https://altair-viz.github.io/user_guide/large_datasets.html "
+ "for additional information\n"
+ "on how to plot large datasets."
+ )
+ return cls(msg)
+
@overload
def limit_rows(data: None = ..., max_rows: int | None = ...) -> partial: ...
@@ -123,21 +143,6 @@ def limit_rows(
return partial(limit_rows, max_rows=max_rows)
check_data_type(data)
- def raise_max_rows_error():
- msg = (
- "The number of rows in your dataset is greater "
- f"than the maximum allowed ({max_rows}).\n\n"
- "Try enabling the VegaFusion data transformer which "
- "raises this limit by pre-evaluating data\n"
- "transformations in Python.\n"
- " >> import altair as alt\n"
- ' >> alt.data_transformers.enable("vegafusion")\n\n'
- "Or, see https://altair-viz.github.io/user_guide/large_datasets.html "
- "for additional information\n"
- "on how to plot large datasets."
- )
- raise MaxRowsError(msg)
-
if isinstance(data, SupportsGeoInterface):
if data.__geo_interface__["type"] == "FeatureCollection":
values = data.__geo_interface__["features"]
@@ -152,8 +157,9 @@ def raise_max_rows_error():
data = to_eager_narwhals_dataframe(data)
values = data
- if max_rows is not None and len(values) > max_rows:
- raise_max_rows_error()
+ n = len(values)
+ if max_rows is not None and n > max_rows:
+ raise MaxRowsError.from_limit_rows(n, max_rows)
return data
From a654f604f0b520f4710a267e376ba2567058baeb Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 16 Jan 2025 14:54:53 +0000
Subject: [PATCH 50/53] chore(ruff): Fix `0.9.2` lints (#3771)
---
altair/utils/schemapi.py | 2 +-
tests/__init__.py | 2 +-
tests/utils/test_utils.py | 2 +-
tests/vegalite/v5/test_renderers.py | 24 +++++++++++++-----------
tools/schemapi/schemapi.py | 2 +-
5 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index 3a49b928d..e7708f0d7 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -58,7 +58,7 @@
from typing import Never, Self
else:
from typing_extensions import Never, Self
- _OptionalModule: TypeAlias = "ModuleType | None" # noqa: TC008
+ _OptionalModule: TypeAlias = "ModuleType | None"
ValidationErrorList: TypeAlias = list[jsonschema.exceptions.ValidationError]
GroupedValidationErrors: TypeAlias = dict[str, ValidationErrorList]
diff --git a/tests/__init__.py b/tests/__init__.py
index 706f6d181..617cfca80 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -22,7 +22,7 @@
from _pytest.mark import ParameterSet
MarksType: TypeAlias = (
- "pytest.MarkDecorator | Collection[pytest.MarkDecorator | pytest.Mark]" # noqa: TC008
+ "pytest.MarkDecorator | Collection[pytest.MarkDecorator | pytest.Mark]"
)
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index 23120e616..e6b75f4f2 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -30,7 +30,7 @@ def _check(arr, typ):
_check(nulled, "quantitative")
_check(["a", "b", "c"], "nominal")
- with pytest.warns(UserWarning):
+ with pytest.warns(UserWarning, match=r"infer vegalite type"):
_check([], "nominal")
diff --git a/tests/vegalite/v5/test_renderers.py b/tests/vegalite/v5/test_renderers.py
index d8b35308b..426f9114f 100644
--- a/tests/vegalite/v5/test_renderers.py
+++ b/tests/vegalite/v5/test_renderers.py
@@ -35,7 +35,7 @@ def chart():
return alt.Chart("data.csv").mark_point()
-def test_html_renderer_embed_options(chart, renderer="html"):
+def test_html_renderer_embed_options(chart):
"""Test that embed_options in renderer metadata are correctly manifest in html."""
# Short of parsing the javascript, it's difficult to parse out the
# actions. So we use string matching
@@ -45,7 +45,7 @@ def assert_has_options(chart, **opts):
for key, val in opts.items():
assert json.dumps({key: val})[1:-1] in html
- with alt.renderers.enable(renderer):
+ with alt.renderers.enable("html"):
assert_has_options(chart, mode="vega-lite")
with alt.renderers.enable(embed_options={"actions": {"export": True}}):
@@ -55,11 +55,13 @@ def assert_has_options(chart, **opts):
assert_has_options(chart, mode="vega-lite", actions=True)
-def test_mimetype_renderer_embed_options(chart, renderer="mimetype"):
+def test_mimetype_renderer_embed_options(chart):
# check that metadata is passed appropriately
- mimetype = alt.display.VEGALITE_MIME_TYPE
+ from altair.vegalite.v5.display import VEGALITE_MIME_TYPE
+
+ mimetype = VEGALITE_MIME_TYPE
spec = chart.to_dict()
- with alt.renderers.enable(renderer):
+ with alt.renderers.enable("mimetype"):
# Sanity check: no metadata specified
bundle, metadata = chart._repr_mimebundle_(None, None)
assert bundle[mimetype] == spec
@@ -71,11 +73,11 @@ def test_mimetype_renderer_embed_options(chart, renderer="mimetype"):
assert metadata == {mimetype: {"embed_options": {"actions": False}}}
-def test_json_renderer_embed_options(chart, renderer="json"):
+def test_json_renderer_embed_options(chart):
"""Test that embed_options in renderer metadata are correctly manifest in html."""
mimetype = "application/json"
spec = chart.to_dict()
- with alt.renderers.enable(renderer):
+ with alt.renderers.enable("json"):
# Sanity check: no options specified
bundle, metadata = chart._repr_mimebundle_(None, None)
assert bundle[mimetype] == spec
@@ -89,12 +91,12 @@ def test_json_renderer_embed_options(chart, renderer="json"):
@skip_requires_vl_convert
-def test_renderer_with_none_embed_options(chart, renderer="mimetype"):
+def test_renderer_with_none_embed_options(chart):
# Check that setting embed_options to None doesn't crash
from altair.utils.mimebundle import spec_to_mimebundle
spec = chart.to_dict()
- with alt.renderers.enable(renderer, embed_options=None):
+ with alt.renderers.enable("mimetype", embed_options=None):
bundle = spec_to_mimebundle(
spec=spec,
mode="vega-lite",
@@ -105,9 +107,9 @@ def test_renderer_with_none_embed_options(chart, renderer="mimetype"):
@jupyter_marks
-def test_jupyter_renderer_mimetype(chart, renderer="jupyter") -> None:
+def test_jupyter_renderer_mimetype(chart) -> None:
"""Test that we get the expected widget mimetype when the jupyter renderer is enabled."""
- with alt.renderers.enable(renderer):
+ with alt.renderers.enable("jupyter"):
assert (
"application/vnd.jupyter.widget-view+json"
in chart._repr_mimebundle_(None, None)[0]
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index 0b926ec69..60e8182a7 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -56,7 +56,7 @@
from typing import Never, Self
else:
from typing_extensions import Never, Self
- _OptionalModule: TypeAlias = "ModuleType | None" # noqa: TC008
+ _OptionalModule: TypeAlias = "ModuleType | None"
ValidationErrorList: TypeAlias = list[jsonschema.exceptions.ValidationError]
GroupedValidationErrors: TypeAlias = dict[str, ValidationErrorList]
From f1ae31e41fc3b68f951b31bc3668a111a5624d42 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 16 Jan 2025 15:07:35 +0000
Subject: [PATCH 51/53] chore: Add `needs-triage` to new bug reports (#3769)
---
.github/ISSUE_TEMPLATE/bug-report.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index b9112fb45..67e5268c3 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -1,6 +1,6 @@
name: Bug report
description: Report something that is broken
-labels: ["bug"]
+labels: ["bug", "needs-triage"]
body:
- type: markdown
attributes:
From f45dcfb551a66bbacb0c2b694ea2b7ce5a1cbdf2 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Thu, 16 Jan 2025 15:36:50 +0000
Subject: [PATCH 52/53] test: Make `skip_requires_pyarrow` compatible w/
`pytest.param` (#3772)
---
tests/__init__.py | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/tests/__init__.py b/tests/__init__.py
index 617cfca80..17a33e91e 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -5,14 +5,14 @@
import sys
from importlib.util import find_spec
from pathlib import Path
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING, overload
import pytest
from tests import examples_arguments_syntax, examples_methods_syntax
if TYPE_CHECKING:
- from collections.abc import Callable, Collection, Iterator, Mapping
+ from collections.abc import Collection, Iterator, Mapping
from re import Pattern
if sys.version_info >= (3, 11):
@@ -20,6 +20,7 @@
else:
from typing_extensions import TypeAlias
from _pytest.mark import ParameterSet
+ from _pytest.mark.structures import Markable
MarksType: TypeAlias = (
"pytest.MarkDecorator | Collection[pytest.MarkDecorator | pytest.Mark]"
@@ -96,9 +97,21 @@ def windows_has_tzdata() -> bool:
"""
+@overload
def skip_requires_pyarrow(
- fn: Callable[..., Any] | None = None, /, *, requires_tzdata: bool = False
-) -> Callable[..., Any]:
+ fn: None = ..., /, *, requires_tzdata: bool = ...
+) -> pytest.MarkDecorator: ...
+
+
+@overload
+def skip_requires_pyarrow(
+ fn: Markable, /, *, requires_tzdata: bool = ...
+) -> Markable: ...
+
+
+def skip_requires_pyarrow(
+ fn: Markable | None = None, /, *, requires_tzdata: bool = False
+) -> pytest.MarkDecorator | Markable:
"""
``pytest.mark.skipif`` decorator.
@@ -109,7 +122,7 @@ def skip_requires_pyarrow(
https://github.com/vega/altair/issues/3050
.. _pyarrow:
- https://pypi.org/project/pyarrow/
+ https://pypi.org/project/pyarrow/
"""
composed = pytest.mark.skipif(
find_spec("pyarrow") is None, reason="`pyarrow` not installed."
@@ -120,13 +133,7 @@ def skip_requires_pyarrow(
reason="Timezone database is not installed on Windows",
)(composed)
- def wrap(test_fn: Callable[..., Any], /) -> Callable[..., Any]:
- return composed(test_fn)
-
- if fn is None:
- return wrap
- else:
- return wrap(fn)
+ return composed if fn is None else composed(fn)
def id_func_str_only(val) -> str:
From 21f5849b32923674d23a377d8671b562644b56b2 Mon Sep 17 00:00:00 2001
From: Dan Redding <125183946+dangotbanned@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:59:51 +0000
Subject: [PATCH 53/53] build: Migrate from `hatch` to `uv` (#3723)
---
.github/workflows/build.yml | 2 +-
.github/workflows/docbuild.yml | 14 +-
.github/workflows/lint.yml | 13 +-
CONTRIBUTING.md | 94 +-
NOTES_FOR_MAINTAINERS.md | 6 +-
README.md | 11 +-
RELEASING.md | 29 +-
doc/getting_started/installation.rst | 22 -
doc/sync_website.sh | 27 -
pyproject.toml | 136 +-
tools/__init__.py | 2 +
tools/fs.py | 139 ++
tools/sync_website.py | 102 +
uv.lock | 3297 ++++++++++++++++++++++++++
14 files changed, 3681 insertions(+), 213 deletions(-)
delete mode 100644 doc/sync_website.sh
create mode 100644 tools/fs.py
create mode 100644 tools/sync_website.py
create mode 100644 uv.lock
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7010faa2c..d92f5fc44 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -69,7 +69,7 @@ jobs:
fi
- name: Test with pytest
run: |
- uv run pytest --pyargs --numprocesses=logical --doctest-modules tests
+ uv run pytest --pyargs --numprocesses=logical --doctest-modules --doctest-ignore-import-errors tests
- name: Validate Vega-Lite schema
run: |
# We install all 'format' dependencies of jsonschema as check-jsonschema
diff --git a/.github/workflows/docbuild.yml b/.github/workflows/docbuild.yml
index 1bd2aa0f6..c3978de5e 100644
--- a/.github/workflows/docbuild.yml
+++ b/.github/workflows/docbuild.yml
@@ -2,9 +2,6 @@ name: docbuild
on: [push, pull_request]
-env:
- UV_SYSTEM_PYTHON: 1
-
jobs:
build:
runs-on: ubuntu-latest
@@ -16,13 +13,18 @@ jobs:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@v5
+ with:
+ enable-cache: true
+ cache-dependency-glob: |
+ **/uv.lock
+ **/pyproject.toml
- name: Install dependencies
- run: uv pip install -e ".[dev, all, doc]"
- - name: Run doc:build-html
+ run: uv sync --all-extras
+ - name: Build docs
run: |
mkdir -p doc/_images
uv run sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html
- - name: Run doc:doctest
+ - name: Run doctests
run: |
uv run sphinx-build -b doctest -d doc/_build/doctrees doc doc/_build/doctest
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 815cad4d0..585dc0f5f 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -14,15 +14,20 @@ jobs:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v5
+ with:
+ enable-cache: true
+ cache-dependency-glob: |
+ **/uv.lock
+ **/pyproject.toml
# Installing all dependencies and not just the linters as mypy needs them for type checking
- name: Install dependencies
- run: uv pip install -e ".[dev, all]" --system
- - name: Lint with ruff
+ run: uv sync --all-extras
+ - name: ruff check (lint)
run: |
uv run ruff check
- - name: Check formatting with ruff
+ - name: ruff format
run: |
uv run ruff format --check --diff
- - name: Lint with mypy
+ - name: mypy (type check)
run: |
uv run mypy altair tests
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 541339a6b..97aba4227 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -28,18 +28,54 @@ git clone https://github.com/YOUR-USERNAME/altair.git
To keep your fork up to date with changes in this repo,
you can [use the fetch upstream button on GitHub](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork).
-Now you can install the latest version of Altair locally using `pip`.
-The `-e` flag indicates that your local changes will be reflected
-every time you open a new Python interpreter
-(instead of having to reinstall the package each time).
+
+[Install `uv`](https://docs.astral.sh/uv/getting-started/installation/), or update to the latest version:
+
+```cmd
+uv self update
+```
+Install Python:
+
+```cmd
+uv python install 3.12
+```
+
+Initialize a new virtual environment:
```cmd
-cd altair/
-python -m pip install -e ".[all, dev]"
+cd altair/
+uv venv -p 3.12
```
-'[all, dev]' indicates that pip should also install the optional and development requirements
-which you can find in `pyproject.toml` (`[project.optional-dependencies]/all` and `[project.optional-dependencies]/dev`)
+Activate your environment:
+
+macOS/Linux
+
+
+```bash
+source .venv/bin/activate
+```
+
+
+
+
+Windows
+
+
+```cmd
+.venv\Scripts\activate
+```
+
+
+
+
+Install the project with all development dependencies:
+```cmd
+uv sync --all-extras
+```
+
+> [!TIP]
+> If you're new to `uv`, check out their [Getting started](https://docs.astral.sh/uv/getting-started/) guide for help
### Creating a Branch
@@ -59,7 +95,7 @@ make sure to run the following to see if there are any changes
to the automatically generated files:
```bash
-hatch run generate-schema-wrapper
+uv run task generate-schema-wrapper
```
For information on how to update the Vega-Lite version that Altair uses,
@@ -72,7 +108,7 @@ it is recommended that you run the Altair test suite,
which includes a number of tests to validate the correctness of your code:
```bash
-hatch test
+uv run task test
```
@@ -83,14 +119,15 @@ Study the output of any failed tests and try to fix the issues
before proceeding to the next section.
#### Failures on specific python version(s)
-By default, `hatch test` will run the test suite against the currently active python version.
+
+By default, `uv run task test` will run the test suite against the currently active python version.
Two useful variants for debugging failures that only appear *after* you've submitted your PR:
```bash
# Test against all python version(s) in the matrix
-hatch test --all
-# Test against a specific python version
-hatch test --python 3.8
+uv run task test-all
+# Test against our minimum required version
+uv run task test-min
```
See [hatch test](https://hatch.pypa.io/latest/cli/reference/#hatch-test) docs for other options.
@@ -99,7 +136,7 @@ See [hatch test](https://hatch.pypa.io/latest/cli/reference/#hatch-test) docs fo
If `test_completeness_of__all__` fails, you may need to run:
```bash
-hatch run update-init-file
+uv run task update-init-file
```
However, this test usually indicates *unintentional* addition(s) to the top-level `alt.` namespace that will need resolving first.
@@ -204,27 +241,20 @@ Some additional notes:
The process to build the documentation locally consists of three steps:
-1. Clean any previously generated files to ensure a clean build.
-2. Generate the documentation in HTML format.
-3. View the generated documentation using a local Python testing server.
-
-The specific commands for each step depend on your operating system.
-Make sure you execute the following commands from the root dir of altair and have [`hatch`](https://hatch.pypa.io/) installed in your local environment.
+1. **Clean** (remove) any previously generated documentation files.
+2. **Build** the documentation in HTML format.
+3. View the documentation using a *local* Python testing **server**.
-- For MacOS and Linux, run the following commands in your terminal:
-```bash
-hatch run doc:clean-all
-hatch run doc:build-html
-hatch run doc:serve
-```
-
-- For Windows, use these commands instead:
+Steps 1 & 2 can be run as a single command, followed by step 3:
```cmd
-hatch run doc:clean-all-win
-hatch run doc:build-html-win
-hatch run doc:serve
+uv run task doc-clean-build
+uv run task doc-serve
```
+> [!TIP]
+> If these commands were not available for you, make sure you've [set up your environment](#setting-up-your-environment)
+
+
To view the documentation, open your browser and go to `http://localhost:8000`. To stop the server, use `^C` (control+c) in the terminal.
---
diff --git a/NOTES_FOR_MAINTAINERS.md b/NOTES_FOR_MAINTAINERS.md
index 50fadfdf8..4f4537811 100644
--- a/NOTES_FOR_MAINTAINERS.md
+++ b/NOTES_FOR_MAINTAINERS.md
@@ -7,10 +7,10 @@ The core Python API for Altair can be found in the following locations:
- ``altair/vegalite/v5/schema/``
All the files within these directories are created automatically by running
-the following script from the root of the repository:
+the following script:
```bash
-hatch run generate-schema-wrapper
+uv run task generate-schema-wrapper
```
This script does a couple things:
@@ -86,7 +86,7 @@ These additional methods have fairly good test coverage, so running the test
suite should identify any inconsistencies:
```bash
-hatch test
+uv run task test
```
Generally, minor version updates (e.g. Vega-Lite 2.3->2.4) have been relatively
diff --git a/README.md b/README.md
index 6134975c6..3fa703d80 100644
--- a/README.md
+++ b/README.md
@@ -108,19 +108,10 @@ you can post it on [StackOverflow](https://stackoverflow.com/questions/tagged/al
For bugs and feature requests, please open a [Github Issue](https://github.com/vega/altair/issues).
## Development
-
-[![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/pypa/hatch)
+[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![pytest](https://img.shields.io/badge/logo-pytest-blue?logo=pytest&labelColor=5c5c5c&label=%20)](https://github.com/pytest-dev/pytest)
-You can find the instructions on how to install the package for development in [the documentation](https://altair-viz.github.io/getting_started/installation.html).
-
-To run the tests and linters, use
-
-```bash
-hatch test
-```
-
For information on how to contribute your developments back to the Vega-Altair repository, see
[`CONTRIBUTING.md`](https://github.com/vega/altair/blob/main/CONTRIBUTING.md)
diff --git a/RELEASING.md b/RELEASING.md
index 264081ebd..ef6717f6f 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -1,10 +1,10 @@
1. Check all [Vega project](https://github.com/orgs/vega/repositories?type=source) versions are up-to-date. See [NOTES_FOR_MAINTAINERS.md](NOTES_FOR_MAINTAINERS.md)
-2. Make sure to have an environment set up with `hatch` installed. See [CONTRIBUTING.md](CONTRIBUTING.md).
- Remove any existing environments managed by `hatch` so that it will create new ones
- with the latest dependencies when executing the commands further below:
+
+2. Make sure to have [set up your environment](CONTRIBUTING.md#setting-up-your-environment).
+ Update your environment with the latest dependencies:
- hatch env prune
+ uv sync --all-extras
3. Make certain your branch is in sync with head, and that you have no uncommitted modifications. If you work on a fork, replace `origin` with `upstream`:
@@ -12,11 +12,7 @@
git pull origin main
git status # Should show "nothing to commit, working tree clean"
-4. Do a clean doc build:
-
- hatch run doc:clean-all
- hatch run doc:build-html
- hatch run doc:serve
+4. Do a [clean doc build](CONTRIBUTING.md#building-the-documentation-locally):
Navigate to http://localhost:8000 and ensure it looks OK (particularly
do a visual scan of the gallery thumbnails).
@@ -38,20 +34,19 @@
8. Merge release branch into main, make sure that all required checks pass
-9. On main, build source & wheel distributions. If you work on a fork, replace `origin` with `upstream`:
+9. Switch to main, If you work on a fork, replace `origin` with `upstream`:
git switch main
git pull origin main
- hatch clean # clean old builds & distributions
- hatch build # create a source distribution and universal wheel
-
-10. publish to PyPI (Requires correct PyPI owner permissions):
+
+10. Build a source distribution and universal wheel,
+ publish to PyPI (Requires correct PyPI owner permissions and [UV_PUBLISH_TOKEN](https://docs.astral.sh/uv/configuration/environment/#uv_publish_token)):
- hatch publish
+ uv run task publish
-11. build and publish docs (Requires write-access to altair-viz/altair-viz.github.io):
+11. Build and publish docs (Requires write-access to [altair-viz/altair-viz.github.io](https://github.com/altair-viz/altair-viz.github.io)):
- hatch run doc:publish-clean-build
+ uv run task doc-publish-clean-build
12. On main, tag the release. If you work on a fork, replace `origin` with `upstream`:
diff --git a/doc/getting_started/installation.rst b/doc/getting_started/installation.rst
index 3d9b30e31..87bb9dd27 100644
--- a/doc/getting_started/installation.rst
+++ b/doc/getting_started/installation.rst
@@ -33,27 +33,6 @@ Altair can also be installed with just the dependencies necessary for saving cha
Development Installation
========================
-The `Altair source repository`_ is available on GitHub. Once you have cloned the
-repository and installed all the above dependencies, run the following command
-from the root of the repository to install the main version of Altair:
-
-.. code-block:: bash
-
- pip install -e .
-
-To install optional and development dependencies as well, run
-
-.. code-block:: bash
-
- pip install -e ".[all, dev]"
-
-If you do not wish to clone the source repository, you can install the
-development version directly from GitHub using:
-
-.. code-block:: bash
-
- pip install -e git+https://github.com/vega/altair.git
-
Please see `CONTRIBUTING.md `_
for details on how to contribute to the Altair project.
@@ -62,4 +41,3 @@ for details on how to contribute to the Altair project.
.. _vega_datasets: https://github.com/altair-viz/vega_datasets
.. _JupyterLab: http://jupyterlab.readthedocs.io/
.. _Jupyter Notebook: https://jupyter-notebook.readthedocs.io/
-.. _Altair source repository: http://github.com/vega/altair
diff --git a/doc/sync_website.sh b/doc/sync_website.sh
deleted file mode 100644
index fcb611ef5..000000000
--- a/doc/sync_website.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-
-# get git hash for commit message
-GITHASH=$(git rev-parse HEAD)
-MSG="doc build for commit $GITHASH"
-cd _build
-
-# clone the repo if needed
-if test -d altair-viz.github.io;
-then echo "using existing cloned altair directory";
-else git clone https://github.com/altair-viz/altair-viz.github.io.git;
-fi
-
-# sync the website
-cd altair-viz.github.io
-git pull
-
-# remove all tracked files
-git ls-files -z | xargs -0 rm -f
-
-# sync files from html build
-rsync -r ../html/ ./
-
-# add commit, and push to github
-git add . --all
-git commit -m "$MSG"
-git push origin master
diff --git a/pyproject.toml b/pyproject.toml
index db119806e..ada8245c5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -84,7 +84,8 @@ dev = [
"types-setuptools",
"geopandas",
"polars>=0.20.3",
- "tomli; python_version<\"3.11\""
+ "taskipy>=1.14.1",
+ "tomli>=2.2.1",
]
doc = [
"sphinx",
@@ -106,101 +107,20 @@ vega-datasets = "v2.11.0" # https://github.com/vega/vega-datasets
vega-embed = "6" # https://github.com/vega/vega-embed
vega-lite = "v5.21.0" # https://github.com/vega/vega-lite
-[tool.hatch.version]
-path = "altair/__init__.py"
+[tool.hatch]
+build = { include = ["/altair"], artifacts = ["altair/jupyter/js/index.js"] }
+metadata = { allow-direct-references = true }
+version = { path = "altair/__init__.py" }
-[tool.hatch.metadata]
-allow-direct-references = true
-
-[tool.hatch.build]
-include = ["/altair"]
-artifacts = ["altair/jupyter/js/index.js"]
-
-[tool.hatch.envs.default]
-features = ["all", "dev"]
+[tool.hatch.envs]
# https://hatch.pypa.io/latest/how-to/environment/select-installer/#enabling-uv
-installer = "uv"
-
-[tool.hatch.envs.default.scripts]
-generate-schema-wrapper = [
- "mypy tools",
- "python tools/generate_schema_wrapper.py",
- "test"
-]
-test = [
- "ruff check .",
- "ruff format --diff --check .",
- "mypy altair tests",
- "python -m pytest --pyargs --numprocesses=logical --doctest-modules tests altair tools",
-]
-test-coverage = "python -m pytest --pyargs --doctest-modules --cov=altair --cov-report term altair"
-test-coverage-html = "python -m pytest --pyargs --doctest-modules --cov=altair --cov-report html altair"
-update-init-file = [
- "python tools/update_init_file.py",
- "ruff check .",
- "ruff format .",
-]
-test-fast = [
- "ruff check .", "ruff format .",
- "pytest -p no:randomly -n logical --numprocesses=logical --doctest-modules tests altair tools -m \"not slow\" {args}"
-]
-test-slow = [
- "ruff check .", "ruff format .",
- "pytest -p no:randomly -n logical --numprocesses=logical --doctest-modules tests altair tools -m \"slow\" {args}"
-]
+default = { features = ["all", "dev"], installer = "uv" }
+doc = { features = ["all", "dev", "doc"] }
[tool.hatch.envs.hatch-test]
# https://hatch.pypa.io/latest/tutorials/testing/overview/
features = ["all", "dev", "doc"]
-# https://pytest-xdist.readthedocs.io/en/latest/distribution.html#running-tests-across-multiple-cpus
-default-args = ["--numprocesses=logical","--doctest-modules", "tests", "altair", "tools"]
-parallel = true
-[[tool.hatch.envs.hatch-test.matrix]]
-python = ["3.9", "3.10", "3.11", "3.12", "3.13"]
-[tool.hatch.envs.hatch-test.scripts]
-run = [
- "ruff check .",
- "ruff format --diff --check .",
- "mypy altair tests",
- "pytest{env:HATCH_TEST_ARGS:} {args}"
-]
-run-cov = "coverage run -m pytest{env:HATCH_TEST_ARGS:} {args}"
-cov-combine = "coverage combine"
-cov-report = "coverage report"
-
-[tool.hatch.envs.doc]
-features = ["all", "dev", "doc"]
-
-[tool.hatch.envs.doc.scripts]
-clean = "rm -rf doc/_build"
-clean-generated = ["rm -rf doc/user_guide/generated", "rm -rf doc/gallery"]
-clean-all = ["clean", "clean-generated", "rm -rf doc/_images"]
-clean-win = "if exist doc\\_build rd /s /q doc\\_build"
-clean-generated-win = [
- "if exist doc\\user_guide\\generated rd /s /q doc\\user_guide\\generated",
- "if exist doc\\gallery rd /s /q doc\\gallery",
-]
-clean-all-win = [
- "clean-win",
- "clean-generated-win",
- "if exist doc\\_images rd /s /q doc\\_images",
-]
-build-html = [
- "mkdir -p doc/_images",
- "sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html",
-]
-build-html-win = [
- "if not exist doc\\_images md doc\\_images",
- "sphinx-build -b html -d doc\\_build\\doctrees doc doc\\_build\\html",
-]
-doctest = "sphinx-build -b doctest -d doc/_build/doctrees doc doc/_build/doctest"
-coverage = "sphinx-build -b coverage -d doc/_build/doctrees doc doc/_build/coverage"
-serve = "(cd doc/_build/html && python -m http.server)"
-publish-clean-build = [
- "clean-all",
- "build-html",
- "(cd doc && bash sync_website.sh)",
-]
+matrix = [{ python = ["3.9", "3.10", "3.11", "3.12", "3.13"] }]
[tool.ruff]
exclude = [
@@ -334,12 +254,46 @@ docstring-code-format = true # https://docs.astral.sh/ruff/formatter/#docst
docstring-code-line-length = 88
line-ending = "lf"
+[tool.taskipy.settings]
+cwd = "."
+
+[tool.taskipy.tasks]
+lint = "ruff check"
+format = "ruff format --diff --check"
+ruff-fix = "task lint && ruff format"
+type-check = "mypy altair tests"
+
+pytest = "pytest"
+test = "task lint && task format && task type-check && task pytest"
+test-fast = "task ruff-fix && pytest -m \"not slow\""
+test-slow = "task ruff-fix && pytest -m \"slow\""
+test-min = "task lint && task format && task type-check && hatch test --python 3.9"
+test-all = "task lint && task format && task type-check && hatch test --all"
+
+generate-schema-wrapper = "mypy tools && python tools/generate_schema_wrapper.py && task test"
+update-init-file = "python tools/update_init_file.py && task ruff-fix"
+
+doc-clean = "python -c \"import tools;tools.fs.rm('doc/_build')\""
+doc-clean-generated = "python -c \"import tools;tools.fs.rm('doc/user_guide/generated', 'doc/gallery')\""
+doc-clean-images = "python -c \"import tools;tools.fs.rm('doc/_images')\""
+doc-clean-all = "task doc-clean && task doc-clean-generated && task doc-clean-images"
+doc-mkdir = "python -c \"import tools;tools.fs.mkdir('doc/_images')\""
+doc-build-html = "task doc-mkdir && sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html"
+doc-clean-build = "task doc-clean-all && task doc-build-html"
+doc-serve = "python -m http.server --bind \"127.0.0.1\" --directory doc/_build/html 8000"
+doc-publish = "python tools/sync_website.py"
+doc-publish-clean-build = "task doc-clean-build && task doc-publish"
+
+clean = "python -c \"import tools;tools.fs.rm('dist')\""
+build = "task clean && uv build"
+publish = "task build && uv publish"
+
[tool.pytest.ini_options]
# Pytest does not need to search these folders for test functions.
# They contain examples which are being executed by the
# test_examples tests.
norecursedirs = ["tests/examples_arguments_syntax", "tests/examples_methods_syntax"]
-addopts = ["--numprocesses=logical"]
+addopts = ["--numprocesses=logical", "--doctest-modules", "tests", "altair", "tools"]
# https://docs.pytest.org/en/stable/how-to/mark.html#registering-marks
markers = [
"slow: Label tests as slow (deselect with '-m \"not slow\"')"
diff --git a/tools/__init__.py b/tools/__init__.py
index 00ce52b6d..0d5c03873 100644
--- a/tools/__init__.py
+++ b/tools/__init__.py
@@ -1,4 +1,5 @@
from tools import (
+ fs,
generate_api_docs,
generate_schema_wrapper,
markup,
@@ -8,6 +9,7 @@
)
__all__ = [
+ "fs",
"generate_api_docs",
"generate_schema_wrapper",
"markup",
diff --git a/tools/fs.py b/tools/fs.py
new file mode 100644
index 000000000..cae3aef69
--- /dev/null
+++ b/tools/fs.py
@@ -0,0 +1,139 @@
+"""Cross-platform filesystem utilities."""
+
+from __future__ import annotations
+
+import datetime as dt
+import shutil
+import subprocess as sp
+from pathlib import Path
+from typing import TYPE_CHECKING, Any
+
+if TYPE_CHECKING:
+ from collections.abc import Callable
+
+
+__all__ = [
+ "REPO_ROOT",
+ "copytree",
+ "dir_exists",
+ "file_exists",
+ "mkdir",
+ "modified_time",
+ "path_repr",
+ "rm",
+ "run_check",
+ "run_stream_stdout",
+]
+
+REPO_ROOT: Path = Path(__file__).parent.parent
+
+
+def mkdir(*sources: str | Path, parents: bool = True) -> None:
+ """
+ Platform independent `bash mkdir`_, using ``--parents`` option.
+
+ .. _bash mkdir:
+ https://ss64.com/bash/mkdir.html
+ """
+ for source in sources:
+ Path(source).mkdir(parents=parents, exist_ok=True)
+
+
+def rm(*sources: str | Path, force: bool = True) -> None:
+ """
+ Platform independent `bash rm`_, using ``--recursive``, ``--force`` options.
+
+ .. _bash rm:
+ https://ss64.com/bash/rm.html
+ """
+ for source in sources:
+ fp = Path(source)
+ if fp.is_file():
+ fp.unlink(missing_ok=force)
+ else:
+ shutil.rmtree(fp, ignore_errors=force)
+
+
+def copytree(src: str | Path, dst: str | Path, *, force: bool = True):
+ """
+ Recursively copy a directory tree and return the destination directory.
+
+ Wraps `shutil.copytree`_.
+
+ .. _shutil.copytree:
+ https://docs.python.org/3/library/shutil.html#shutil.copytree
+ """
+ return shutil.copytree(src, dst, dirs_exist_ok=force)
+
+
+def file_exists(file: str | Path, /) -> bool:
+ """Fail on files created using ``Path.touch()``."""
+ fp = Path(file)
+ return bool(fp.exists() and fp.stat().st_size)
+
+
+def dir_exists(file: str | Path, /) -> bool:
+ fp = Path(file)
+ return fp.exists() and fp.is_dir()
+
+
+def modified_time(file: str | Path, /) -> dt.datetime:
+ """UTC datetime when ``file`` was last modified."""
+ return dt.datetime.fromtimestamp(Path(file).stat().st_mtime, dt.timezone.utc)
+
+
+def path_repr(fp: Path, /) -> str:
+ """Return string representation w/ ``/``, relative to root of repository."""
+ return f"{fp.relative_to(REPO_ROOT).as_posix()!r}"
+
+
+def _stdout_handler(line: bytes, /) -> None:
+ """Pass-through to ``sys.stdout``, without adding whitespace."""
+ print(line.decode(), end="")
+
+
+def run_stream_stdout(
+ args: sp._CMD,
+ *,
+ stdout_handler: Callable[[bytes], None] = _stdout_handler,
+) -> sp.CompletedProcess[Any]:
+ """
+ Mimic `subprocess.run`_, piping stdout back to the caller in real-time*.
+
+ Adapted from `stackoverflow-76626021`_.
+
+ Notes
+ -----
+ - `pytest`_ is line-by-line
+ - `sphinx-build`_ comes out in 3 bursts (over 8 minutes)
+ - All others only output a short message (usually 1 line)
+
+ .. _subprocess.run:
+ https://docs.python.org/3/library/subprocess.html#subprocess.run
+ .. _stackoverflow-76626021:
+ https://stackoverflow.com/questions/21953835/run-subprocess-and-print-output-to-logging/76626021#76626021
+ .. _pytest:
+ https://docs.pytest.org/en/stable/index.html
+ .. _sphinx-build:
+ https://www.sphinx-doc.org/en/master/man/sphinx-build.html
+ """
+ with sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) as process:
+ if process.stdout is not None:
+ for chunk in process.stdout:
+ stdout_handler(chunk)
+ else:
+ msg = "stdout is None"
+ raise NotImplementedError(msg)
+ if retcode := process.poll():
+ raise sp.CalledProcessError(retcode, process.args)
+ return sp.CompletedProcess(process.args, 0)
+
+
+def run_check(args: sp._CMD, /) -> sp.CompletedProcess[str]:
+ """
+ Run a command in a `subprocess`_, capturing and decoding output.
+
+ .. _subprocess:
+ https://docs.python.org/3/library/subprocess.html#subprocess.run
+ """
+ return sp.run(args, check=True, capture_output=True, encoding="utf-8")
diff --git a/tools/sync_website.py b/tools/sync_website.py
new file mode 100644
index 000000000..f031d6e95
--- /dev/null
+++ b/tools/sync_website.py
@@ -0,0 +1,102 @@
+from __future__ import annotations
+
+import argparse
+import os
+from typing import TYPE_CHECKING
+
+from tools import fs
+
+if TYPE_CHECKING:
+ from pathlib import Path
+ from typing import Literal
+
+DOC_REPO_ORG: Literal["altair-viz"] = "altair-viz"
+GITHUB: Literal["github"] = "github"
+WEBSITE: str = f"{DOC_REPO_ORG}.{GITHUB}.io"
+DOC_REPO_URL: str = f"https://{GITHUB}.com/{DOC_REPO_ORG}/{WEBSITE}.git"
+
+
+DOC_DIR: Path = fs.REPO_ROOT / "doc"
+DOC_BUILD_DIR: Path = DOC_DIR / "_build"
+DOC_REPO_DIR: Path = DOC_BUILD_DIR / WEBSITE
+DOC_HTML_DIR: Path = DOC_BUILD_DIR / "html"
+DOC_BUILD_INFO: Path = DOC_HTML_DIR / ".buildinfo"
+
+CMD_CLONE = "git", "clone", DOC_REPO_URL
+CMD_PULL = "git", "pull"
+CMD_HEAD_HASH = "git", "rev-parse", "HEAD"
+CMD_ADD = "git", "add", ".", "--all", "--force"
+CMD_COMMIT = "git", "commit", "-m"
+CMD_PUSH = "git", "push", "origin", "master"
+
+COMMIT_MSG_PREFIX = "doc build for commit"
+UNTRACKED = ".git"
+
+
+def clone_or_sync_repo() -> None:
+ os.chdir(DOC_BUILD_DIR)
+ if not DOC_REPO_DIR.exists():
+ print(f"Cloning repo {WEBSITE!r}\n -> {fs.path_repr(DOC_REPO_DIR)}")
+ fs.run_stream_stdout(CMD_CLONE)
+ else:
+ print(f"Using existing cloned altair directory {fs.path_repr(DOC_REPO_DIR)}")
+ os.chdir(DOC_REPO_DIR)
+ print(f"Syncing {WEBSITE!r}\n -> {fs.path_repr(DOC_REPO_DIR)} ...")
+ fs.run_stream_stdout(CMD_PULL)
+
+
+def remove_tracked_files() -> None:
+ os.chdir(DOC_REPO_DIR)
+ print(f"Removing all tracked files from {fs.path_repr(DOC_REPO_DIR)} ...")
+ for fp in DOC_REPO_DIR.iterdir():
+ if fp.name == UNTRACKED:
+ continue
+ fs.rm(fp)
+
+
+def sync_from_html_build() -> None:
+ print(f"Syncing files from {fs.path_repr(DOC_HTML_DIR)} ...")
+ copy_ret = fs.copytree(DOC_HTML_DIR, DOC_REPO_DIR)
+ print(f"Successful copy to: {fs.path_repr(copy_ret)}")
+
+
+def generate_commit_message() -> str:
+ os.chdir(DOC_REPO_DIR)
+ print("Generating commit message ...")
+ return f"{COMMIT_MSG_PREFIX} {fs.run_check(CMD_HEAD_HASH).stdout.strip()}"
+
+
+def add_commit_push_github(msg: str, /, *, dry_run: bool) -> None:
+ os.chdir(DOC_REPO_DIR)
+ print("Pushing ...")
+ cmd_commit = *CMD_COMMIT, msg
+ cmd_push = (*CMD_PUSH, "--dry-run") if dry_run else CMD_PUSH
+ commands = (CMD_ADD, cmd_commit, cmd_push)
+ for command in commands:
+ fs.run_stream_stdout(command)
+
+
+def ensure_build_html() -> None:
+ if not fs.dir_exists(DOC_HTML_DIR):
+ raise FileNotFoundError(DOC_HTML_DIR)
+ if not DOC_BUILD_INFO.exists():
+ raise FileNotFoundError(DOC_BUILD_INFO)
+ fs.mkdir(DOC_REPO_DIR)
+ time = fs.modified_time(DOC_BUILD_INFO).isoformat(" ", "seconds")
+ print(f"Docs last build time: {time!r}")
+
+
+def main(*, dry_run: bool = False) -> None:
+ ensure_build_html()
+ commit_message = generate_commit_message()
+ clone_or_sync_repo()
+ remove_tracked_files()
+ sync_from_html_build()
+ add_commit_push_github(commit_message, dry_run=dry_run)
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(prog="sync_website.py")
+ parser.add_argument("--dry-run", action="store_true")
+ args = parser.parse_args()
+ main(dry_run=args.dry_run)
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 000000000..d6a2a3a93
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,3297 @@
+version = 1
+requires-python = ">=3.9"
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+ "python_full_version < '3.10'",
+]
+
+[[package]]
+name = "accessible-pygments"
+version = "0.0.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903 },
+]
+
+[[package]]
+name = "alabaster"
+version = "0.7.16"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 },
+]
+
+[[package]]
+name = "alabaster"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 },
+]
+
+[[package]]
+name = "altair"
+version = "5.6.0.dev0"
+source = { editable = "." }
+dependencies = [
+ { name = "jinja2" },
+ { name = "jsonschema" },
+ { name = "narwhals" },
+ { name = "packaging" },
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
+]
+
+[package.optional-dependencies]
+all = [
+ { name = "altair-tiles" },
+ { name = "anywidget" },
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "pandas" },
+ { name = "pyarrow" },
+ { name = "vega-datasets" },
+ { name = "vegafusion" },
+ { name = "vl-convert-python" },
+]
+dev = [
+ { name = "duckdb" },
+ { name = "geopandas" },
+ { name = "hatch" },
+ { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, extra = ["kernel"], marker = "python_full_version < '3.10'" },
+ { name = "ipython", version = "8.31.0", source = { registry = "https://pypi.org/simple" }, extra = ["kernel"], marker = "python_full_version >= '3.10'" },
+ { name = "mistune" },
+ { name = "mypy" },
+ { name = "pandas" },
+ { name = "pandas-stubs", version = "2.2.2.240807", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "pandas-stubs", version = "2.2.3.241126", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "polars" },
+ { name = "pyarrow-stubs" },
+ { name = "pytest" },
+ { name = "pytest-cov" },
+ { name = "pytest-xdist", extra = ["psutil"] },
+ { name = "ruff" },
+ { name = "taskipy" },
+ { name = "tomli" },
+ { name = "types-jsonschema" },
+ { name = "types-setuptools" },
+]
+doc = [
+ { name = "docutils" },
+ { name = "jinja2" },
+ { name = "myst-parser", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "myst-parser", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "numpydoc" },
+ { name = "pillow" },
+ { name = "pydata-sphinx-theme" },
+ { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "scipy", version = "1.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "sphinx-copybutton" },
+ { name = "sphinx-design" },
+ { name = "sphinxext-altair" },
+]
+save = [
+ { name = "vl-convert-python" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "altair-tiles", marker = "extra == 'all'", specifier = ">=0.3.0" },
+ { name = "anywidget", marker = "extra == 'all'", specifier = ">=0.9.0" },
+ { name = "docutils", marker = "extra == 'doc'" },
+ { name = "duckdb", marker = "extra == 'dev'", specifier = ">=1.0" },
+ { name = "geopandas", marker = "extra == 'dev'" },
+ { name = "hatch", marker = "extra == 'dev'", specifier = ">=1.13.0" },
+ { name = "ipython", extras = ["kernel"], marker = "extra == 'dev'" },
+ { name = "jinja2" },
+ { name = "jinja2", marker = "extra == 'doc'" },
+ { name = "jsonschema", specifier = ">=3.0" },
+ { name = "mistune", marker = "extra == 'dev'" },
+ { name = "mypy", marker = "extra == 'dev'" },
+ { name = "myst-parser", marker = "extra == 'doc'" },
+ { name = "narwhals", specifier = ">=1.14.2" },
+ { name = "numpy", marker = "extra == 'all'" },
+ { name = "numpydoc", marker = "extra == 'doc'" },
+ { name = "packaging" },
+ { name = "pandas", marker = "extra == 'all'", specifier = ">=1.1.3" },
+ { name = "pandas", marker = "extra == 'dev'", specifier = ">=1.1.3" },
+ { name = "pandas-stubs", marker = "extra == 'dev'" },
+ { name = "pillow", marker = "extra == 'doc'" },
+ { name = "polars", marker = "extra == 'dev'", specifier = ">=0.20.3" },
+ { name = "pyarrow", marker = "extra == 'all'", specifier = ">=11" },
+ { name = "pyarrow-stubs", marker = "extra == 'dev'" },
+ { name = "pydata-sphinx-theme", marker = "extra == 'doc'", specifier = ">=0.14.1" },
+ { name = "pytest", marker = "extra == 'dev'" },
+ { name = "pytest-cov", marker = "extra == 'dev'" },
+ { name = "pytest-xdist", extras = ["psutil"], marker = "extra == 'dev'", specifier = "~=3.5" },
+ { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.4" },
+ { name = "scipy", marker = "extra == 'doc'" },
+ { name = "sphinx", marker = "extra == 'doc'" },
+ { name = "sphinx-copybutton", marker = "extra == 'doc'" },
+ { name = "sphinx-design", marker = "extra == 'doc'" },
+ { name = "sphinxext-altair", marker = "extra == 'doc'" },
+ { name = "taskipy", marker = "extra == 'dev'", specifier = ">=1.14.1" },
+ { name = "tomli", marker = "extra == 'dev'", specifier = ">=2.2.1" },
+ { name = "types-jsonschema", marker = "extra == 'dev'" },
+ { name = "types-setuptools", marker = "extra == 'dev'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.14'", specifier = ">=4.10.0" },
+ { name = "vega-datasets", marker = "extra == 'all'", specifier = ">=0.9.0" },
+ { name = "vegafusion", extras = ["embed"], marker = "extra == 'all'", specifier = ">=1.6.6" },
+ { name = "vl-convert-python", marker = "extra == 'all'", specifier = ">=1.7.0" },
+ { name = "vl-convert-python", marker = "extra == 'save'", specifier = ">=1.7.0" },
+]
+
+[[package]]
+name = "altair-tiles"
+version = "0.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "altair" },
+ { name = "mercantile" },
+ { name = "xyzservices" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/00/08/afbd3ebc1e0de4b622f19ff86cc86ec73d8c1af2900d7ccf1a1f8b7b1ce9/altair_tiles-0.3.0.tar.gz", hash = "sha256:4e0c3d8233fc6697557171bfaef449fbc7eb10e36a730be48235007f60a5e62a", size = 9196 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ab/8c/1f76ae01359215bf163600242424d11bc0b429be9a887969094b602f918e/altair_tiles-0.3.0-py3-none-any.whl", hash = "sha256:b9ddeb3b85780b0c5309e06f1dfd8470661f47e27575541121d603f825b599b4", size = 8694 },
+]
+
+[[package]]
+name = "anyio"
+version = "4.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "idna" },
+ { name = "sniffio" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
+]
+
+[[package]]
+name = "anywidget"
+version = "0.9.13"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ipywidgets" },
+ { name = "psygnal" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/87/79/647983b0cbddd797d9d79e09f89ee5912bb066af6bf456bd8acde66b1a39/anywidget-0.9.13.tar.gz", hash = "sha256:c655455bf51f82182eb23c5947d37cc41f0b1ffacaf7e2b763147a2332cb3f07", size = 9666998 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1a/5a/7b024920cca385eb9b56bc63edf0a647de208346bfac5b339b544733d53a/anywidget-0.9.13-py3-none-any.whl", hash = "sha256:43d1658f1043b8c95cd350b2f5deccb123fd37810a36f656d6163aefe8163705", size = 213685 },
+]
+
+[[package]]
+name = "appnope"
+version = "0.1.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
+]
+
+[[package]]
+name = "arro3-core"
+version = "0.4.5"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/14/28/05c9c72b8fff7e26c6422ffb8c59173bbe8f988b41c7b8c14d7f207dc0bb/arro3_core-0.4.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4ef5bb563689ac1e274c3cd9e15da379093906b0d01c442561f922935091bed7", size = 2383900 },
+ { url = "https://files.pythonhosted.org/packages/ba/a9/43d53aba2a31966ec001573ab1fbaf1cb367e1e27b90e5ca8dad2d1d340e/arro3_core-0.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d6443c451e83f5761792cb4a3b3a0d106b83270e2af0c660382e4027f8d7e0b", size = 2144431 },
+ { url = "https://files.pythonhosted.org/packages/35/0b/5a45651efd37ae2acd1ed82190089b679b2931bdbf316a2810044e96e1f3/arro3_core-0.4.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f61b4526313006935eabe01ad90f640984a77af519704f51ef93bbd3235d1bdb", size = 2667337 },
+ { url = "https://files.pythonhosted.org/packages/2e/ef/a4c110f57a9b9a734461b04985a1af37c9722534a6aee9fa57dfbe183c98/arro3_core-0.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8255943f86750022e8810c438b9c9b50a50ccefdff56a7bcf4a334586ac320e", size = 2514949 },
+ { url = "https://files.pythonhosted.org/packages/17/48/2b998890d9850a7edc33bab3cc81f51e98ad5cfbfa95357f6264067f2f4c/arro3_core-0.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63e5bfd37ef54ba39834b04c60ed019831378bf813777faac0b2ce2ece19b722", size = 3513869 },
+ { url = "https://files.pythonhosted.org/packages/aa/c9/42e090290c2735b4375d14d846d40fc702b9cfe4eb31d47c6a8eeb3d3b8b/arro3_core-0.4.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:095223c0dae98cfdf79c185c44c9ead1487ee6f782f8131deea2b27aec1f1e3d", size = 2487277 },
+ { url = "https://files.pythonhosted.org/packages/d7/1b/bea817a6380d74a6f3147163ff2ffed2e874c8bdd35894e83928b69f7e1a/arro3_core-0.4.5-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:19fb3264964cac3d0a9e1149d8a3bdec48209e1a5259f28eadd29e10268f5854", size = 2343661 },
+ { url = "https://files.pythonhosted.org/packages/5d/f0/48a7e22465a18eab0218af87de35db661c1d608c9c0afe12b7f9be2a287f/arro3_core-0.4.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a361fa08d309e94851a14a9acda7fff9b191533e0eaa6fb041463454fe53b185", size = 2687322 },
+ { url = "https://files.pythonhosted.org/packages/bd/2b/71a9b2b9f328c63e740c9cddbf5c25eaf2be6f347e3ecc333802c5918c9b/arro3_core-0.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cea943a3886b06bf1034d6ed539727aa93bc49748905320a8bd4f54547104eaa", size = 2485484 },
+ { url = "https://files.pythonhosted.org/packages/69/84/d37b38034a76e5f56ec58f660d139a8d472e3077fafa6ee8db890461db67/arro3_core-0.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:107bfa3a4f34e1655a8a62ff1b57ebedcbb8941bab7dcad56f3d4dc837a2f9fe", size = 2928761 },
+ { url = "https://files.pythonhosted.org/packages/a3/92/266096673243de9dafc23bc8677407c53e29728104439440c0ff5c264116/arro3_core-0.4.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:acda846128c830e996d6349aa2594130705a235c160df52e373dbb721c8ca8e4", size = 2771855 },
+ { url = "https://files.pythonhosted.org/packages/aa/37/c4592c1312d137000f0e0e398357bd8c513616b3060fe9eb15222dea0346/arro3_core-0.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9721f38813ee0496262c8dcd1432f137c1069f41057bd71b406b50459dc188d", size = 2662354 },
+ { url = "https://files.pythonhosted.org/packages/49/75/fb32538e4396baf9fcaabc1de8666fc7494089ca572e1c5119d36097693a/arro3_core-0.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:60618424cb75cde43490c8a48cf5215a7aa0c85c6524bf071e4e17712d7393c6", size = 2355223 },
+ { url = "https://files.pythonhosted.org/packages/9c/b4/10821b5c995c30081a79d92de8bb8f65ce8b3fc873d5a0e7984332ce4bf2/arro3_core-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:1fb628fcb84030f1748f268018b15f0658d308ec9e52ea60811dd7445f14afd3", size = 2384112 },
+ { url = "https://files.pythonhosted.org/packages/84/19/beaae377d0767456c462f33f95f8e9ba989ef8749a4e6a1da858271ec88b/arro3_core-0.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1226b5dd5e2912c52d8cb6ec2f629126b6937419ad25e5b298c1901843777246", size = 2144486 },
+ { url = "https://files.pythonhosted.org/packages/6b/a9/1a80f6bc2f42612f919f3b138366d9f8ae29459347c376852e3fa564e982/arro3_core-0.4.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3507a6a33bc69f07015c2aa397fedc736121e4c190aab3a967659af42aa0ab4", size = 2667446 },
+ { url = "https://files.pythonhosted.org/packages/52/8f/d600ad486555bdfde9860955acf702acdf80ea406e2cc22be982e2114246/arro3_core-0.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2542b68d63ddfb919cf48cc31a73bbfc49aefe942c1bc696010af7117b8becbe", size = 2514878 },
+ { url = "https://files.pythonhosted.org/packages/22/4c/de47cc05e7ef011588208d5c95bb0d020b6ea9656e29a80537b89728f213/arro3_core-0.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30c59b680d1be504011706fac95983038ea90320e3c0a5df4a8785c8bd734e78", size = 3512989 },
+ { url = "https://files.pythonhosted.org/packages/81/81/93a12524d53530dab18be2e65414d554938a97588ccdb1c53c2b7c1a1c52/arro3_core-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49f7685975ce0a4a10498433882a6bd31811d62304b15644b3738a4b56a32c67", size = 2487279 },
+ { url = "https://files.pythonhosted.org/packages/9e/12/d2803be7e4c5f3ed787371dcdd0f9b1cbee5a301b10b5f54d953450de481/arro3_core-0.4.5-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:382319524b6986e8039c9b4eb04b9613cad962f5d3935e7b966a184590f40b4b", size = 2343701 },
+ { url = "https://files.pythonhosted.org/packages/03/85/fb00f1c3271d29a44f0dd53cc45f20eafad5cff132467513dd1d817a3a8b/arro3_core-0.4.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:83a7b420833487b592fa55caf114ef3e68ee2c0684b3739c1f0390c4e268379e", size = 2687523 },
+ { url = "https://files.pythonhosted.org/packages/77/5d/ea482ea48c437285515e278aab893934678cfb5b9e16798309836e372c56/arro3_core-0.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c12e1996885b79be9a5b5a26d195c50f335bd0057cf9cec4bc4e88e96d221548", size = 2485166 },
+ { url = "https://files.pythonhosted.org/packages/22/36/d923ee86950245905297477b1dbedfc3026b742a1bb63c5a6a374b6a7907/arro3_core-0.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b552f008a91da49068ada01d38c789f511c81652294909392fbe4dce3a4b5a36", size = 2928951 },
+ { url = "https://files.pythonhosted.org/packages/09/0a/0202c304b11978c93b17c3e08dd422b61319645cd1d64e232362ca3a3657/arro3_core-0.4.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:284e7f70e38c6d6c61e53dd4c970721c6e2900c0985380796a76bfab5a2985ce", size = 2772054 },
+ { url = "https://files.pythonhosted.org/packages/30/b4/2e33506d60a2ff2116cd78a3db7d8cef1d522ac2b9ac4468d032a909d042/arro3_core-0.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a34f4f9dc326b5d38bddd1009e5c69277ae315a28bdd2127aa3064ce9d56ca72", size = 2662343 },
+ { url = "https://files.pythonhosted.org/packages/aa/e6/3969f54c8d7809cedc42e88e8e92c16775d8689c25f2a42f2dd8501252fe/arro3_core-0.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:d1823c2f0e623714519fcd3768a6fa59c769e6044fc66fc6a34a091dc701b84b", size = 2355366 },
+ { url = "https://files.pythonhosted.org/packages/6d/de/4d70416eefb82cf1ee30e8e76814877664229293c9621e454e7adbc2af78/arro3_core-0.4.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:50495e2b643d390ac967a533ad181a497be7e3bfa91414cee12d4bb345c7e19f", size = 2369336 },
+ { url = "https://files.pythonhosted.org/packages/60/66/2b8b5f74859fd5acb0e6df466ceb3fd7b01fdf361f6603fcceebcfcfc54b/arro3_core-0.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:550dd93c44f2462519c85e30bf88ab71dcada4c4ddf0cbef72cc016200479ea0", size = 2132754 },
+ { url = "https://files.pythonhosted.org/packages/dc/59/b4845d5984ff126b146caf3b9fbe603e39e96703d48a19f21424041c35c8/arro3_core-0.4.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d1f13ad10440066cd7d951c6796d2e30bca558dcedd9f70622a5f4540b70d7f", size = 2654942 },
+ { url = "https://files.pythonhosted.org/packages/65/41/c890766a4a25928c12a1e45996aa70a5c79eecd2ab71c5e6ad8f317702a7/arro3_core-0.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3645ac0bea6d6e146998153b1bbc17cb7b94708ef51097d318d9fa23bb895098", size = 2508820 },
+ { url = "https://files.pythonhosted.org/packages/15/af/5753cfa8f1b2bd9bec9e6f4cc597f39f9ab4aa59bd78067187849a5c41bb/arro3_core-0.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:113f658be221f5b1875905988fe73f265cf5ac2d0d551edaf8a377233b691c4f", size = 3546579 },
+ { url = "https://files.pythonhosted.org/packages/dd/68/0f1b5a05f29d5aeef7c20d646d8598eaba08d19da9b195e0effe85ec5183/arro3_core-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7cbc6b7577e4c2bcca980db23e0be986d6889e3ef322c85f35c4cd8af210d2c", size = 2485782 },
+ { url = "https://files.pythonhosted.org/packages/3c/a6/fa62a6af2e18232498e72f594d774855c3679c49f12954958f8531bcf30d/arro3_core-0.4.5-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d8e61a591f2f63c610fda80a9e10e1541674a3e582daaa3cedac351d10033af1", size = 2338831 },
+ { url = "https://files.pythonhosted.org/packages/44/c9/99ce2eb3840ac02d9070206f37c4e5fd4ffb161dc5808ff4dd35b62e9e97/arro3_core-0.4.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3b47354ff584e9b129ad9c9f73552e2d15144081d6c05cd8244be59da1afda9", size = 2679555 },
+ { url = "https://files.pythonhosted.org/packages/0c/fa/5cf21ac70a445c01869d64b8204fc84d61bcfebcf51851f2aa7d8bf5253c/arro3_core-0.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b69447fd9725c8c9b40d29a3149b44736e5e5993a048ee5980509713ede0cdb7", size = 2478985 },
+ { url = "https://files.pythonhosted.org/packages/89/78/58e6cbc9acade1e5d7d019a10b8ce438125a45ada4cc55df7fab7f18e79b/arro3_core-0.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ef90c5cdf31a68eb98da024700096fe77a47fe4a1de24312cd8cf3472868e529", size = 2916793 },
+ { url = "https://files.pythonhosted.org/packages/57/0f/1af0878d6ed28cc7251b655badeab8a3bb12d3e1ada7b0c044b3addad873/arro3_core-0.4.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e04504728f880c775e58abda44914e04e94d1bc8536da5ff3d2ca2ba77bef7bc", size = 2764614 },
+ { url = "https://files.pythonhosted.org/packages/82/11/518aba36c488e32b94b231118530a4e8e328555944664c85a5977b55f16d/arro3_core-0.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71278f35bee941324581a19b3de6d444e45f17358692a7920932ff7a9aeb390b", size = 2659801 },
+ { url = "https://files.pythonhosted.org/packages/c1/dd/ae9ad933a10928431f728112ec9e4267fce7db61f87106a1bf938f24b666/arro3_core-0.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:6cd0552dacaba312c87f6062e6e6f5d707ca29eeab82f3d4d957b341d536ab87", size = 2356558 },
+ { url = "https://files.pythonhosted.org/packages/d8/e2/6497744aeb2f0360592bf753eef3b3c9ae10b48b598279d3ef496924373c/arro3_core-0.4.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:db802a712a68a4bfc6ab167962ccf8fc2170569f6232993545958562bd48937f", size = 2368914 },
+ { url = "https://files.pythonhosted.org/packages/d0/2d/546030085123e80e849575a222b307e5a45608453a54368bfafe644d6492/arro3_core-0.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5465c828b3e0093e68cc96fe845a75263dd4b89e9864086614147bf778112c87", size = 2132271 },
+ { url = "https://files.pythonhosted.org/packages/9a/58/3760815ee9b1a769f22bba4705b5a84a0cb020415201e97c97d4142ac375/arro3_core-0.4.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a64014998c7bced9ee84e5b33c47096670f2a5d4250c9beb3aebbe70f64071", size = 2654427 },
+ { url = "https://files.pythonhosted.org/packages/77/1b/20a25dbb5debf2a358130cacab0f66815384db6ed0fe2e761a59ee48d2bf/arro3_core-0.4.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8acb6cce103dfb56cdf69ba6a6471ba4beea062b2df7a0c061a6e04414ab42f6", size = 2508290 },
+ { url = "https://files.pythonhosted.org/packages/2a/e7/877c88d1d797ab07a7293082214c52883927625594dce23094634aa72e87/arro3_core-0.4.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd82248bbd7971e73c5acdd42e3efbfee141413086c0ec6d9f527818fd17300c", size = 3554592 },
+ { url = "https://files.pythonhosted.org/packages/6c/9d/698dd7c5a56197b9458f390840d8596dea65cb62bcbffdac8e8a40512398/arro3_core-0.4.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1d703238cd10ee52314b71620897a6830769128f8f665179778e773e2a7e18", size = 2485344 },
+ { url = "https://files.pythonhosted.org/packages/11/96/60758cc7b7dbc9f52a55d81f973c6d3d6666038f993c37e06c8ae1ebb078/arro3_core-0.4.5-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:790bccb515dcd015d0f04128423f312ab6adaf226573f07bcd768c8af46f5814", size = 2338545 },
+ { url = "https://files.pythonhosted.org/packages/c8/57/62b8443d8d7fe4dd8c4f5a90f2fad1b844ef7822966e9d6e5e0a5369a0f5/arro3_core-0.4.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8639e08e6f289976420c728572b97c60d339e4577568d4b148d962bd16f14e19", size = 2679301 },
+ { url = "https://files.pythonhosted.org/packages/ef/85/def91d17cc77d8f5e37bd1b90be54aa74403f9f1eb0b9a840f367a792a7e/arro3_core-0.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e79129ed90b32159b627c25040222f6ab987aee347b1b942d4743d1bb6d27f1a", size = 2478468 },
+ { url = "https://files.pythonhosted.org/packages/ea/36/e58dce0cd997758af9188f7085614ea8852ee5f0c13960579a658a5a39bc/arro3_core-0.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:53c7568699d185f3f75c39c4e476b5c871c461e4956769e627acdacdb1199951", size = 2916412 },
+ { url = "https://files.pythonhosted.org/packages/c4/a6/9719dee21ec18a5556d5faa7bd15fac4249fe5b270bfc974afbe8e3782cc/arro3_core-0.4.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:aa057de5d3f5e3624f1c4d4be924f42def0f96fb67673ff4cfb1bddc57ce5824", size = 2764217 },
+ { url = "https://files.pythonhosted.org/packages/b0/e6/be087204b946059e8ae1276f8a557112cb8d47a5f4255f8fdf87b4ecca32/arro3_core-0.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8260cd4bffded2245718e011c595b1236e682863e7f8adcc0b3029272da34fe", size = 2659439 },
+ { url = "https://files.pythonhosted.org/packages/8b/ec/eedb545901b067a0de06dc4fe2d1d21ce439fed1e7f0aca2d3ca87f5459c/arro3_core-0.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:fa90beff5023f02836a9943702cf4e258b112ae05edac6c7f6fffad1fa1ea3ed", size = 2356197 },
+ { url = "https://files.pythonhosted.org/packages/0d/ee/6532a192642a02c18277f386f5139beab1d3d4e46db007fbf19b01d49321/arro3_core-0.4.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:4585e389a51e337647688f085869fabbab6c2e4cadb57742eb8e5c3c244b03f7", size = 2386520 },
+ { url = "https://files.pythonhosted.org/packages/cd/20/20813a8cd508d07a163faed7a0239c65b0a2aa221cadc33b436200c790e0/arro3_core-0.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd84256a364afb1e4a64abfb2a8cc54b4aecd249b740ce4bf2a6b832bfeb3e20", size = 2147145 },
+ { url = "https://files.pythonhosted.org/packages/f1/bd/4b7529e92271d57dffc11f3d111afe946fe9e82b17ae9a7cac9e30bffd28/arro3_core-0.4.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:af722467a6c767cfa11f5db61f9df4989b49ce79a240c66133c9ab9983e3b933", size = 2668728 },
+ { url = "https://files.pythonhosted.org/packages/4d/b9/927726fa5803421c362aab40eb56f7d68874c3bce451f21d2241258a25e4/arro3_core-0.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2033e99c06c53028ce73deb5eb8a0ff047a7ae1eb479f4a598e0d35b548034a", size = 2516220 },
+ { url = "https://files.pythonhosted.org/packages/31/b1/77e21f2c16b747f8c90edfc354d502acf2530719a1ecb0d7d59c471ff420/arro3_core-0.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:383b353e706c2b21b7cb39a3e2a08cf5d372d7e461ebf601805e643079d166c2", size = 3515682 },
+ { url = "https://files.pythonhosted.org/packages/f0/f3/0165be00ccc9b2ab27bfe7312738b7cb283aaaab8e761509e43f01be142d/arro3_core-0.4.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c75b8b0601e3380356b61c5619e4c67a9fd727a53988a9747e3fb9266261e916", size = 2489018 },
+ { url = "https://files.pythonhosted.org/packages/0e/7c/dc97d8e48332f45c06e422c4ad07b18d8188ccd9d4f3280e3b4d420b3ac8/arro3_core-0.4.5-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:d1aef8def24857e176877d479e90a4c184b8a5a5619afc56accc7be32bdb252b", size = 2345741 },
+ { url = "https://files.pythonhosted.org/packages/99/34/623b3b4fd5d53cced0ee0dae7e4117b4bd3f3c15a14f55ec8a2807a39f78/arro3_core-0.4.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a2a8d4a941c64045245e1953476517c0831f7a8c404913eafcd6f11fbaf2c6c", size = 2688565 },
+ { url = "https://files.pythonhosted.org/packages/5f/0a/e460cfc46425e46d0da4566eb9e5a997f0d2871befccaf4ffbb2d1388398/arro3_core-0.4.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2d5837b376fe448a837c33b411e63546ed89f2e07c578917e53591bba6ff9f55", size = 2486925 },
+ { url = "https://files.pythonhosted.org/packages/41/47/5403b6a1b572a5ecae18a14065f585da97cc229beb0501e32648758907a4/arro3_core-0.4.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7999be8b4eb57ba1b7c9b573e60eb7230e6abd269308fef4fec117d84221a7b4", size = 2930843 },
+ { url = "https://files.pythonhosted.org/packages/81/03/444644c52567395458f12f6f9681601b83a04b4900e0a10100e59388dc6e/arro3_core-0.4.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:19b930c975e51181ca5b2129f540f54b196cdb77894670921cfe9a4ad1651788", size = 2773047 },
+ { url = "https://files.pythonhosted.org/packages/46/9a/e2cb1b5434d24c75854a113509ccc312849cc46a359f7ab214d93a7be7e7/arro3_core-0.4.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a5531b1c82ac5ed5758c30f331da186d0f2e046bc76d5b07d437ae8b023258db", size = 2664059 },
+ { url = "https://files.pythonhosted.org/packages/c3/ef/b9dad22a08e655334b8c55dda672641b0efc16ca589fc8fed4b5f308c01d/arro3_core-0.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:d9aa31c47af3eb6f632ec1d8605608703d03d29cfcfc8d6e9818c77c1f2d9843", size = 2356610 },
+ { url = "https://files.pythonhosted.org/packages/31/0f/3a5456bebf4964910628331afde57bef8f7c3b87ae3636567c597d86ed22/arro3_core-0.4.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b60cc70b6bb31976dc3ae3ce8c21ffab3f4a85ab73b5ce1f65424cf0dce7a7e", size = 2382370 },
+ { url = "https://files.pythonhosted.org/packages/50/b2/d1b86f3d1fd253db05a62d5dd874f8c975f88f18c5235c8caabccc67a1b8/arro3_core-0.4.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9248a0cfad662270c03272b7ddd96c9b62fbf7d4b00287a6fdf222714418b2cb", size = 2144098 },
+ { url = "https://files.pythonhosted.org/packages/bf/15/399abd3243569835143e0437dc1587da7e2668fdf15e402b86272b74cb22/arro3_core-0.4.5-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d718d968b2ad504ebcdffe36ff7078ea62fe9cc7cee1d175df0582668a95902e", size = 2665983 },
+ { url = "https://files.pythonhosted.org/packages/ac/b3/0b7f9d83ecc3ceb934ebf548d0373299f80fd7930ea1fbca1a3e614ad395/arro3_core-0.4.5-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33faff8b19ebe8839e2e7dc2590c642c3023fe1bc70ba78ce18c5e345b523b89", size = 2513984 },
+ { url = "https://files.pythonhosted.org/packages/7f/cc/135b5ba86a0110cc9cee2f572814f9b4d4faeaf0f5577c1b8268b6e65772/arro3_core-0.4.5-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8176ee4269c12a431786d21125979c326af1f9efc59b23400b4b28dacf4400af", size = 3509591 },
+ { url = "https://files.pythonhosted.org/packages/73/c8/ebd3c18b94b3734a613e07004052b2717bc8ac0240a68257b33ca30abb9e/arro3_core-0.4.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:474f619583e88043213af7c8d1d381bfa6f3f52cc6f582f845b4a7b08ad609d0", size = 2486035 },
+ { url = "https://files.pythonhosted.org/packages/0b/ea/4cf22b5ec372de2350f5ef10031bdbfbf016b40a9eca9e6210ec3f413e32/arro3_core-0.4.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a48cdf8ebb891e249dd5ccdb0e97e3a25bb394dedc0df968a330cada899f6e77", size = 2342692 },
+ { url = "https://files.pythonhosted.org/packages/ec/5f/3fbb2c230b79a8ec0391abc83b680e493f697da31257f0174a0ce9632806/arro3_core-0.4.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e83c8d3fb1c06e396c2600b5e93efabd98ecc8e19e0c7f30024a0d72d4859868", size = 2686733 },
+ { url = "https://files.pythonhosted.org/packages/b6/be/7cbb590594fdd2596c9300c0ee05ad03620c7f963a70d9fed01d2f507364/arro3_core-0.4.5-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c643b1540f326d213d9e910d99ed11258880bf3bedb753ee6f791fc6d01f86fb", size = 2484257 },
+ { url = "https://files.pythonhosted.org/packages/19/9b/b3fe104338d0f4b9f1abddf172b24989d1bbdf9c10db38f53ebf2bfe5f18/arro3_core-0.4.5-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:f0d0f5044c9573e1b7443d1d383143bfe00adef17c5de3e085e3b33684876647", size = 2927734 },
+ { url = "https://files.pythonhosted.org/packages/0c/4e/5b0f655462fe90ab13a892df29897e21cec2a5eb24aa0ad664ef93b99a1d/arro3_core-0.4.5-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:209a3ef1f9e89ddf02709b03e3c317c96158f5952a5e6ec2179707483990a0f9", size = 2771296 },
+ { url = "https://files.pythonhosted.org/packages/be/ae/12bb4619ed78ad9845e8d425dc96b97d90728cb20e2eb75dc563ef124159/arro3_core-0.4.5-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:a08a76a48a756afdfdc34098810012fe2a86f87289b39cb6049691ae51a4744f", size = 2661378 },
+]
+
+[[package]]
+name = "asttokens"
+version = "3.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 },
+]
+
+[[package]]
+name = "attrs"
+version = "24.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 },
+]
+
+[[package]]
+name = "babel"
+version = "2.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 },
+]
+
+[[package]]
+name = "backports-tarfile"
+version = "1.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181 },
+]
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.12.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "soupsieve" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 },
+]
+
+[[package]]
+name = "certifi"
+version = "2024.12.14"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
+]
+
+[[package]]
+name = "cffi"
+version = "1.17.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 },
+ { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 },
+ { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 },
+ { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 },
+ { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 },
+ { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 },
+ { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 },
+ { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 },
+ { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 },
+ { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 },
+ { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 },
+ { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 },
+ { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 },
+ { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 },
+ { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 },
+ { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 },
+ { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 },
+ { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 },
+ { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 },
+ { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 },
+ { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 },
+ { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 },
+ { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 },
+ { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 },
+ { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 },
+ { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 },
+ { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 },
+ { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 },
+ { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 },
+ { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 },
+ { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 },
+ { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 },
+ { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 },
+ { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 },
+ { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 },
+ { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
+ { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
+ { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
+ { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
+ { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
+ { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
+ { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
+ { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
+ { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
+ { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
+ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
+ { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220 },
+ { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605 },
+ { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910 },
+ { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200 },
+ { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565 },
+ { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635 },
+ { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218 },
+ { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486 },
+ { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911 },
+ { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632 },
+ { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820 },
+ { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290 },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 },
+ { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 },
+ { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 },
+ { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 },
+ { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 },
+ { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 },
+ { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 },
+ { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 },
+ { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 },
+ { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 },
+ { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 },
+ { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 },
+ { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 },
+ { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 },
+ { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 },
+ { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 },
+ { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 },
+ { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 },
+ { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 },
+ { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 },
+ { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 },
+ { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 },
+ { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 },
+ { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 },
+ { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 },
+ { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 },
+ { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 },
+ { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 },
+ { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 },
+ { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 },
+ { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 },
+ { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 },
+ { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 },
+ { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 },
+ { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 },
+ { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 },
+ { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 },
+ { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 },
+ { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 },
+ { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
+ { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
+ { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
+ { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
+ { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
+ { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
+ { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
+ { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
+ { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
+ { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
+ { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
+ { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
+ { url = "https://files.pythonhosted.org/packages/7f/c0/b913f8f02836ed9ab32ea643c6fe4d3325c3d8627cf6e78098671cafff86/charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", size = 197867 },
+ { url = "https://files.pythonhosted.org/packages/0f/6c/2bee440303d705b6fb1e2ec789543edec83d32d258299b16eed28aad48e0/charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", size = 141385 },
+ { url = "https://files.pythonhosted.org/packages/3d/04/cb42585f07f6f9fd3219ffb6f37d5a39b4fd2db2355b23683060029c35f7/charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", size = 151367 },
+ { url = "https://files.pythonhosted.org/packages/54/54/2412a5b093acb17f0222de007cc129ec0e0df198b5ad2ce5699355269dfe/charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", size = 143928 },
+ { url = "https://files.pythonhosted.org/packages/5a/6d/e2773862b043dcf8a221342954f375392bb2ce6487bcd9f2c1b34e1d6781/charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", size = 146203 },
+ { url = "https://files.pythonhosted.org/packages/b9/f8/ca440ef60d8f8916022859885f231abb07ada3c347c03d63f283bec32ef5/charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", size = 148082 },
+ { url = "https://files.pythonhosted.org/packages/04/d2/42fd330901aaa4b805a1097856c2edf5095e260a597f65def493f4b8c833/charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", size = 142053 },
+ { url = "https://files.pythonhosted.org/packages/9e/af/3a97a4fa3c53586f1910dadfc916e9c4f35eeada36de4108f5096cb7215f/charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", size = 150625 },
+ { url = "https://files.pythonhosted.org/packages/26/ae/23d6041322a3556e4da139663d02fb1b3c59a23ab2e2b56432bd2ad63ded/charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", size = 153549 },
+ { url = "https://files.pythonhosted.org/packages/94/22/b8f2081c6a77cb20d97e57e0b385b481887aa08019d2459dc2858ed64871/charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", size = 150945 },
+ { url = "https://files.pythonhosted.org/packages/c7/0b/c5ec5092747f801b8b093cdf5610e732b809d6cb11f4c51e35fc28d1d389/charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", size = 146595 },
+ { url = "https://files.pythonhosted.org/packages/0c/5a/0b59704c38470df6768aa154cc87b1ac7c9bb687990a1559dc8765e8627e/charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", size = 95453 },
+ { url = "https://files.pythonhosted.org/packages/85/2d/a9790237cb4d01a6d57afadc8573c8b73c609ade20b80f4cda30802009ee/charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", size = 102811 },
+ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
+]
+
+[[package]]
+name = "comm"
+version = "0.2.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 },
+]
+
+[[package]]
+name = "coverage"
+version = "7.6.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 },
+ { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 },
+ { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 },
+ { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 },
+ { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 },
+ { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 },
+ { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 },
+ { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 },
+ { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 },
+ { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 },
+ { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 },
+ { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 },
+ { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 },
+ { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 },
+ { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 },
+ { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 },
+ { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 },
+ { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 },
+ { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 },
+ { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 },
+ { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 },
+ { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 },
+ { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 },
+ { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 },
+ { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 },
+ { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 },
+ { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 },
+ { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 },
+ { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 },
+ { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 },
+ { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 },
+ { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 },
+ { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 },
+ { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 },
+ { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 },
+ { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 },
+ { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 },
+ { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 },
+ { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 },
+ { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 },
+ { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 },
+ { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 },
+ { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 },
+ { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 },
+ { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 },
+ { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 },
+ { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 },
+ { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 },
+ { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 },
+ { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 },
+ { url = "https://files.pythonhosted.org/packages/40/41/473617aadf9a1c15bc2d56be65d90d7c29bfa50a957a67ef96462f7ebf8e/coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", size = 207978 },
+ { url = "https://files.pythonhosted.org/packages/10/f6/480586607768b39a30e6910a3c4522139094ac0f1677028e1f4823688957/coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", size = 208415 },
+ { url = "https://files.pythonhosted.org/packages/f1/af/439bb760f817deff6f4d38fe7da08d9dd7874a560241f1945bc3b4446550/coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", size = 236452 },
+ { url = "https://files.pythonhosted.org/packages/d0/13/481f4ceffcabe29ee2332e60efb52e4694f54a402f3ada2bcec10bb32e43/coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", size = 234374 },
+ { url = "https://files.pythonhosted.org/packages/c5/59/4607ea9d6b1b73e905c7656da08d0b00cdf6e59f2293ec259e8914160025/coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", size = 235505 },
+ { url = "https://files.pythonhosted.org/packages/85/60/d66365723b9b7f29464b11d024248ed3523ce5aab958e4ad8c43f3f4148b/coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", size = 234616 },
+ { url = "https://files.pythonhosted.org/packages/74/f8/2cf7a38e7d81b266f47dfcf137fecd8fa66c7bdbd4228d611628d8ca3437/coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", size = 233099 },
+ { url = "https://files.pythonhosted.org/packages/50/2b/bff6c1c6b63c4396ea7ecdbf8db1788b46046c681b8fcc6ec77db9f4ea49/coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", size = 234089 },
+ { url = "https://files.pythonhosted.org/packages/bf/b5/baace1c754d546a67779358341aa8d2f7118baf58cac235db457e1001d1b/coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", size = 210701 },
+ { url = "https://files.pythonhosted.org/packages/b1/bf/9e1e95b8b20817398ecc5a1e8d3e05ff404e1b9fb2185cd71561698fe2a2/coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", size = 211482 },
+ { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 },
+]
+
+[package.optional-dependencies]
+toml = [
+ { name = "tomli", marker = "python_full_version <= '3.11'" },
+]
+
+[[package]]
+name = "cryptography"
+version = "44.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 },
+ { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 },
+ { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 },
+ { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 },
+ { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 },
+ { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 },
+ { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 },
+ { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 },
+ { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 },
+ { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 },
+ { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 },
+ { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 },
+ { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 },
+ { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 },
+ { url = "https://files.pythonhosted.org/packages/1a/aa/ba8a7467c206cb7b62f09b4168da541b5109838627f582843bbbe0235e8e/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4", size = 3850615 },
+ { url = "https://files.pythonhosted.org/packages/89/fa/b160e10a64cc395d090105be14f399b94e617c879efd401188ce0fea39ee/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", size = 4081622 },
+ { url = "https://files.pythonhosted.org/packages/47/8f/20ff0656bb0cf7af26ec1d01f780c5cfbaa7666736063378c5f48558b515/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", size = 3867546 },
+ { url = "https://files.pythonhosted.org/packages/38/d9/28edf32ee2fcdca587146bcde90102a7319b2f2c690edfa627e46d586050/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", size = 4090937 },
+]
+
+[[package]]
+name = "debugpy"
+version = "1.8.12"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/68/25/c74e337134edf55c4dfc9af579eccb45af2393c40960e2795a94351e8140/debugpy-1.8.12.tar.gz", hash = "sha256:646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce", size = 1641122 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/56/19/dd58334c0a1ec07babf80bf29fb8daf1a7ca4c1a3bbe61548e40616ac087/debugpy-1.8.12-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:a2ba7ffe58efeae5b8fad1165357edfe01464f9aef25e814e891ec690e7dd82a", size = 2076091 },
+ { url = "https://files.pythonhosted.org/packages/4c/37/bde1737da15f9617d11ab7b8d5267165f1b7dae116b2585a6643e89e1fa2/debugpy-1.8.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbbd4149c4fc5e7d508ece083e78c17442ee13b0e69bfa6bd63003e486770f45", size = 3560717 },
+ { url = "https://files.pythonhosted.org/packages/d9/ca/bc67f5a36a7de072908bc9e1156c0f0b272a9a2224cf21540ab1ffd71a1f/debugpy-1.8.12-cp310-cp310-win32.whl", hash = "sha256:b202f591204023b3ce62ff9a47baa555dc00bb092219abf5caf0e3718ac20e7c", size = 5180672 },
+ { url = "https://files.pythonhosted.org/packages/c1/b9/e899c0a80dfa674dbc992f36f2b1453cd1ee879143cdb455bc04fce999da/debugpy-1.8.12-cp310-cp310-win_amd64.whl", hash = "sha256:9649eced17a98ce816756ce50433b2dd85dfa7bc92ceb60579d68c053f98dff9", size = 5212702 },
+ { url = "https://files.pythonhosted.org/packages/af/9f/5b8af282253615296264d4ef62d14a8686f0dcdebb31a669374e22fff0a4/debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:36f4829839ef0afdfdd208bb54f4c3d0eea86106d719811681a8627ae2e53dd5", size = 2174643 },
+ { url = "https://files.pythonhosted.org/packages/ef/31/f9274dcd3b0f9f7d1e60373c3fa4696a585c55acb30729d313bb9d3bcbd1/debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28ed481d530e3138553be60991d2d61103ce6da254e51547b79549675f539b7", size = 3133457 },
+ { url = "https://files.pythonhosted.org/packages/ab/ca/6ee59e9892e424477e0c76e3798046f1fd1288040b927319c7a7b0baa484/debugpy-1.8.12-cp311-cp311-win32.whl", hash = "sha256:4ad9a94d8f5c9b954e0e3b137cc64ef3f579d0df3c3698fe9c3734ee397e4abb", size = 5106220 },
+ { url = "https://files.pythonhosted.org/packages/d5/1a/8ab508ab05ede8a4eae3b139bbc06ea3ca6234f9e8c02713a044f253be5e/debugpy-1.8.12-cp311-cp311-win_amd64.whl", hash = "sha256:4703575b78dd697b294f8c65588dc86874ed787b7348c65da70cfc885efdf1e1", size = 5130481 },
+ { url = "https://files.pythonhosted.org/packages/ba/e6/0f876ecfe5831ebe4762b19214364753c8bc2b357d28c5d739a1e88325c7/debugpy-1.8.12-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:7e94b643b19e8feb5215fa508aee531387494bf668b2eca27fa769ea11d9f498", size = 2500846 },
+ { url = "https://files.pythonhosted.org/packages/19/64/33f41653a701f3cd2cbff8b41ebaad59885b3428b5afd0d93d16012ecf17/debugpy-1.8.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086b32e233e89a2740c1615c2f775c34ae951508b28b308681dbbb87bba97d06", size = 4222181 },
+ { url = "https://files.pythonhosted.org/packages/32/a6/02646cfe50bfacc9b71321c47dc19a46e35f4e0aceea227b6d205e900e34/debugpy-1.8.12-cp312-cp312-win32.whl", hash = "sha256:2ae5df899732a6051b49ea2632a9ea67f929604fd2b036613a9f12bc3163b92d", size = 5227017 },
+ { url = "https://files.pythonhosted.org/packages/da/a6/10056431b5c47103474312cf4a2ec1001f73e0b63b1216706d5fef2531eb/debugpy-1.8.12-cp312-cp312-win_amd64.whl", hash = "sha256:39dfbb6fa09f12fae32639e3286112fc35ae976114f1f3d37375f3130a820969", size = 5267555 },
+ { url = "https://files.pythonhosted.org/packages/cf/4d/7c3896619a8791effd5d8c31f0834471fc8f8fb3047ec4f5fc69dd1393dd/debugpy-1.8.12-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:696d8ae4dff4cbd06bf6b10d671e088b66669f110c7c4e18a44c43cf75ce966f", size = 2485246 },
+ { url = "https://files.pythonhosted.org/packages/99/46/bc6dcfd7eb8cc969a5716d858e32485eb40c72c6a8dc88d1e3a4d5e95813/debugpy-1.8.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:898fba72b81a654e74412a67c7e0a81e89723cfe2a3ea6fcd3feaa3395138ca9", size = 4218616 },
+ { url = "https://files.pythonhosted.org/packages/03/dd/d7fcdf0381a9b8094da1f6a1c9f19fed493a4f8576a2682349b3a8b20ec7/debugpy-1.8.12-cp313-cp313-win32.whl", hash = "sha256:22a11c493c70413a01ed03f01c3c3a2fc4478fc6ee186e340487b2edcd6f4180", size = 5226540 },
+ { url = "https://files.pythonhosted.org/packages/25/bd/ecb98f5b5fc7ea0bfbb3c355bc1dd57c198a28780beadd1e19915bf7b4d9/debugpy-1.8.12-cp313-cp313-win_amd64.whl", hash = "sha256:fdb3c6d342825ea10b90e43d7f20f01535a72b3a1997850c0c3cefa5c27a4a2c", size = 5267134 },
+ { url = "https://files.pythonhosted.org/packages/89/37/a3333c5b69c086465ea3c073424ef2775e52a6c17276f642f64209c4a082/debugpy-1.8.12-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:b5c6c967d02fee30e157ab5227706f965d5c37679c687b1e7bbc5d9e7128bd41", size = 2077275 },
+ { url = "https://files.pythonhosted.org/packages/50/1d/99f6a0a78b4b513ff2b0d0e44c1e705f7ee34e3aba0e8add617d339d97dc/debugpy-1.8.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a77f422f31f170c4b7e9ca58eae2a6c8e04da54121900651dfa8e66c29901a", size = 3555956 },
+ { url = "https://files.pythonhosted.org/packages/b8/86/c624665aaa807d065da2016b05e9f2fb4fa56872d67a5fbd7751e77f7f88/debugpy-1.8.12-cp39-cp39-win32.whl", hash = "sha256:a4042edef80364239f5b7b5764e55fd3ffd40c32cf6753da9bda4ff0ac466018", size = 5181535 },
+ { url = "https://files.pythonhosted.org/packages/72/c7/d59a0f845ce1677b5c2bb170f08cc1cc3531625a5fdce9c67bd31116540a/debugpy-1.8.12-cp39-cp39-win_amd64.whl", hash = "sha256:f30b03b0f27608a0b26c75f0bb8a880c752c0e0b01090551b9d87c7d783e2069", size = 5213601 },
+ { url = "https://files.pythonhosted.org/packages/38/c4/5120ad36405c3008f451f94b8f92ef1805b1e516f6ff870f331ccb3c4cc0/debugpy-1.8.12-py2.py3-none-any.whl", hash = "sha256:274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6", size = 5229490 },
+]
+
+[[package]]
+name = "decorator"
+version = "5.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
+]
+
+[[package]]
+name = "distlib"
+version = "0.3.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 },
+]
+
+[[package]]
+name = "docutils"
+version = "0.21.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 },
+]
+
+[[package]]
+name = "duckdb"
+version = "1.1.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a0/d7/ec014b351b6bb026d5f473b1d0ec6bd6ba40786b9abbf530b4c9041d9895/duckdb-1.1.3.tar.gz", hash = "sha256:68c3a46ab08836fe041d15dcbf838f74a990d551db47cb24ab1c4576fc19351c", size = 12240672 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/7e/aef0fa22a80939edb04f66152a1fd5ce7257931576be192a8068e74f0892/duckdb-1.1.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:1c0226dc43e2ee4cc3a5a4672fddb2d76fd2cf2694443f395c02dd1bea0b7fce", size = 15469781 },
+ { url = "https://files.pythonhosted.org/packages/38/22/df548714ddd915929ebbba9699e8614655ed93cd367f5849f6dbd1b3e160/duckdb-1.1.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7c71169fa804c0b65e49afe423ddc2dc83e198640e3b041028da8110f7cd16f7", size = 32313005 },
+ { url = "https://files.pythonhosted.org/packages/9f/38/8de640857f4c55df870faf025835e09c69222d365dc773507e934cee3376/duckdb-1.1.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:872d38b65b66e3219d2400c732585c5b4d11b13d7a36cd97908d7981526e9898", size = 16931481 },
+ { url = "https://files.pythonhosted.org/packages/41/9b/87fff1341a9f57ab75284d79f902fee8cd6ef3a9135af4c723c90384d307/duckdb-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25fb02629418c0d4d94a2bc1776edaa33f6f6ccaa00bd84eb96ecb97ae4b50e9", size = 18491670 },
+ { url = "https://files.pythonhosted.org/packages/3e/ee/8f74ccecbafd14e257c634f0f2cdebbc35634d9d74f04bb7ad8a0e142bf8/duckdb-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3f5cd604e7c39527e6060f430769b72234345baaa0987f9500988b2814f5e4", size = 20144774 },
+ { url = "https://files.pythonhosted.org/packages/36/7b/edffb833b8569a7fc1799ceb4392911e0082f18a6076225441e954a95853/duckdb-1.1.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08935700e49c187fe0e9b2b86b5aad8a2ccd661069053e38bfaed3b9ff795efd", size = 18287084 },
+ { url = "https://files.pythonhosted.org/packages/a9/ab/6367e8c98b3331260bb4389c6b80deef96614c1e21edcdba23a882e45ab0/duckdb-1.1.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9b47036945e1db32d70e414a10b1593aec641bd4c5e2056873d971cc21e978b", size = 21614877 },
+ { url = "https://files.pythonhosted.org/packages/03/d8/89b1c5f1dbd16342640742f6f6d3f1c827d1a1b966d674774ddfe6a385e2/duckdb-1.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:35c420f58abc79a68a286a20fd6265636175fadeca1ce964fc8ef159f3acc289", size = 10954044 },
+ { url = "https://files.pythonhosted.org/packages/57/d0/96127582230183dc36f1209d5e8e67f54b3459b3b9794603305d816f350a/duckdb-1.1.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4f0e2e5a6f5a53b79aee20856c027046fba1d73ada6178ed8467f53c3877d5e0", size = 15469495 },
+ { url = "https://files.pythonhosted.org/packages/70/07/b78b435f8fe85c23ee2d49a01dc9599bb4a272c40f2a6bf67ff75958bdad/duckdb-1.1.3-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:911d58c22645bfca4a5a049ff53a0afd1537bc18fedb13bc440b2e5af3c46148", size = 32318595 },
+ { url = "https://files.pythonhosted.org/packages/6c/d8/253b3483fc554daf72503ba0f112404f75be6bbd7ca7047e804873cbb182/duckdb-1.1.3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:c443d3d502335e69fc1e35295fcfd1108f72cb984af54c536adfd7875e79cee5", size = 16934057 },
+ { url = "https://files.pythonhosted.org/packages/f8/11/908a8fb73cef8304d3f4eab7f27cc489f6fd675f921d382c83c55253be86/duckdb-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a55169d2d2e2e88077d91d4875104b58de45eff6a17a59c7dc41562c73df4be", size = 18498214 },
+ { url = "https://files.pythonhosted.org/packages/bf/56/f627b6fcd4aa34015a15449d852ccb78d7cc6eda654aa20c1d378e99fa76/duckdb-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d0767ada9f06faa5afcf63eb7ba1befaccfbcfdac5ff86f0168c673dd1f47aa", size = 20149376 },
+ { url = "https://files.pythonhosted.org/packages/b5/1d/c318dada688119b9ca975d431f9b38bde8dda41b6d18cc06e0dc52123788/duckdb-1.1.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51c6d79e05b4a0933672b1cacd6338f882158f45ef9903aef350c4427d9fc898", size = 18293289 },
+ { url = "https://files.pythonhosted.org/packages/37/8e/fd346444b270ffe52e06c1af1243eaae30ab651c1d59f51711e3502fd060/duckdb-1.1.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:183ac743f21c6a4d6adfd02b69013d5fd78e5e2cd2b4db023bc8a95457d4bc5d", size = 21622129 },
+ { url = "https://files.pythonhosted.org/packages/18/aa/804c1cf5077b6f17d752b23637d9ef53eaad77ea73ee43d4c12bff480e36/duckdb-1.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:a30dd599b8090ea6eafdfb5a9f1b872d78bac318b6914ada2d35c7974d643640", size = 10954756 },
+ { url = "https://files.pythonhosted.org/packages/9b/ff/7ee500f4cff0d2a581c1afdf2c12f70ee3bf1a61041fea4d88934a35a7a3/duckdb-1.1.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:a433ae9e72c5f397c44abdaa3c781d94f94f4065bcbf99ecd39433058c64cb38", size = 15482881 },
+ { url = "https://files.pythonhosted.org/packages/28/16/dda10da6bde54562c3cb0002ca3b7678e3108fa73ac9b7509674a02c5249/duckdb-1.1.3-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:d08308e0a46c748d9c30f1d67ee1143e9c5ea3fbcccc27a47e115b19e7e78aa9", size = 32349440 },
+ { url = "https://files.pythonhosted.org/packages/2e/c2/06f7f7a51a1843c9384e1637abb6bbebc29367710ffccc7e7e52d72b3dd9/duckdb-1.1.3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:5d57776539211e79b11e94f2f6d63de77885f23f14982e0fac066f2885fcf3ff", size = 16953473 },
+ { url = "https://files.pythonhosted.org/packages/1a/84/9991221ef7dde79d85231f20646e1b12d645490cd8be055589276f62847e/duckdb-1.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e59087dbbb63705f2483544e01cccf07d5b35afa58be8931b224f3221361d537", size = 18491915 },
+ { url = "https://files.pythonhosted.org/packages/aa/76/330fe16f12b7ddda0c664ba9869f3afbc8773dbe17ae750121d407dc0f37/duckdb-1.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ebf5f60ddbd65c13e77cddb85fe4af671d31b851f125a4d002a313696af43f1", size = 20150288 },
+ { url = "https://files.pythonhosted.org/packages/c4/88/e4b08b7a5d08c0f65f6c7a6594de64431ce7df38d7258511417ba7989ad3/duckdb-1.1.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4ef7ba97a65bd39d66f2a7080e6fb60e7c3e41d4c1e19245f90f53b98e3ac32", size = 18296560 },
+ { url = "https://files.pythonhosted.org/packages/1a/32/011e6e3ce14375a1ba01a588c119ad82be757f847c6b60207e0762d9ec3a/duckdb-1.1.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f58db1b65593ff796c8ea6e63e2e144c944dd3d51c8d8e40dffa7f41693d35d3", size = 21635270 },
+ { url = "https://files.pythonhosted.org/packages/f2/eb/58d4e0eccdc7b3523c062d008ad9eef28edccf88591d1a78659c809fe6e8/duckdb-1.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:e86006958e84c5c02f08f9b96f4bc26990514eab329b1b4f71049b3727ce5989", size = 10955715 },
+ { url = "https://files.pythonhosted.org/packages/81/d1/2462492531d4715b2ede272a26519b37f21cf3f8c85b3eb88da5b7be81d8/duckdb-1.1.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:0897f83c09356206ce462f62157ce064961a5348e31ccb2a557a7531d814e70e", size = 15483282 },
+ { url = "https://files.pythonhosted.org/packages/af/a5/ec595aa223b911a62f24393908a8eaf8e0ed1c7c07eca5008f22aab070bc/duckdb-1.1.3-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:cddc6c1a3b91dcc5f32493231b3ba98f51e6d3a44fe02839556db2b928087378", size = 32350342 },
+ { url = "https://files.pythonhosted.org/packages/08/27/e35116ab1ada5e54e52424e52d16ee9ae82db129025294e19c1d48a8b2b1/duckdb-1.1.3-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:1d9ab6143e73bcf17d62566e368c23f28aa544feddfd2d8eb50ef21034286f24", size = 16953863 },
+ { url = "https://files.pythonhosted.org/packages/0d/ac/f2db3969a56cd96a3ba78b0fd161939322fb134bd07c98ecc7a7015d3efa/duckdb-1.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f073d15d11a328f2e6d5964a704517e818e930800b7f3fa83adea47f23720d3", size = 18494301 },
+ { url = "https://files.pythonhosted.org/packages/cf/66/d0be7c9518b1b92185018bacd851f977a101c9818686f667bbf884abcfbc/duckdb-1.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5724fd8a49e24d730be34846b814b98ba7c304ca904fbdc98b47fa95c0b0cee", size = 20150992 },
+ { url = "https://files.pythonhosted.org/packages/47/ae/c2df66e3716705f48775e692a1b8accbf3dc6e2c27a0ae307fb4b063e115/duckdb-1.1.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51e7dbd968b393343b226ab3f3a7b5a68dee6d3fe59be9d802383bf916775cb8", size = 18297818 },
+ { url = "https://files.pythonhosted.org/packages/8e/7e/10310b754b7ec3349c411a0a88ecbf327c49b5714e3d35200e69c13fb093/duckdb-1.1.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00cca22df96aa3473fe4584f84888e2cf1c516e8c2dd837210daec44eadba586", size = 21635169 },
+ { url = "https://files.pythonhosted.org/packages/83/be/46c0b89c9d4e1ba90af9bc184e88672c04d420d41342e4dc359c78d05981/duckdb-1.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:77f26884c7b807c7edd07f95cf0b00e6d47f0de4a534ac1706a58f8bc70d0d31", size = 10955826 },
+ { url = "https://files.pythonhosted.org/packages/e5/c4/8a0f629aadfa8e09574e70ceb2d4fa2e81dc36b67d353806e14474983403/duckdb-1.1.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:09c68522c30fc38fc972b8a75e9201616b96ae6da3444585f14cf0d116008c95", size = 15470008 },
+ { url = "https://files.pythonhosted.org/packages/be/0c/9f85e133c2b84f87c70fc29cf89289f65602494f15304b392d82cb76aec4/duckdb-1.1.3-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:8ee97ec337794c162c0638dda3b4a30a483d0587deda22d45e1909036ff0b739", size = 32312989 },
+ { url = "https://files.pythonhosted.org/packages/1a/ff/6abd85726dcb4df11c405f80038c0959df3a08d1c4dd6f36c046c8587e10/duckdb-1.1.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:a1f83c7217c188b7ab42e6a0963f42070d9aed114f6200e3c923c8899c090f16", size = 16931410 },
+ { url = "https://files.pythonhosted.org/packages/13/b1/478ceb0228fab92c1f6dd24c7bf0dcbbfd5c5ed690eb0492e72edc2cda0f/duckdb-1.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aa3abec8e8995a03ff1a904b0e66282d19919f562dd0a1de02f23169eeec461", size = 18492142 },
+ { url = "https://files.pythonhosted.org/packages/e3/9e/e3995491d4c3bc6b3e3e0f3bad55902225c09f571e296c1eb093f33c5c75/duckdb-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80158f4c7c7ada46245837d5b6869a336bbaa28436fbb0537663fa324a2750cd", size = 20144252 },
+ { url = "https://files.pythonhosted.org/packages/53/16/c79fe2111451f85c4c08b1d3e09da4e0b0bf67095fb5908da497ed1e87d8/duckdb-1.1.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:647f17bd126170d96a38a9a6f25fca47ebb0261e5e44881e3782989033c94686", size = 18288990 },
+ { url = "https://files.pythonhosted.org/packages/5a/ce/6cd14acc799501c44bbc0617a8fbc6769acd145a6aef0fc49bba9399fd8b/duckdb-1.1.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:252d9b17d354beb9057098d4e5d5698e091a4f4a0d38157daeea5fc0ec161670", size = 21599071 },
+ { url = "https://files.pythonhosted.org/packages/13/31/071c1ee0457caa93414b12c4204059823cbc20cf8ed4099a3e54919ea015/duckdb-1.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:eeacb598120040e9591f5a4edecad7080853aa8ac27e62d280f151f8c862afa3", size = 10988880 },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
+]
+
+[[package]]
+name = "execnet"
+version = "2.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 },
+]
+
+[[package]]
+name = "executing"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 },
+]
+
+[[package]]
+name = "filelock"
+version = "3.16.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 },
+]
+
+[[package]]
+name = "geopandas"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "packaging" },
+ { name = "pandas" },
+ { name = "pyogrio" },
+ { name = "pyproj", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "pyproj", version = "3.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "shapely" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/39/08/2cf5d85356e45b10b8d066cf4c3ba1e9e3185423c48104eed87e8afd0455/geopandas-1.0.1.tar.gz", hash = "sha256:b8bf70a5534588205b7a56646e2082fb1de9a03599651b3d80c99ea4c2ca08ab", size = 317736 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c4/64/7d344cfcef5efddf9cf32f59af7f855828e9d74b5f862eddf5bfd9f25323/geopandas-1.0.1-py3-none-any.whl", hash = "sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6", size = 323587 },
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
+]
+
+[[package]]
+name = "hatch"
+version = "1.14.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "hatchling" },
+ { name = "httpx" },
+ { name = "hyperlink" },
+ { name = "keyring" },
+ { name = "packaging" },
+ { name = "pexpect" },
+ { name = "platformdirs" },
+ { name = "rich" },
+ { name = "shellingham" },
+ { name = "tomli-w" },
+ { name = "tomlkit" },
+ { name = "userpath" },
+ { name = "uv" },
+ { name = "virtualenv" },
+ { name = "zstandard" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bc/15/b4e3d50d8177e6e8a243b24d9819e3807f7bfd3b2bebe7b5aef32a9c79cb/hatch-1.14.0.tar.gz", hash = "sha256:351e41bc6c72bc93cb98651212226e495b43549eee27c487832e459e5d0f0eda", size = 5188143 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/85/c6/ad910cdb79600af0100b7c4f7093eb4b95a2b44e589e66b6b938b09cc6f9/hatch-1.14.0-py3-none-any.whl", hash = "sha256:b12c7a2f4aaf6db7180e35c476e1a2ad4ec7197c20c4332964599424d4918ded", size = 125763 },
+]
+
+[[package]]
+name = "hatchling"
+version = "1.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "pluggy" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+ { name = "trove-classifiers" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8f/8a/cc1debe3514da292094f1c3a700e4ca25442489731ef7c0814358816bb03/hatchling-1.27.0.tar.gz", hash = "sha256:971c296d9819abb3811112fc52c7a9751c8d381898f36533bb16f9791e941fd6", size = 54983 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl", hash = "sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b", size = 75794 },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
+]
+
+[[package]]
+name = "httpx"
+version = "0.28.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
+]
+
+[[package]]
+name = "hyperlink"
+version = "21.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3a/51/1947bd81d75af87e3bb9e34593a4cf118115a8feb451ce7a69044ef1412e/hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", size = 140743 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638 },
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
+]
+
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 },
+]
+
+[[package]]
+name = "importlib-metadata"
+version = "8.5.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "zipp", marker = "python_full_version < '3.12'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514 },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 },
+]
+
+[[package]]
+name = "ipykernel"
+version = "6.29.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "appnope", marker = "sys_platform == 'darwin'" },
+ { name = "comm" },
+ { name = "debugpy" },
+ { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "ipython", version = "8.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "matplotlib-inline" },
+ { name = "nest-asyncio" },
+ { name = "packaging" },
+ { name = "psutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 },
+]
+
+[[package]]
+name = "ipython"
+version = "8.18.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+dependencies = [
+ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" },
+ { name = "decorator", marker = "python_full_version < '3.10'" },
+ { name = "exceptiongroup", marker = "python_full_version < '3.10'" },
+ { name = "jedi", marker = "python_full_version < '3.10'" },
+ { name = "matplotlib-inline", marker = "python_full_version < '3.10'" },
+ { name = "pexpect", marker = "python_full_version < '3.10' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit", marker = "python_full_version < '3.10'" },
+ { name = "pygments", marker = "python_full_version < '3.10'" },
+ { name = "stack-data", marker = "python_full_version < '3.10'" },
+ { name = "traitlets", marker = "python_full_version < '3.10'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161 },
+]
+
+[package.optional-dependencies]
+kernel = [
+ { name = "ipykernel", marker = "python_full_version < '3.10'" },
+]
+
+[[package]]
+name = "ipython"
+version = "8.31.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+dependencies = [
+ { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" },
+ { name = "decorator", marker = "python_full_version >= '3.10'" },
+ { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" },
+ { name = "jedi", marker = "python_full_version >= '3.10'" },
+ { name = "matplotlib-inline", marker = "python_full_version >= '3.10'" },
+ { name = "pexpect", marker = "python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit", marker = "python_full_version >= '3.10'" },
+ { name = "pygments", marker = "python_full_version >= '3.10'" },
+ { name = "stack-data", marker = "python_full_version >= '3.10'" },
+ { name = "traitlets", marker = "python_full_version >= '3.10'" },
+ { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 },
+]
+
+[package.optional-dependencies]
+kernel = [
+ { name = "ipykernel", marker = "python_full_version >= '3.10'" },
+]
+
+[[package]]
+name = "ipywidgets"
+version = "8.1.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "comm" },
+ { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "ipython", version = "8.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "jupyterlab-widgets" },
+ { name = "traitlets" },
+ { name = "widgetsnbextension" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 },
+]
+
+[[package]]
+name = "jaraco-classes"
+version = "3.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "more-itertools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777 },
+]
+
+[[package]]
+name = "jaraco-context"
+version = "6.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "backports-tarfile", marker = "python_full_version < '3.12'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825 },
+]
+
+[[package]]
+name = "jaraco-functools"
+version = "4.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "more-itertools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", size = 19159 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", size = 10187 },
+]
+
+[[package]]
+name = "jedi"
+version = "0.19.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "parso" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 },
+]
+
+[[package]]
+name = "jeepney"
+version = "0.8.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", size = 106005 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", size = 48435 },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 },
+]
+
+[[package]]
+name = "jsonschema"
+version = "4.23.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "jsonschema-specifications" },
+ { name = "referencing" },
+ { name = "rpds-py" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 },
+]
+
+[[package]]
+name = "jsonschema-specifications"
+version = "2024.10.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "referencing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
+]
+
+[[package]]
+name = "jupyter-client"
+version = "8.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "importlib-metadata", marker = "python_full_version < '3.10'" },
+ { name = "jupyter-core" },
+ { name = "python-dateutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 },
+]
+
+[[package]]
+name = "jupyter-core"
+version = "5.7.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "platformdirs" },
+ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
+]
+
+[[package]]
+name = "jupyterlab-widgets"
+version = "3.0.13"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 },
+]
+
+[[package]]
+name = "keyring"
+version = "25.6.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "importlib-metadata", marker = "python_full_version < '3.12'" },
+ { name = "jaraco-classes" },
+ { name = "jaraco-context" },
+ { name = "jaraco-functools" },
+ { name = "jeepney", marker = "sys_platform == 'linux'" },
+ { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" },
+ { name = "secretstorage", marker = "sys_platform == 'linux'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085 },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 },
+ { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 },
+ { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 },
+ { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 },
+ { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 },
+ { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 },
+ { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 },
+ { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 },
+ { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 },
+ { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 },
+ { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 },
+ { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 },
+ { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 },
+ { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 },
+ { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 },
+ { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 },
+ { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 },
+ { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 },
+ { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 },
+ { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 },
+ { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 },
+ { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 },
+ { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 },
+ { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 },
+ { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 },
+ { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 },
+ { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 },
+ { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 },
+ { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 },
+ { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 },
+ { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 },
+ { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 },
+ { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 },
+ { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 },
+ { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 },
+ { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 },
+ { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 },
+ { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 },
+ { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 },
+ { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 },
+ { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 },
+ { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 },
+ { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 },
+ { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 },
+ { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 },
+ { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 },
+ { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 },
+ { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 },
+ { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 },
+ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
+ { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344 },
+ { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389 },
+ { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607 },
+ { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728 },
+ { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826 },
+ { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843 },
+ { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219 },
+ { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946 },
+ { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063 },
+ { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506 },
+]
+
+[[package]]
+name = "matplotlib-inline"
+version = "0.1.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
+]
+
+[[package]]
+name = "mdit-py-plugins"
+version = "0.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
+]
+
+[[package]]
+name = "mercantile"
+version = "1.2.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d2/c6/87409bcb26fb68c393fa8cf58ba09363aa7298cfb438a0109b5cb14bc98b/mercantile-1.2.1.tar.gz", hash = "sha256:fa3c6db15daffd58454ac198b31887519a19caccee3f9d63d17ae7ff61b3b56b", size = 26352 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b2/d6/de0cc74f8d36976aeca0dd2e9cbf711882ff8e177495115fd82459afdc4d/mercantile-1.2.1-py3-none-any.whl", hash = "sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f", size = 14779 },
+]
+
+[[package]]
+name = "mistune"
+version = "3.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/79/6e/96fc7cb3288666c5de2c396eb0e338dc95f7a8e4920e43e38783a22d0084/mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667", size = 94401 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", size = 53694 },
+]
+
+[[package]]
+name = "more-itertools"
+version = "10.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 },
+]
+
+[[package]]
+name = "mslex"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/97/7022667073c99a0fe028f2e34b9bf76b49a611afd21b02527fbfd92d4cd5/mslex-1.3.0.tar.gz", hash = "sha256:641c887d1d3db610eee2af37a8e5abda3f70b3006cdfd2d0d29dc0d1ae28a85d", size = 11583 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/64/f2/66bd65ca0139675a0d7b18f0bada6e12b51a984e41a76dbe44761bf1b3ee/mslex-1.3.0-py3-none-any.whl", hash = "sha256:c7074b347201b3466fc077c5692fbce9b5f62a63a51f537a53fbbd02eff2eea4", size = 7820 },
+]
+
+[[package]]
+name = "mypy"
+version = "1.14.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mypy-extensions" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9b/7a/87ae2adb31d68402da6da1e5f30c07ea6063e9f09b5e7cfc9dfa44075e74/mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", size = 11211002 },
+ { url = "https://files.pythonhosted.org/packages/e1/23/eada4c38608b444618a132be0d199b280049ded278b24cbb9d3fc59658e4/mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", size = 10358400 },
+ { url = "https://files.pythonhosted.org/packages/43/c9/d6785c6f66241c62fd2992b05057f404237deaad1566545e9f144ced07f5/mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", size = 12095172 },
+ { url = "https://files.pythonhosted.org/packages/c3/62/daa7e787770c83c52ce2aaf1a111eae5893de9e004743f51bfcad9e487ec/mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", size = 12828732 },
+ { url = "https://files.pythonhosted.org/packages/1b/a2/5fb18318a3637f29f16f4e41340b795da14f4751ef4f51c99ff39ab62e52/mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", size = 13012197 },
+ { url = "https://files.pythonhosted.org/packages/28/99/e153ce39105d164b5f02c06c35c7ba958aaff50a2babba7d080988b03fe7/mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", size = 9780836 },
+ { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 },
+ { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 },
+ { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 },
+ { url = "https://files.pythonhosted.org/packages/f0/4c/e10e2c46ea37cab5c471d0ddaaa9a434dc1d28650078ac1b56c2d7b9b2e4/mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", size = 12749203 },
+ { url = "https://files.pythonhosted.org/packages/88/55/beacb0c69beab2153a0f57671ec07861d27d735a0faff135a494cd4f5020/mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", size = 12885900 },
+ { url = "https://files.pythonhosted.org/packages/a2/75/8c93ff7f315c4d086a2dfcde02f713004357d70a163eddb6c56a6a5eff40/mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", size = 9777869 },
+ { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 },
+ { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 },
+ { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 },
+ { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 },
+ { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 },
+ { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 },
+ { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 },
+ { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 },
+ { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 },
+ { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 },
+ { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 },
+ { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 },
+ { url = "https://files.pythonhosted.org/packages/ca/1f/186d133ae2514633f8558e78cd658070ba686c0e9275c5a5c24a1e1f0d67/mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35", size = 11200493 },
+ { url = "https://files.pythonhosted.org/packages/af/fc/4842485d034e38a4646cccd1369f6b1ccd7bc86989c52770d75d719a9941/mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc", size = 10357702 },
+ { url = "https://files.pythonhosted.org/packages/b4/e6/457b83f2d701e23869cfec013a48a12638f75b9d37612a9ddf99072c1051/mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9", size = 12091104 },
+ { url = "https://files.pythonhosted.org/packages/f1/bf/76a569158db678fee59f4fd30b8e7a0d75bcbaeef49edd882a0d63af6d66/mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb", size = 12830167 },
+ { url = "https://files.pythonhosted.org/packages/43/bc/0bc6b694b3103de9fed61867f1c8bd33336b913d16831431e7cb48ef1c92/mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60", size = 13013834 },
+ { url = "https://files.pythonhosted.org/packages/b0/79/5f5ec47849b6df1e6943d5fd8e6632fbfc04b4fd4acfa5a5a9535d11b4e2/mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c", size = 9781231 },
+ { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
+]
+
+[[package]]
+name = "myst-parser"
+version = "3.0.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+dependencies = [
+ { name = "docutils", marker = "python_full_version < '3.10'" },
+ { name = "jinja2", marker = "python_full_version < '3.10'" },
+ { name = "markdown-it-py", marker = "python_full_version < '3.10'" },
+ { name = "mdit-py-plugins", marker = "python_full_version < '3.10'" },
+ { name = "pyyaml", marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163 },
+]
+
+[[package]]
+name = "myst-parser"
+version = "4.0.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+dependencies = [
+ { name = "docutils", marker = "python_full_version >= '3.10'" },
+ { name = "jinja2", marker = "python_full_version >= '3.10'" },
+ { name = "markdown-it-py", marker = "python_full_version >= '3.10'" },
+ { name = "mdit-py-plugins", marker = "python_full_version >= '3.10'" },
+ { name = "pyyaml", marker = "python_full_version >= '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 },
+]
+
+[[package]]
+name = "narwhals"
+version = "1.22.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/26/2d/3047f817d6a1290b96851950101776d40671c309bed36429537b5cab5b94/narwhals-1.22.0.tar.gz", hash = "sha256:8e257c5af70a82382796706f39d681290f2c482812474524087f36cb69f9d2f1", size = 241780 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/17/d9/00a937201a3ca6e8b2ca29226935be53dd7bc9bee27cb8ba5b27efe11ccf/narwhals-1.22.0-py3-none-any.whl", hash = "sha256:5c931bf8696b6dec276f590f1bc5043080606b16ce86d85c9b550312c981970f", size = 297474 },
+]
+
+[[package]]
+name = "nest-asyncio"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 },
+]
+
+[[package]]
+name = "numpy"
+version = "2.0.2"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245 },
+ { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540 },
+ { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623 },
+ { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774 },
+ { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081 },
+ { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451 },
+ { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572 },
+ { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722 },
+ { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170 },
+ { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558 },
+ { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137 },
+ { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552 },
+ { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957 },
+ { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573 },
+ { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330 },
+ { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895 },
+ { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253 },
+ { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074 },
+ { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640 },
+ { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230 },
+ { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803 },
+ { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835 },
+ { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499 },
+ { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497 },
+ { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158 },
+ { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173 },
+ { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174 },
+ { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701 },
+ { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313 },
+ { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 },
+ { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942 },
+ { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512 },
+ { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976 },
+ { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494 },
+ { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596 },
+ { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099 },
+ { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823 },
+ { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424 },
+ { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809 },
+ { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314 },
+ { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288 },
+ { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793 },
+ { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885 },
+ { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784 },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/fdbf6a7871703df6160b5cf3dd774074b086d278172285c52c2758b76305/numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", size = 20227662 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/c4/5588367dc9f91e1a813beb77de46ea8cab13f778e1b3a0e661ab031aba44/numpy-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440", size = 21213214 },
+ { url = "https://files.pythonhosted.org/packages/d8/8b/32dd9f08419023a4cf856c5ad0b4eba9b830da85eafdef841a104c4fc05a/numpy-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab", size = 14352248 },
+ { url = "https://files.pythonhosted.org/packages/84/2d/0e895d02940ba6e12389f0ab5cac5afcf8dc2dc0ade4e8cad33288a721bd/numpy-2.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675", size = 5391007 },
+ { url = "https://files.pythonhosted.org/packages/11/b9/7f1e64a0d46d9c2af6d17966f641fb12d5b8ea3003f31b2308f3e3b9a6aa/numpy-2.2.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308", size = 6926174 },
+ { url = "https://files.pythonhosted.org/packages/2e/8c/043fa4418bc9364e364ab7aba8ff6ef5f6b9171ade22de8fbcf0e2fa4165/numpy-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957", size = 14330914 },
+ { url = "https://files.pythonhosted.org/packages/f7/b6/d8110985501ca8912dfc1c3bbef99d66e62d487f72e46b2337494df77364/numpy-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf", size = 16379607 },
+ { url = "https://files.pythonhosted.org/packages/e2/57/bdca9fb8bdaa810c3a4ff2eb3231379b77f618a7c0d24be9f7070db50775/numpy-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2", size = 15541760 },
+ { url = "https://files.pythonhosted.org/packages/97/55/3b9147b3cbc3b6b1abc2a411dec5337a46c873deca0dd0bf5bef9d0579cc/numpy-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528", size = 18168476 },
+ { url = "https://files.pythonhosted.org/packages/00/e7/7c2cde16c9b87a8e14fdd262ca7849c4681cf48c8a774505f7e6f5e3b643/numpy-2.2.1-cp310-cp310-win32.whl", hash = "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95", size = 6570985 },
+ { url = "https://files.pythonhosted.org/packages/a1/a8/554b0e99fc4ac11ec481254781a10da180d0559c2ebf2c324232317349ee/numpy-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf", size = 12913384 },
+ { url = "https://files.pythonhosted.org/packages/59/14/645887347124e101d983e1daf95b48dc3e136bf8525cb4257bf9eab1b768/numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484", size = 21217379 },
+ { url = "https://files.pythonhosted.org/packages/9f/fd/2279000cf29f58ccfd3778cbf4670dfe3f7ce772df5e198c5abe9e88b7d7/numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7", size = 14388520 },
+ { url = "https://files.pythonhosted.org/packages/58/b0/034eb5d5ba12d66ab658ff3455a31f20add0b78df8203c6a7451bd1bee21/numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb", size = 5389286 },
+ { url = "https://files.pythonhosted.org/packages/5d/69/6f3cccde92e82e7835fdb475c2bf439761cbf8a1daa7c07338e1e132dfec/numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5", size = 6930345 },
+ { url = "https://files.pythonhosted.org/packages/d1/72/1cd38e91ab563e67f584293fcc6aca855c9ae46dba42e6b5ff4600022899/numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73", size = 14335748 },
+ { url = "https://files.pythonhosted.org/packages/f2/d4/f999444e86986f3533e7151c272bd8186c55dda554284def18557e013a2a/numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591", size = 16391057 },
+ { url = "https://files.pythonhosted.org/packages/99/7b/85cef6a3ae1b19542b7afd97d0b296526b6ef9e3c43ea0c4d9c4404fb2d0/numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8", size = 15556943 },
+ { url = "https://files.pythonhosted.org/packages/69/7e/b83cc884c3508e91af78760f6b17ab46ad649831b1fa35acb3eb26d9e6d2/numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0", size = 18180785 },
+ { url = "https://files.pythonhosted.org/packages/b2/9f/eb4a9a38867de059dcd4b6e18d47c3867fbd3795d4c9557bb49278f94087/numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd", size = 6568983 },
+ { url = "https://files.pythonhosted.org/packages/6d/1e/be3b9f3073da2f8c7fa361fcdc231b548266b0781029fdbaf75eeab997fd/numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16", size = 12917260 },
+ { url = "https://files.pythonhosted.org/packages/62/12/b928871c570d4a87ab13d2cc19f8817f17e340d5481621930e76b80ffb7d/numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", size = 20909861 },
+ { url = "https://files.pythonhosted.org/packages/3d/c3/59df91ae1d8ad7c5e03efd63fd785dec62d96b0fe56d1f9ab600b55009af/numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", size = 14095776 },
+ { url = "https://files.pythonhosted.org/packages/af/4e/8ed5868efc8e601fb69419644a280e9c482b75691466b73bfaab7d86922c/numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", size = 5126239 },
+ { url = "https://files.pythonhosted.org/packages/1a/74/dd0bbe650d7bc0014b051f092f2de65e34a8155aabb1287698919d124d7f/numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", size = 6659296 },
+ { url = "https://files.pythonhosted.org/packages/7f/11/4ebd7a3f4a655764dc98481f97bd0a662fb340d1001be6050606be13e162/numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", size = 14047121 },
+ { url = "https://files.pythonhosted.org/packages/7f/a7/c1f1d978166eb6b98ad009503e4d93a8c1962d0eb14a885c352ee0276a54/numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", size = 16096599 },
+ { url = "https://files.pythonhosted.org/packages/3d/6d/0e22afd5fcbb4d8d0091f3f46bf4e8906399c458d4293da23292c0ba5022/numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51", size = 15243932 },
+ { url = "https://files.pythonhosted.org/packages/03/39/e4e5832820131ba424092b9610d996b37e5557180f8e2d6aebb05c31ae54/numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", size = 17861032 },
+ { url = "https://files.pythonhosted.org/packages/5f/8a/3794313acbf5e70df2d5c7d2aba8718676f8d054a05abe59e48417fb2981/numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", size = 6274018 },
+ { url = "https://files.pythonhosted.org/packages/17/c1/c31d3637f2641e25c7a19adf2ae822fdaf4ddd198b05d79a92a9ce7cb63e/numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", size = 12613843 },
+ { url = "https://files.pythonhosted.org/packages/20/d6/91a26e671c396e0c10e327b763485ee295f5a5a7a48c553f18417e5a0ed5/numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", size = 20896464 },
+ { url = "https://files.pythonhosted.org/packages/8c/40/5792ccccd91d45e87d9e00033abc4f6ca8a828467b193f711139ff1f1cd9/numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", size = 14111350 },
+ { url = "https://files.pythonhosted.org/packages/c0/2a/fb0a27f846cb857cef0c4c92bef89f133a3a1abb4e16bba1c4dace2e9b49/numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", size = 5111629 },
+ { url = "https://files.pythonhosted.org/packages/eb/e5/8e81bb9d84db88b047baf4e8b681a3e48d6390bc4d4e4453eca428ecbb49/numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", size = 6645865 },
+ { url = "https://files.pythonhosted.org/packages/7a/1a/a90ceb191dd2f9e2897c69dde93ccc2d57dd21ce2acbd7b0333e8eea4e8d/numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", size = 14043508 },
+ { url = "https://files.pythonhosted.org/packages/f1/5a/e572284c86a59dec0871a49cd4e5351e20b9c751399d5f1d79628c0542cb/numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", size = 16094100 },
+ { url = "https://files.pythonhosted.org/packages/0c/2c/a79d24f364788386d85899dd280a94f30b0950be4b4a545f4fa4ed1d4ca7/numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", size = 15239691 },
+ { url = "https://files.pythonhosted.org/packages/cf/79/1e20fd1c9ce5a932111f964b544facc5bb9bde7865f5b42f00b4a6a9192b/numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", size = 17856571 },
+ { url = "https://files.pythonhosted.org/packages/be/5b/cc155e107f75d694f562bdc84a26cc930569f3dfdfbccb3420b626065777/numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", size = 6270841 },
+ { url = "https://files.pythonhosted.org/packages/44/be/0e5cd009d2162e4138d79a5afb3b5d2341f0fe4777ab6e675aa3d4a42e21/numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", size = 12606618 },
+ { url = "https://files.pythonhosted.org/packages/a8/87/04ddf02dd86fb17c7485a5f87b605c4437966d53de1e3745d450343a6f56/numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", size = 20921004 },
+ { url = "https://files.pythonhosted.org/packages/6e/3e/d0e9e32ab14005425d180ef950badf31b862f3839c5b927796648b11f88a/numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", size = 14119910 },
+ { url = "https://files.pythonhosted.org/packages/b5/5b/aa2d1905b04a8fb681e08742bb79a7bddfc160c7ce8e1ff6d5c821be0236/numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", size = 5153612 },
+ { url = "https://files.pythonhosted.org/packages/ce/35/6831808028df0648d9b43c5df7e1051129aa0d562525bacb70019c5f5030/numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", size = 6668401 },
+ { url = "https://files.pythonhosted.org/packages/b1/38/10ef509ad63a5946cc042f98d838daebfe7eaf45b9daaf13df2086b15ff9/numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", size = 14014198 },
+ { url = "https://files.pythonhosted.org/packages/df/f8/c80968ae01df23e249ee0a4487fae55a4c0fe2f838dfe9cc907aa8aea0fa/numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", size = 16076211 },
+ { url = "https://files.pythonhosted.org/packages/09/69/05c169376016a0b614b432967ac46ff14269eaffab80040ec03ae1ae8e2c/numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", size = 15220266 },
+ { url = "https://files.pythonhosted.org/packages/f1/ff/94a4ce67ea909f41cf7ea712aebbe832dc67decad22944a1020bb398a5ee/numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", size = 17852844 },
+ { url = "https://files.pythonhosted.org/packages/46/72/8a5dbce4020dfc595592333ef2fbb0a187d084ca243b67766d29d03e0096/numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", size = 6326007 },
+ { url = "https://files.pythonhosted.org/packages/7b/9c/4fce9cf39dde2562584e4cfd351a0140240f82c0e3569ce25a250f47037d/numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", size = 12693107 },
+ { url = "https://files.pythonhosted.org/packages/f1/65/d36a76b811ffe0a4515e290cb05cb0e22171b1b0f0db6bee9141cf023545/numpy-2.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3", size = 21044672 },
+ { url = "https://files.pythonhosted.org/packages/aa/3f/b644199f165063154df486d95198d814578f13dd4d8c1651e075bf1cb8af/numpy-2.2.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964", size = 6789873 },
+ { url = "https://files.pythonhosted.org/packages/d7/df/2adb0bb98a3cbe8a6c3c6d1019aede1f1d8b83927ced228a46cc56c7a206/numpy-2.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800", size = 16194933 },
+ { url = "https://files.pythonhosted.org/packages/13/3e/1959d5219a9e6d200638d924cedda6a606392f7186a4ed56478252e70d55/numpy-2.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e", size = 12820057 },
+]
+
+[[package]]
+name = "numpydoc"
+version = "1.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "tabulate" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ee/59/5d1d1afb0b9598e21e7cda477935188e39ef845bcf59cb65ac20845bfd45/numpydoc-1.8.0.tar.gz", hash = "sha256:022390ab7464a44f8737f79f8b31ce1d3cfa4b4af79ccaa1aac5e8368db587fb", size = 90445 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl", hash = "sha256:72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541", size = 64003 },
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
+]
+
+[[package]]
+name = "pandas"
+version = "2.2.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/aa/70/c853aec59839bceed032d52010ff5f1b8d87dc3114b762e4ba2727661a3b/pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5", size = 12580827 },
+ { url = "https://files.pythonhosted.org/packages/99/f2/c4527768739ffa4469b2b4fff05aa3768a478aed89a2f271a79a40eee984/pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348", size = 11303897 },
+ { url = "https://files.pythonhosted.org/packages/ed/12/86c1747ea27989d7a4064f806ce2bae2c6d575b950be087837bdfcabacc9/pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed", size = 66480908 },
+ { url = "https://files.pythonhosted.org/packages/44/50/7db2cd5e6373ae796f0ddad3675268c8d59fb6076e66f0c339d61cea886b/pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57", size = 13064210 },
+ { url = "https://files.pythonhosted.org/packages/61/61/a89015a6d5536cb0d6c3ba02cebed51a95538cf83472975275e28ebf7d0c/pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42", size = 16754292 },
+ { url = "https://files.pythonhosted.org/packages/ce/0d/4cc7b69ce37fac07645a94e1d4b0880b15999494372c1523508511b09e40/pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f", size = 14416379 },
+ { url = "https://files.pythonhosted.org/packages/31/9e/6ebb433de864a6cd45716af52a4d7a8c3c9aaf3a98368e61db9e69e69a9c/pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645", size = 11598471 },
+ { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 },
+ { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 },
+ { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 },
+ { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 },
+ { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 },
+ { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 },
+ { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 },
+ { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 },
+ { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 },
+ { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 },
+ { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 },
+ { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 },
+ { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 },
+ { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 },
+ { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 },
+ { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 },
+ { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 },
+ { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 },
+ { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 },
+ { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 },
+ { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 },
+ { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 },
+ { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 },
+ { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 },
+ { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 },
+ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
+ { url = "https://files.pythonhosted.org/packages/ca/8c/8848a4c9b8fdf5a534fe2077af948bf53cd713d77ffbcd7bd15710348fd7/pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39", size = 12595535 },
+ { url = "https://files.pythonhosted.org/packages/9c/b9/5cead4f63b6d31bdefeb21a679bc5a7f4aaf262ca7e07e2bc1c341b68470/pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30", size = 11319822 },
+ { url = "https://files.pythonhosted.org/packages/31/af/89e35619fb573366fa68dc26dad6ad2c08c17b8004aad6d98f1a31ce4bb3/pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c", size = 15625439 },
+ { url = "https://files.pythonhosted.org/packages/3d/dd/bed19c2974296661493d7acc4407b1d2db4e2a482197df100f8f965b6225/pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c", size = 13068928 },
+ { url = "https://files.pythonhosted.org/packages/31/a3/18508e10a31ea108d746c848b5a05c0711e0278fa0d6f1c52a8ec52b80a5/pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea", size = 16783266 },
+ { url = "https://files.pythonhosted.org/packages/c4/a5/3429bd13d82bebc78f4d78c3945efedef63a7cd0c15c17b2eeb838d1121f/pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761", size = 14450871 },
+ { url = "https://files.pythonhosted.org/packages/2f/49/5c30646e96c684570925b772eac4eb0a8cb0ca590fa978f56c5d3ae73ea1/pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e", size = 11618011 },
+]
+
+[[package]]
+name = "pandas-stubs"
+version = "2.2.2.240807"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+dependencies = [
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "types-pytz", marker = "python_full_version < '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1f/df/0da95bc75c76f1e012e0bc0b76da31faaf4254e94b9870f25e6311145e98/pandas_stubs-2.2.2.240807.tar.gz", hash = "sha256:64a559725a57a449f46225fbafc422520b7410bff9252b661a225b5559192a93", size = 103095 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0a/f9/22c91632ea1b4c6165952f677bf9ad95f9ac36ffd7ef3e6450144e6d8b1a/pandas_stubs-2.2.2.240807-py3-none-any.whl", hash = "sha256:893919ad82be4275f0d07bb47a95d08bae580d3fdea308a7acfcb3f02e76186e", size = 157069 },
+]
+
+[[package]]
+name = "pandas-stubs"
+version = "2.2.3.241126"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+dependencies = [
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "types-pytz", marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/90/86/93c545d149c3e1fe1c4c55478cc3a69859d0ea3467e1d9892e9eb28cb1e7/pandas_stubs-2.2.3.241126.tar.gz", hash = "sha256:cf819383c6d9ae7d4dabf34cd47e1e45525bb2f312e6ad2939c2c204cb708acd", size = 104204 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6f/ab/ed42acf15bab2e86e5c49fad4aa038315233c4c2d22f41b49faa4d837516/pandas_stubs-2.2.3.241126-py3-none-any.whl", hash = "sha256:74aa79c167af374fe97068acc90776c0ebec5266a6e5c69fe11e9c2cf51f2267", size = 158280 },
+]
+
+[[package]]
+name = "parso"
+version = "0.8.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 },
+]
+
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
+]
+
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
+]
+
+[[package]]
+name = "pillow"
+version = "11.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/50/1c/2dcea34ac3d7bc96a1fd1bd0a6e06a57c67167fec2cff8d95d88229a8817/pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", size = 3229983 },
+ { url = "https://files.pythonhosted.org/packages/14/ca/6bec3df25e4c88432681de94a3531cc738bd85dea6c7aa6ab6f81ad8bd11/pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", size = 3101831 },
+ { url = "https://files.pythonhosted.org/packages/d4/2c/668e18e5521e46eb9667b09e501d8e07049eb5bfe39d56be0724a43117e6/pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", size = 4314074 },
+ { url = "https://files.pythonhosted.org/packages/02/80/79f99b714f0fc25f6a8499ecfd1f810df12aec170ea1e32a4f75746051ce/pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", size = 4394933 },
+ { url = "https://files.pythonhosted.org/packages/81/aa/8d4ad25dc11fd10a2001d5b8a80fdc0e564ac33b293bdfe04ed387e0fd95/pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", size = 4353349 },
+ { url = "https://files.pythonhosted.org/packages/84/7a/cd0c3eaf4a28cb2a74bdd19129f7726277a7f30c4f8424cd27a62987d864/pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", size = 4476532 },
+ { url = "https://files.pythonhosted.org/packages/8f/8b/a907fdd3ae8f01c7670dfb1499c53c28e217c338b47a813af8d815e7ce97/pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", size = 4279789 },
+ { url = "https://files.pythonhosted.org/packages/6f/9a/9f139d9e8cccd661c3efbf6898967a9a337eb2e9be2b454ba0a09533100d/pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", size = 4413131 },
+ { url = "https://files.pythonhosted.org/packages/a8/68/0d8d461f42a3f37432203c8e6df94da10ac8081b6d35af1c203bf3111088/pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", size = 2291213 },
+ { url = "https://files.pythonhosted.org/packages/14/81/d0dff759a74ba87715509af9f6cb21fa21d93b02b3316ed43bda83664db9/pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", size = 2625725 },
+ { url = "https://files.pythonhosted.org/packages/ce/1f/8d50c096a1d58ef0584ddc37e6f602828515219e9d2428e14ce50f5ecad1/pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", size = 2375213 },
+ { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 },
+ { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 },
+ { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 },
+ { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 },
+ { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 },
+ { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 },
+ { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 },
+ { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 },
+ { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 },
+ { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 },
+ { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 },
+ { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 },
+ { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 },
+ { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 },
+ { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 },
+ { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 },
+ { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 },
+ { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 },
+ { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 },
+ { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 },
+ { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 },
+ { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 },
+ { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 },
+ { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 },
+ { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 },
+ { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 },
+ { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 },
+ { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 },
+ { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 },
+ { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 },
+ { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 },
+ { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 },
+ { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 },
+ { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 },
+ { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 },
+ { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 },
+ { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 },
+ { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 },
+ { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 },
+ { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 },
+ { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
+ { url = "https://files.pythonhosted.org/packages/9a/1f/9df5ac77491fddd2e36c352d16976dc11fbe6ab842f5df85fd7e31b847b9/pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6", size = 3229995 },
+ { url = "https://files.pythonhosted.org/packages/a6/62/c7b359e924dca274173b04922ac06aa63614f7e934d132f2fe1d852509aa/pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e", size = 3101890 },
+ { url = "https://files.pythonhosted.org/packages/7b/63/136f21340a434de895b62bcf2c386005a8aa24066c4facd619f5e0e9f283/pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc", size = 4310366 },
+ { url = "https://files.pythonhosted.org/packages/f6/46/0bd0ca03d9d1164a7fa33d285ef6d1c438e963d0c8770e4c5b3737ef5abe/pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2", size = 4391582 },
+ { url = "https://files.pythonhosted.org/packages/0c/55/f182db572b28bd833b8e806f933f782ceb2df64c40e4d8bd3d4226a46eca/pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade", size = 4350278 },
+ { url = "https://files.pythonhosted.org/packages/75/fb/e330fdbbcbc4744214b5f53b84d9d8a9f4ffbebc2e9c2ac10475386e3296/pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884", size = 4471768 },
+ { url = "https://files.pythonhosted.org/packages/eb/51/20ee6c4da4448d7a67ffb720a5fcdb965115a78e211a1f58f9845ae15f86/pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196", size = 4276549 },
+ { url = "https://files.pythonhosted.org/packages/37/f2/a25c0bdaa6d6fd5cc3d4a6f65b5a7ea46e7af58bee00a98efe0a5af79c58/pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8", size = 4409350 },
+ { url = "https://files.pythonhosted.org/packages/12/a7/06687947604cd3e47abeea1b78b65d34ffce7feab03cfe0dd985f115dca3/pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5", size = 2291271 },
+ { url = "https://files.pythonhosted.org/packages/21/a6/f51d47675940b5c63b08ff0575b3518428b4acb891f88526fa4ee1edab6f/pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f", size = 2625783 },
+ { url = "https://files.pythonhosted.org/packages/95/56/97750bd33e68648fa432dfadcb8ede7624bd905822d42262d34bcebdd9d7/pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a", size = 2375193 },
+ { url = "https://files.pythonhosted.org/packages/fa/c5/389961578fb677b8b3244fcd934f720ed25a148b9a5cc81c91bdf59d8588/pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", size = 3198345 },
+ { url = "https://files.pythonhosted.org/packages/c4/fa/803c0e50ffee74d4b965229e816af55276eac1d5806712de86f9371858fd/pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", size = 3072938 },
+ { url = "https://files.pythonhosted.org/packages/dc/67/2a3a5f8012b5d8c63fe53958ba906c1b1d0482ebed5618057ef4d22f8076/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", size = 3400049 },
+ { url = "https://files.pythonhosted.org/packages/e5/a0/514f0d317446c98c478d1872497eb92e7cde67003fed74f696441e647446/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", size = 3422431 },
+ { url = "https://files.pythonhosted.org/packages/cd/00/20f40a935514037b7d3f87adfc87d2c538430ea625b63b3af8c3f5578e72/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", size = 3446208 },
+ { url = "https://files.pythonhosted.org/packages/28/3c/7de681727963043e093c72e6c3348411b0185eab3263100d4490234ba2f6/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", size = 3509746 },
+ { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353 },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.3.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
+]
+
+[[package]]
+name = "polars"
+version = "1.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/dd/8f/1005f24c8c413d8a393973fcb45e6085a2311bb513ee0c6674d438e99c31/polars-1.20.0.tar.gz", hash = "sha256:e8e9e3156fae02b58e276e5f2c16a5907a79b38617a9e2d731b533d87798f451", size = 4292434 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/93/ef/74d56f82bc2e7911276ffad8f24e7ae6f7a102ecab3b2e88b87e84243356/polars-1.20.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9a313e10ea80b99a0d32bfb942b2260b9658155287b0c2ac5876323acaff4f2c", size = 32143323 },
+ { url = "https://files.pythonhosted.org/packages/dd/e1/51c7b2bc3037af89f1c109b61a2d2f44c411212df63dd0e9c6683b66d98e/polars-1.20.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:4474bd004376599f7e4906bd350026cbbe805ba604121090578a97f63da15381", size = 28954418 },
+ { url = "https://files.pythonhosted.org/packages/2a/1a/862b8bf65182b261022292a1cd49728db876a1ef64ff377d6f7b17653886/polars-1.20.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4996e17cb6f57d9aeaf79f66c54ef2913cea7bd025410c076ef8c05d4f7d792a", size = 32850943 },
+ { url = "https://files.pythonhosted.org/packages/b7/33/1970863f0c1782a916299346d150c5bb8373d4e6827fabb8c37a0a2bcb8e/polars-1.20.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:d488ffb92d4934d9c326fa2d0fb2e9a4e3c2c625c59f4a77a77e4acd4d5a0d66", size = 29885148 },
+ { url = "https://files.pythonhosted.org/packages/bb/2d/b29112da3e98ba55e8ba77f08a90312004d2e4be0fd6401ff7d5d71eae0a/polars-1.20.0-cp39-abi3-win_amd64.whl", hash = "sha256:5ce417d2b6d4f3b8f422fcb3482039e8076182cceacbd880175fe970c6f99c84", size = 32947632 },
+ { url = "https://files.pythonhosted.org/packages/60/da/245e5852342cab10c48dc788f7b3d39a1f926f783ea124f196ad783ea6aa/polars-1.20.0-cp39-abi3-win_arm64.whl", hash = "sha256:f474f3d65450138cd2dbab2d9b6041b8646c30fad0b28e6d62457788f994bf62", size = 29141207 },
+]
+
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.48"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wcwidth" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 },
+]
+
+[[package]]
+name = "psutil"
+version = "6.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 },
+ { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 },
+ { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 },
+ { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 },
+ { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 },
+ { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 },
+ { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 },
+]
+
+[[package]]
+name = "psygnal"
+version = "0.11.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bc/b0/194cfbcb76dbf9c4a1c4271ccc825b38406d20fb7f95fd18320c28708800/psygnal-0.11.1.tar.gz", hash = "sha256:f9b02ca246ab0adb108c4010b4a486e464f940543201074591e50370cd7b0cc0", size = 102103 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/92/bf/2dee9491518402489909c0613004d3a0f79672f27ce16aae774c5addc506/psygnal-0.11.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:8d9187700fc608abefeb287bf2e0980a26c62471921ffd1a3cd223ccc554181b", size = 433484 },
+ { url = "https://files.pythonhosted.org/packages/66/0a/52b7e40f4c7ec82c9809c62e568ee9c117dd911d3f6f562ac3007a4ad969/psygnal-0.11.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:cec87aee468a1fe564094a64bc3c30edc86ce34d7bb37ab69332c7825b873396", size = 462250 },
+ { url = "https://files.pythonhosted.org/packages/c3/3f/ae610fd14cdbae8735344abfc7f67c76ff8bcf18e0e3c5f26a1ca590014e/psygnal-0.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7676e89225abc2f37ca7022c300ffd26fefaf21bdc894bc7c41dffbad5e969df", size = 727435 },
+ { url = "https://files.pythonhosted.org/packages/a5/93/8d91aef01261123640406d132add52973e16d74b6c6e63b6fb54cc261f1e/psygnal-0.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c392f638aac2cdc4f13fffb904455224ae9b4dbb2f26d7f3264e4208fee5334d", size = 706104 },
+ { url = "https://files.pythonhosted.org/packages/a6/a8/ed06fe70c8bd03f02ab0c1df020f53f079a6dbae056eba0a91823c0d1242/psygnal-0.11.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:3c04baec10f882cdf784a7312e23892416188417ad85607e6d1de2e8a9e70709", size = 427499 },
+ { url = "https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485", size = 453373 },
+ { url = "https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec", size = 717571 },
+ { url = "https://files.pythonhosted.org/packages/da/7d/24ca61d177b26e6ab89e9c520dca9c6341083920ab0ea8ac763a31b2b029/psygnal-0.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d77f1a71fe9859c0335c87d92afe1b17c520a4137326810e94351839342d8fc7", size = 695336 },
+ { url = "https://files.pythonhosted.org/packages/33/5d/9b2d8f91a9198dda6ad0eaa276f975207b1314ac2d22a2f905f0a6e34524/psygnal-0.11.1-cp312-cp312-macosx_10_16_arm64.whl", hash = "sha256:0b55cb42e468f3a7de75392520778604fef2bc518b7df36c639b35ce4ed92016", size = 425244 },
+ { url = "https://files.pythonhosted.org/packages/c4/66/e1bd57a8efef6582141939876d014f86792adbbb8853bd475a1cbf3649ca/psygnal-0.11.1-cp312-cp312-macosx_10_16_x86_64.whl", hash = "sha256:c7dd3cf809c9c1127d90c6b11fbbd1eb2d66d512ccd4d5cab048786f13d11220", size = 444681 },
+ { url = "https://files.pythonhosted.org/packages/49/ad/8ee3f8ac1d59cf269ae2d55f7cac7c65fe3b3f41cada5d6a17bc2f4c5d6d/psygnal-0.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:885922a6e65ece9ff8ccf2b6810f435ca8067f410889f7a8fffb6b0d61421a0d", size = 743785 },
+ { url = "https://files.pythonhosted.org/packages/14/54/b29b854dff0e27bdaf42a7c1edc65f6d3ea35866e9d9250f1dbabf6381a0/psygnal-0.11.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c2388360a9ffcd1381e9b36d0f794287a270d58e69bf17658a194bbf86685c1", size = 725134 },
+ { url = "https://files.pythonhosted.org/packages/05/bd/134c50dea67e1adf510e89c055bc69ea1e6487dd68af10840c9443a0988d/psygnal-0.11.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c9dde42a2cdf34f9c5fe0cd7515e2ab1524e3207afb37d096733c7a3dcdf388a", size = 433826 },
+ { url = "https://files.pythonhosted.org/packages/b0/f8/db318ba1b1e1e31455e62b83fcf754a97d061ab59a3e1c11c612abe57e48/psygnal-0.11.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c05f474b297e2577506b354132c3fed054f0444ccce6d431f299d3750c2ede4b", size = 462183 },
+ { url = "https://files.pythonhosted.org/packages/bc/0e/8bfb65ad186f36a52b2bfe6193f37f3b792f548d1ccfa302b5859bd8c648/psygnal-0.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:713dfb96a1315378ce9120376d975671ede3133de4985884a43d4b6b332faeee", size = 722929 },
+ { url = "https://files.pythonhosted.org/packages/b5/e3/ae3b178f0c0f9528a9b957f302800d65ddc6fcd47f18724006de6414fa85/psygnal-0.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09c75d21eb090e2ffafb32893bc5d104b98ed237ed64bebccb45cca759c7dcf4", size = 700019 },
+ { url = "https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl", hash = "sha256:04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395", size = 76998 },
+]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
+]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
+]
+
+[[package]]
+name = "pyarrow"
+version = "19.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7b/01/fe1fd04744c2aa038e5a11c7a4adb3d62bce09798695e54f7274b5977134/pyarrow-19.0.0.tar.gz", hash = "sha256:8d47c691765cf497aaeed4954d226568563f1b3b74ff61139f2d77876717084b", size = 1129096 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1c/02/1ad80ffd3c558916858a49c83b6e494a9d93009bbebc603cf0cb8263bea7/pyarrow-19.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c318eda14f6627966997a7d8c374a87d084a94e4e38e9abbe97395c215830e0c", size = 30686262 },
+ { url = "https://files.pythonhosted.org/packages/1b/f0/adab5f142eb8203db8bfbd3a816816e37a85423ae684567e7f3555658315/pyarrow-19.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:62ef8360ff256e960f57ce0299090fb86423afed5e46f18f1225f960e05aae3d", size = 32100005 },
+ { url = "https://files.pythonhosted.org/packages/94/8b/e674083610e5efc48d2f205c568d842cdfdf683d12f9ff0d546e38757722/pyarrow-19.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2795064647add0f16563e57e3d294dbfc067b723f0fd82ecd80af56dad15f503", size = 41144815 },
+ { url = "https://files.pythonhosted.org/packages/d5/fb/2726241a792b7f8a58789e5a63d1be9a5a4059206318fd0ff9485a578952/pyarrow-19.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a218670b26fb1bc74796458d97bcab072765f9b524f95b2fccad70158feb8b17", size = 42180380 },
+ { url = "https://files.pythonhosted.org/packages/7d/09/7aef12446d8e7002dfc07bb7bc71f594c1d5844ca78b364a49f07efb65b1/pyarrow-19.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:66732e39eaa2247996a6b04c8aa33e3503d351831424cdf8d2e9a0582ac54b34", size = 40515021 },
+ { url = "https://files.pythonhosted.org/packages/31/55/f05fc5608cc96060c2b24de505324d641888bd62d4eed2fa1dacd872a1e1/pyarrow-19.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:e675a3ad4732b92d72e4d24009707e923cab76b0d088e5054914f11a797ebe44", size = 42067488 },
+ { url = "https://files.pythonhosted.org/packages/f0/01/097653cec7a944c16313cb748a326771133c142034b252076bd84743b98d/pyarrow-19.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:f094742275586cdd6b1a03655ccff3b24b2610c3af76f810356c4c71d24a2a6c", size = 25276726 },
+ { url = "https://files.pythonhosted.org/packages/82/42/fba3a35bef5833bf88ed35e6a810dc1781236e1d4f808d2df824a7d21819/pyarrow-19.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8e3a839bf36ec03b4315dc924d36dcde5444a50066f1c10f8290293c0427b46a", size = 30711936 },
+ { url = "https://files.pythonhosted.org/packages/88/7a/0da93a3eaaf251a30e32f3221e874263cdcd366c2cd6b7c05293aad91152/pyarrow-19.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ce42275097512d9e4e4a39aade58ef2b3798a93aa3026566b7892177c266f735", size = 32133182 },
+ { url = "https://files.pythonhosted.org/packages/2f/df/fe43b1c50d3100d0de53f988344118bc20362d0de005f8a407454fa565f8/pyarrow-19.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9348a0137568c45601b031a8d118275069435f151cbb77e6a08a27e8125f59d4", size = 41145489 },
+ { url = "https://files.pythonhosted.org/packages/45/bb/6f73b41b342a0342f2516a02db4aa97a4f9569cc35482a5c288090140cd4/pyarrow-19.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0144a712d990d60f7f42b7a31f0acaccf4c1e43e957f7b1ad58150d6f639c1", size = 42177823 },
+ { url = "https://files.pythonhosted.org/packages/23/7b/f038a96f421e453a71bd7a0f78d62b1b2ae9bcac06ed51179ca532e6a0a2/pyarrow-19.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2a1a109dfda558eb011e5f6385837daffd920d54ca00669f7a11132d0b1e6042", size = 40530609 },
+ { url = "https://files.pythonhosted.org/packages/b8/39/a2a6714b471c000e6dd6af4495dce00d7d1332351b8e3170dfb9f91dad1f/pyarrow-19.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:be686bf625aa7b9bada18defb3a3ea3981c1099697239788ff111d87f04cd263", size = 42081534 },
+ { url = "https://files.pythonhosted.org/packages/6c/a3/8396fb06ca05d807e89980c177be26617aad15211ece3184e0caa730b8a6/pyarrow-19.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:239ca66d9a05844bdf5af128861af525e14df3c9591bcc05bac25918e650d3a2", size = 25281090 },
+ { url = "https://files.pythonhosted.org/packages/bc/2e/152885f5ef421e80dae68b9c133ab261934f93a6d5e16b61d79c0ed597fb/pyarrow-19.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:a7bbe7109ab6198688b7079cbad5a8c22de4d47c4880d8e4847520a83b0d1b68", size = 30667964 },
+ { url = "https://files.pythonhosted.org/packages/80/c2/08bbee9a8610a47c9a1466845f405baf53a639ddd947c5133d8ba13544b6/pyarrow-19.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:4624c89d6f777c580e8732c27bb8e77fd1433b89707f17c04af7635dd9638351", size = 32125039 },
+ { url = "https://files.pythonhosted.org/packages/d2/56/06994df823212f5688d3c8bf4294928b12c9be36681872853655724d28c6/pyarrow-19.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b6d3ce4288793350dc2d08d1e184fd70631ea22a4ff9ea5c4ff182130249d9b", size = 41140729 },
+ { url = "https://files.pythonhosted.org/packages/94/65/38ad577c98140a9db71e9e1e594b6adb58a7478a5afec6456a8ca2df7f70/pyarrow-19.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450a7d27e840e4d9a384b5c77199d489b401529e75a3b7a3799d4cd7957f2f9c", size = 42202267 },
+ { url = "https://files.pythonhosted.org/packages/b6/1f/966b722251a7354114ccbb71cf1a83922023e69efd8945ebf628a851ec4c/pyarrow-19.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a08e2a8a039a3f72afb67a6668180f09fddaa38fe0d21f13212b4aba4b5d2451", size = 40505858 },
+ { url = "https://files.pythonhosted.org/packages/3b/5e/6bc81aa7fc9affc7d1c03b912fbcc984ca56c2a18513684da267715dab7b/pyarrow-19.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f43f5aef2a13d4d56adadae5720d1fed4c1356c993eda8b59dace4b5983843c1", size = 42084973 },
+ { url = "https://files.pythonhosted.org/packages/53/c3/2f56da818b6a4758cbd514957c67bd0f078ebffa5390ee2e2bf0f9e8defc/pyarrow-19.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f672f5364b2d7829ef7c94be199bb88bf5661dd485e21d2d37de12ccb78a136", size = 25241976 },
+ { url = "https://files.pythonhosted.org/packages/f5/b9/ba07ed3dd6b6e4f379b78e9c47c50c8886e07862ab7fa6339ac38622d755/pyarrow-19.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:cf3bf0ce511b833f7bc5f5bb3127ba731e97222023a444b7359f3a22e2a3b463", size = 30651291 },
+ { url = "https://files.pythonhosted.org/packages/ad/10/0d304243c8277035298a68a70807efb76199c6c929bb3363c92ac9be6a0d/pyarrow-19.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:4d8b0c0de0a73df1f1bf439af1b60f273d719d70648e898bc077547649bb8352", size = 32100461 },
+ { url = "https://files.pythonhosted.org/packages/8a/61/bcfc5182e11831bca3f849945b9b106e09fd10ded773dff466658e972a45/pyarrow-19.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92aff08e23d281c69835e4a47b80569242a504095ef6a6223c1f6bb8883431d", size = 41132491 },
+ { url = "https://files.pythonhosted.org/packages/8e/87/2915a29049ec352dc69a967fbcbd76b0180319233de0daf8bd368df37099/pyarrow-19.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3b78eff5968a1889a0f3bc81ca57e1e19b75f664d9c61a42a604bf9d8402aae", size = 42192529 },
+ { url = "https://files.pythonhosted.org/packages/48/18/44e5542b2707a8afaf78b5b88c608f261871ae77787eac07b7c679ca6f0f/pyarrow-19.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:b34d3bde38eba66190b215bae441646330f8e9da05c29e4b5dd3e41bde701098", size = 40495363 },
+ { url = "https://files.pythonhosted.org/packages/ba/d6/5096deb7599bbd20bc2768058fe23bc725b88eb41bee58303293583a2935/pyarrow-19.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5418d4d0fab3a0ed497bad21d17a7973aad336d66ad4932a3f5f7480d4ca0c04", size = 42074075 },
+ { url = "https://files.pythonhosted.org/packages/2c/df/e3c839c04c284c9ec3d62b02a8c452b795d9b07b04079ab91ce33484d4c5/pyarrow-19.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e82c3d5e44e969c217827b780ed8faf7ac4c53f934ae9238872e749fa531f7c9", size = 25239803 },
+ { url = "https://files.pythonhosted.org/packages/6a/d3/a6d4088e906c7b5d47792256212606d2ae679046dc750eee0ae167338e5c/pyarrow-19.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f208c3b58a6df3b239e0bb130e13bc7487ed14f39a9ff357b6415e3f6339b560", size = 30695401 },
+ { url = "https://files.pythonhosted.org/packages/94/25/70040fd0e397dd1b937f459eaeeec942a76027357491dca0ada09d1322af/pyarrow-19.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:c751c1c93955b7a84c06794df46f1cec93e18610dcd5ab7d08e89a81df70a849", size = 32104680 },
+ { url = "https://files.pythonhosted.org/packages/4e/f9/92783290cc0d80ca16d34b0c126305bfacca4b87dd889c8f16c6ef2a8fd7/pyarrow-19.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b903afaa5df66d50fc38672ad095806443b05f202c792694f3a604ead7c6ea6e", size = 41076754 },
+ { url = "https://files.pythonhosted.org/packages/05/46/2c9870f50a495c72e2b8982ae29a9b1680707ea936edc0de444cec48f875/pyarrow-19.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22a4bc0937856263df8b94f2f2781b33dd7f876f787ed746608e06902d691a5", size = 42163133 },
+ { url = "https://files.pythonhosted.org/packages/7b/2f/437922b902549228fb15814e8a26105bff2787ece466a8d886eb6699efad/pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:5e8a28b918e2e878c918f6d89137386c06fe577cd08d73a6be8dafb317dc2d73", size = 40452210 },
+ { url = "https://files.pythonhosted.org/packages/36/ef/1d7975053af9d106da973bac142d0d4da71b7550a3576cc3e0b3f444d21a/pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89", size = 42077618 },
+ { url = "https://files.pythonhosted.org/packages/59/13/e39417005ee632e131d0246cf5c1149618a55554ccdf2a4d887065e672a7/pyarrow-19.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c0423393e4a07ff6fea08feb44153302dd261d0551cc3b538ea7a5dc853af43a", size = 30698254 },
+ { url = "https://files.pythonhosted.org/packages/06/87/1f9d7df296dd5c065e52ae3e9070dfe611f6bd97e90f28b6a45c410dcb67/pyarrow-19.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:718947fb6d82409013a74b176bf93e0f49ef952d8a2ecd068fecd192a97885b7", size = 32114467 },
+ { url = "https://files.pythonhosted.org/packages/b2/b1/9e7babf5d469bd35f1d062a04721ead72456101f6d851a2e8a43bb07a580/pyarrow-19.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1c162c4660e0978411a4761f91113dde8da3433683efa473501254563dcbe8", size = 41157781 },
+ { url = "https://files.pythonhosted.org/packages/9f/25/fa8e882a6c06e6d8dd640d3acce3912d7c39358940eb0c7b3c8b962457d0/pyarrow-19.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c73268cf557e688efb60f1ccbc7376f7e18cd8e2acae9e663e98b194c40c1a2d", size = 42190773 },
+ { url = "https://files.pythonhosted.org/packages/b8/d6/7fd60aa79cada815306d9804403386b06893ef63e73876174717a62002c4/pyarrow-19.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:edfe6d3916e915ada9acc4e48f6dafca7efdbad2e6283db6fd9385a1b23055f1", size = 40528310 },
+ { url = "https://files.pythonhosted.org/packages/0e/f1/c1ec7620a5768b8c7f9083572fda7b05b77ea083c3400fbd9e4ae40e63bd/pyarrow-19.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:da410b70a7ab8eb524112f037a7a35da7128b33d484f7671a264a4c224ac131d", size = 42080774 },
+ { url = "https://files.pythonhosted.org/packages/c4/28/c51c9af2703b5a592d1b66546611b24de8ca01e04c3f5da769c3318bca6c/pyarrow-19.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:597360ffc71fc8cceea1aec1fb60cb510571a744fffc87db33d551d5de919bec", size = 25464978 },
+]
+
+[[package]]
+name = "pyarrow-stubs"
+version = "17.14"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyarrow" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c2/4e/670cdad3694eb81d28936e69cacbe3775a71a86e10d49fb96ea7196eeb8b/pyarrow_stubs-17.14.tar.gz", hash = "sha256:278bad474eeaa0a300d030b0f85a4be335878c31d5dc8a836e695b24114e074e", size = 83437 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/db/ab/48a2edaa1748483786d34802110c3099f5bbf77f38b8670d3deb0d50e5be/pyarrow_stubs-17.14-py3-none-any.whl", hash = "sha256:bfebf760db2154cdb2c0fcb0e43024056d6f5a6f0b96b85a039ab224a13b43c8", size = 79854 },
+]
+
+[[package]]
+name = "pycparser"
+version = "2.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
+]
+
+[[package]]
+name = "pydata-sphinx-theme"
+version = "0.16.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "accessible-pygments" },
+ { name = "babel" },
+ { name = "beautifulsoup4" },
+ { name = "docutils" },
+ { name = "pygments" },
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", size = 2412693 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl", hash = "sha256:225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde", size = 6723264 },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
+]
+
+[[package]]
+name = "pyogrio"
+version = "0.10.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "packaging" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a5/8f/5a784595524a79c269f2b1c880f4fdb152867df700c97005dda51997da02/pyogrio-0.10.0.tar.gz", hash = "sha256:ec051cb568324de878828fae96379b71858933413e185148acb6c162851ab23c", size = 281950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/ea/cba24d241858a72b58d8fcd0ad2276f9631fd4528b3062157637e43581eb/pyogrio-0.10.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:046eeeae12a03a3ebc3dc5ff5a87664e4f5fc0a4fb1ea5d5c45d547fa941072b", size = 15083657 },
+ { url = "https://files.pythonhosted.org/packages/90/f8/a58795a2aee415c612aac8b425681d932b8983330884207fd1915d234d36/pyogrio-0.10.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:44380f4d9245c776f432526e29ce4d29238aea26adad991803c4f453474f51d3", size = 16457115 },
+ { url = "https://files.pythonhosted.org/packages/45/86/74c37e3d4d000bdcd91b25929fe4abc5ad6d93d5f5fbc59a4c7d4f0ed982/pyogrio-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14fd3b72b4e2dc59e264607b265c742b0c5ec2ea9e748b115f742381b28dd373", size = 23721911 },
+ { url = "https://files.pythonhosted.org/packages/a6/07/35e4127a878ecdcbaaf46f0f2d068b385a454b5b0cab44ea901adc5888a0/pyogrio-0.10.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:1fea7892f4633cab04d13563e47ec2e87dc2b5cd71b9546018d123184528c151", size = 22941003 },
+ { url = "https://files.pythonhosted.org/packages/56/8b/67187ae03dce5cd6f5c5a2f41c405e77059f4cf498e0817b69cec094f022/pyogrio-0.10.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3539596a76eb8a9d166d6f9d3f36731a8c5bd5c43901209d89dc66b9dc00f079", size = 23861913 },
+ { url = "https://files.pythonhosted.org/packages/75/ca/b31083da2e6c4b598b6609a98c655977189fe8982c36d98ea4789a938045/pyogrio-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:eac90b2501656892c63bc500c12e71f3dbf7d66ddc5a7fb05cd480d25d1b7022", size = 16171065 },
+ { url = "https://files.pythonhosted.org/packages/8d/2c/c761e6adeb81bd4029a137b3240e7214a8c9aaf225883356196afd6ef9d8/pyogrio-0.10.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5b1a51431a27a1cb3e4e19558939c1423106e06e7b67d6285f4fba9c2d0a91b9", size = 15083526 },
+ { url = "https://files.pythonhosted.org/packages/c3/e5/983aa9ddf2ff784e973d6b2ec3e874065d6655a5329ca26311b0f3b9f92f/pyogrio-0.10.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:216d69cd77b2b4a0c9d7d449bc239f8b77f3d73f4a05d9c738a0745b236902d8", size = 16457867 },
+ { url = "https://files.pythonhosted.org/packages/fa/9a/7103eee7aa3b6ec88e072ef18a05c3aae1ed96fe00009a7a5ce139b50f30/pyogrio-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2f0b75f0077ce33256aec6278c2a9c3b79bf0637ddf4f93d3ab2609f0501d96", size = 23926332 },
+ { url = "https://files.pythonhosted.org/packages/8b/b2/2ca124343aba24b9a5dcd7c1f43da81e652849cfaf3110d3f507a80af0a1/pyogrio-0.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0a47f702d29808c557d2ebea8542c23903f021eae44e16838adef2ab4281c71b", size = 23138693 },
+ { url = "https://files.pythonhosted.org/packages/ae/15/501aa4823c142232169d54255ab343f28c4ea9e7fa489b8433dcc873a942/pyogrio-0.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:11e6c71d12da6b445e77d0fc0198db1bd35a77e03a0685e45338cbab9ce02add", size = 24062952 },
+ { url = "https://files.pythonhosted.org/packages/94/8d/24f21e6a93ca418231aee3bddade7a0766c89c523832f29e08a8860f83e6/pyogrio-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0d74e91a9c0ff2f9abe01b556ff663977193b2d6922208406172d0fc833beff", size = 16172573 },
+ { url = "https://files.pythonhosted.org/packages/b5/b5/3c5dfd0b50cbce6f3d4e42c0484647feb1809dbe20e225c4c6abd067e69f/pyogrio-0.10.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d6558b180e020f71ab7aa7f82d592ed3305c9f698d98f6d0a4637ec7a84c4ce", size = 15079211 },
+ { url = "https://files.pythonhosted.org/packages/b8/9a/1ba9c707a094976f343bd0177741eaba0e842fa05ecd8ab97192db4f2ec1/pyogrio-0.10.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:a99102037eead8ba491bc57825c1e395ee31c9956d7bff7b4a9e4fdbff3a13c2", size = 16442782 },
+ { url = "https://files.pythonhosted.org/packages/5e/bb/b4250746c2c85fea5004cae93e9e25ad01516e9e94e04de780a2e78139da/pyogrio-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a4c373281d7cbf560c5b61f8f3c7442103ad7f1c7ac4ef3a84572ed7a5dd2f6", size = 23899832 },
+ { url = "https://files.pythonhosted.org/packages/bd/4c/79e47e40a8e54e79a45133786a0a58209534f580591c933d40c5ed314fe7/pyogrio-0.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:19f18411bdf836d24cdc08b9337eb3ec415e4ac4086ba64516b36b73a2e88622", size = 23081469 },
+ { url = "https://files.pythonhosted.org/packages/47/78/2b62c8a340bcb0ea56b9ddf2ef5fd3d1f101dc0e98816b9e6da87c5ac3b7/pyogrio-0.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1abbcdd9876f30bebf1df8a0273f6cdeb29d03259290008275c7fddebe139f20", size = 24024758 },
+ { url = "https://files.pythonhosted.org/packages/43/97/34605480f06b0ad9611bf58a174eccc6f3673275f3d519cf763391892881/pyogrio-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc", size = 16160294 },
+ { url = "https://files.pythonhosted.org/packages/14/4a/4c8e4f5b9edbca46e0f8d6c1c0b56c0d4af0900c29f4bea22d37853c07f3/pyogrio-0.10.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c90478209537a31dcc65664a87a04c094bb0e08efe502908a6682b8cec0259bf", size = 15076879 },
+ { url = "https://files.pythonhosted.org/packages/5f/be/7db0644eef9ef3382518399aaf3332827c43018112d2a74f78784fd496ec/pyogrio-0.10.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:fec45e1963b7058e5a1aa98598aed07c0858512c833d6aad2c672c3ec98bbf04", size = 16440405 },
+ { url = "https://files.pythonhosted.org/packages/96/77/f199230ba86fe88b1f57e71428c169ed982de68a32d6082cd7c12d0f5d55/pyogrio-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28cb139f8a5d0365ede602230104b407ae52bb6b55173c8d5a35424d28c4a2c5", size = 23871511 },
+ { url = "https://files.pythonhosted.org/packages/25/ac/ca483bec408b59c54f7129b0244cc9de21d8461aefe89ece7bd74ad33807/pyogrio-0.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:cea0187fcc2d574e52af8cfab041fa0a7ad71d5ef6b94b49a3f3d2a04534a27e", size = 23048830 },
+ { url = "https://files.pythonhosted.org/packages/d7/3e/c35f2d8dad95b24e568c468f09ff60fb61945065465e0ec7868400596566/pyogrio-0.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:7c02b207ea8cf09c501ea3e95d29152781a00d3c32267286bc36fa457c332205", size = 23996873 },
+ { url = "https://files.pythonhosted.org/packages/27/5d/0deb16d228362a097ee3258d0a887c9c0add4b9678bb4847b08a241e124d/pyogrio-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:02e54bcfb305af75f829044b0045f74de31b77c2d6546f7aaf96822066147848", size = 16158260 },
+ { url = "https://files.pythonhosted.org/packages/ec/fe/ea995a55289a4c378a29130435a400d577bd151a518a5238fd5bc21fe09f/pyogrio-0.10.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ea96a1338ed7991735b955d3f84ad5f71b3bc070b6a7a42449941aedecc71768", size = 15083868 },
+ { url = "https://files.pythonhosted.org/packages/07/1d/1bc2162a7d1cef13edcf645e562d047742dad68c4e933b757d4cf2837b00/pyogrio-0.10.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:32d349600561459791a43f528a92f3e9343a59bdc9bc30b1be9376f0b80cbf16", size = 16457256 },
+ { url = "https://files.pythonhosted.org/packages/20/7a/56ef1f49388244b5d9e4f22db58745fd329f441f87af71fce0bbd6ddd894/pyogrio-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82f7bd6a87bd2e9484bcb4c87ab94eee4c2f573ad148707431c8b341d7f13d99", size = 23716062 },
+ { url = "https://files.pythonhosted.org/packages/1d/9f/3bb9a15fbe5f66907f957310b0f6d7191dfbfd9d9b31a361053d8d763bd5/pyogrio-0.10.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6166ae81462c257ed8e151c404e316642703813cf771c95ef8e11dcdf2581e47", size = 22931000 },
+ { url = "https://files.pythonhosted.org/packages/76/9b/8974f77ded5661522023cfb7898d7851f9b1056f4bbaacc4de2812dbf7fd/pyogrio-0.10.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:22d57495e835fe51b88da43dfbda606c07e1f6c3b849af0c3cfc18e17467641c", size = 23854562 },
+ { url = "https://files.pythonhosted.org/packages/f8/14/aff4499cc544a02343043a16322b51dcc0ca947d21a96b7aacb1dd1b8e3a/pyogrio-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:eea82171bfc07fc778b8dc87b0cdc9ac06c389bc56b0c0b6f34bf9e45fb78c0e", size = 16172207 },
+]
+
+[[package]]
+name = "pyproj"
+version = "3.6.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+dependencies = [
+ { name = "certifi", marker = "python_full_version < '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7d/84/2b39bbf888c753ea48b40d47511548c77aa03445465c35cc4c4e9649b643/pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf", size = 225131 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c5/32/63cf474f4a8d4804b3bdf7c16b8589f38142e8e2f8319dcea27e0bc21a87/pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4", size = 6142763 },
+ { url = "https://files.pythonhosted.org/packages/18/86/2e7cb9de40492f1bafbf11f4c9072edc394509a40b5e4c52f8139546f039/pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe", size = 4877123 },
+ { url = "https://files.pythonhosted.org/packages/5e/c5/928d5a26995dbefbebd7507d982141cd9153bc7e4392b334fff722c4af12/pyproj-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5279586013b8d6582e22b6f9e30c49796966770389a9d5b85e25a4223286cd3f", size = 6190576 },
+ { url = "https://files.pythonhosted.org/packages/f6/2b/b60cf73b0720abca313bfffef34e34f7f7dae23852b2853cf0368d49426b/pyproj-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fafd1f3eb421694857f254a9bdbacd1eb22fc6c24ca74b136679f376f97d35", size = 8328075 },
+ { url = "https://files.pythonhosted.org/packages/d9/a8/7193f46032636be917bc775506ae987aad72c931b1f691b775ca812a2917/pyproj-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c41e80ddee130450dcb8829af7118f1ab69eaf8169c4bf0ee8d52b72f098dc2f", size = 5635713 },
+ { url = "https://files.pythonhosted.org/packages/89/8f/27350c8fba71a37cd0d316f100fbd96bf139cc2b5ff1ab0dcbc7ac64010a/pyproj-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:db3aedd458e7f7f21d8176f0a1d924f1ae06d725228302b872885a1c34f3119e", size = 6087932 },
+ { url = "https://files.pythonhosted.org/packages/84/a6/a300c1b14b2112e966e9f90b18f9c13b586bdcf417207cee913ae9005da3/pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882", size = 6147442 },
+ { url = "https://files.pythonhosted.org/packages/30/bd/b9bd3761f08754e8dbb34c5a647db2099b348ab5da338e90980caf280e37/pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a", size = 4880331 },
+ { url = "https://files.pythonhosted.org/packages/f4/0a/d82aeeb605b5d6870bc72307c3b5e044e632eb7720df8885e144f51a8eac/pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85", size = 6192425 },
+ { url = "https://files.pythonhosted.org/packages/64/90/dfe5c00de1ca4dbb82606e79790659d4ed7f0ed8d372bccb3baca2a5abe0/pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915", size = 8571478 },
+ { url = "https://files.pythonhosted.org/packages/14/6d/ae373629a1723f0db80d7b8c93598b00d9ecb930ed9ebf4f35826a33e97c/pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132", size = 5634575 },
+ { url = "https://files.pythonhosted.org/packages/79/95/eb68113c5b5737c342bde1bab92705dabe69c16299c5a122616e50f1fbd6/pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2", size = 6088494 },
+ { url = "https://files.pythonhosted.org/packages/0b/64/93232511a7906a492b1b7dfdfc17f4e95982d76a24ef4f86d18cfe7ae2c9/pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746", size = 6135280 },
+ { url = "https://files.pythonhosted.org/packages/10/f2/b550b1f65cc7e51c9116b220b50aade60c439103432a3fd5b12efbc77e15/pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8", size = 4880030 },
+ { url = "https://files.pythonhosted.org/packages/fe/4b/2f8f6f94643b9fe2083338eff294feda84d916409b5840b7a402d2be93f8/pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf", size = 6184439 },
+ { url = "https://files.pythonhosted.org/packages/19/9b/c57569132174786aa3f72275ac306956859a639dad0ce8d95c8411ce8209/pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d", size = 8660747 },
+ { url = "https://files.pythonhosted.org/packages/0e/ab/1c2159ec757677c5a6b8803f6be45c2b550dc42c84ec4a228dc219849bbb/pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb", size = 5626805 },
+ { url = "https://files.pythonhosted.org/packages/c7/f3/2f32fe143cd7ba1d4d68f1b6dce9ca402d909cbd5a5830e3a8fa3d1acbbf/pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0", size = 6079779 },
+ { url = "https://files.pythonhosted.org/packages/d7/50/d369bbe62d7a0d1e2cb40bc211da86a3f6e0f3c99f872957a72c3d5492d6/pyproj-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ba1f9b03d04d8cab24d6375609070580a26ce76eaed54631f03bab00a9c737b", size = 6144755 },
+ { url = "https://files.pythonhosted.org/packages/2c/c2/8d4f61065dfed965e53badd41201ad86a05af0c1bbc75dffb12ef0f5a7dd/pyproj-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18faa54a3ca475bfe6255156f2f2874e9a1c8917b0004eee9f664b86ccc513d3", size = 4879187 },
+ { url = "https://files.pythonhosted.org/packages/31/38/2cf8777cb2d5622a78195e690281b7029098795fde4751aec8128238b8bb/pyproj-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd43bd9a9b9239805f406fd82ba6b106bf4838d9ef37c167d3ed70383943ade1", size = 6192339 },
+ { url = "https://files.pythonhosted.org/packages/97/0a/b1525be9680369cc06dd288e12c59d24d5798b4afcdcf1b0915836e1caa6/pyproj-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50100b2726a3ca946906cbaa789dd0749f213abf0cbb877e6de72ca7aa50e1ae", size = 8332638 },
+ { url = "https://files.pythonhosted.org/packages/8d/e8/e826e0a962f36bd925a933829cf6ef218efe2055db5ea292be40974a929d/pyproj-3.6.1-cp39-cp39-win32.whl", hash = "sha256:9274880263256f6292ff644ca92c46d96aa7e57a75c6df3f11d636ce845a1877", size = 5638159 },
+ { url = "https://files.pythonhosted.org/packages/43/d0/cbe29a4dcf38ee7e72bf695d0d3f2bee21b4f22ee6cf579ad974de9edfc8/pyproj-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:36b64c2cb6ea1cc091f329c5bd34f9c01bb5da8c8e4492c709bda6a09f96808f", size = 6090565 },
+ { url = "https://files.pythonhosted.org/packages/43/28/e8d2ca71dd56c27cbe668e4226963d61956cded222a2e839e6fec1ab6d82/pyproj-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd93c1a0c6c4aedc77c0fe275a9f2aba4d59b8acf88cebfc19fe3c430cfabf4f", size = 6034252 },
+ { url = "https://files.pythonhosted.org/packages/cb/39/1ce27cb86f51a1f5aed3a1617802a6131b59ea78492141d1fbe36722595e/pyproj-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6420ea8e7d2a88cb148b124429fba8cd2e0fae700a2d96eab7083c0928a85110", size = 6386263 },
+]
+
+[[package]]
+name = "pyproj"
+version = "3.7.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+dependencies = [
+ { name = "certifi", marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/47/c2/0572c8e31aebf0270f15f3368adebd10fc473de9f09567a0743a3bc41c8d/pyproj-3.7.0.tar.gz", hash = "sha256:bf658f4aaf815d9d03c8121650b6f0b8067265c36e31bc6660b98ef144d81813", size = 225577 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e4/fa/8a769da6bb8e26b1028c19d048b88373a40bd8e17a893e07b9889d1aed03/pyproj-3.7.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d5c7e7d24b967e328a5efd013f466804a1f226d1106ac7efc47dcc99360dbc8f", size = 6270121 },
+ { url = "https://files.pythonhosted.org/packages/82/65/ee312dc4cdd2499cc5984144e05c582604afd76ba01289d89d74b50ab654/pyproj-3.7.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:448958c46bd3fe2da91c89ba551ac5835e63073ca861422c6eb1af89979dfab1", size = 4633387 },
+ { url = "https://files.pythonhosted.org/packages/f8/0d/d300194f021e3d56b30bb45bd19447bb00761c62f5342371bd389b774f82/pyproj-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f673ca345bb92afc93d4235938ca0c9a76237aa7addf42a95965c8dc8cad9b49", size = 6330358 },
+ { url = "https://files.pythonhosted.org/packages/52/30/c82c12cea9a5c17fac146212cd914ec587f646eef91986dcb7f629fe0f7f/pyproj-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee60895f60cbd1a9c903ab2bc22adea63004296a1c28b8775a11cf50905cf085", size = 9227537 },
+ { url = "https://files.pythonhosted.org/packages/09/94/34bd5a5e637e8839beb17cc09410785bad24098ef01e52f66fe32bcf74fa/pyproj-3.7.0-cp310-cp310-win32.whl", hash = "sha256:0dd31b0740ee010934234f848d2d092c66146cb8d0ba009a64e41d192caa7686", size = 5822094 },
+ { url = "https://files.pythonhosted.org/packages/9e/04/33835c6ca0edf266b56495555c375994c42f914eb65a639b363d6f2c47f9/pyproj-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:7943d85ba39e89c51b920339ff63162d63bf89da161f0acb6206b0d39b11661e", size = 6230436 },
+ { url = "https://files.pythonhosted.org/packages/e2/8f/15ff6ab10a08050e94afcd544962a1a930d0bb7ca102ad39795a847eb340/pyproj-3.7.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:e66d8d42dbdf232e121546c5a1dec097caf0454e4885c09a8e03cdcee0753c03", size = 6272213 },
+ { url = "https://files.pythonhosted.org/packages/2d/4d/610fe2a17de71b4fe210af69ce25f2d65379ba0a48299129894d0d0988ee/pyproj-3.7.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7764b64a0aefe40134a2828b3a40be88f6c8b7832c45d8a9f2bd592ace4b2a3b", size = 4634548 },
+ { url = "https://files.pythonhosted.org/packages/d6/27/0327d0b0fcdfc4cf72696a2effca2963e524dcd846a0274ba503f8bf2648/pyproj-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53c442c5081dc95346996f5c4323fde2caafc69c6e60b4707aa46e88244f1e04", size = 6333913 },
+ { url = "https://files.pythonhosted.org/packages/3c/e5/2cb256148c730b9c3f74bfb3c03904f5070499c6dcaea153073a9642c6c6/pyproj-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc5b305d4d5d7697885681d9b660623e328227612823d5c660e0a9566cb48838", size = 9460363 },
+ { url = "https://files.pythonhosted.org/packages/ba/a3/4aa1e8e78ad18aa170efd2c94c1931bf2a34c526683b874d06e40fa323f6/pyproj-3.7.0-cp311-cp311-win32.whl", hash = "sha256:de2b47d748dc41cccb6b3b713d4d7dc9aa1046a82141c8665026908726426abc", size = 5820551 },
+ { url = "https://files.pythonhosted.org/packages/26/0c/b084e8839a117eaad8cb4fbaa81bbb24c6f183de0ee95c6c4e2770ab6f09/pyproj-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:38cba7c4c5679e40242dd959133e95b908d3b912dd66291094fd13510e8517ff", size = 6231788 },
+ { url = "https://files.pythonhosted.org/packages/bd/19/be806b711e9ebfb80411c653054157db128fffdd7f8493e3064136c8d880/pyproj-3.7.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:8cbec92bdd6e9933ca08795c12717d1384e9b51cf4b1acf0d753db255a75c51e", size = 6261400 },
+ { url = "https://files.pythonhosted.org/packages/99/3b/8497995e8cae0049d013679c6a7ac6c57b816d590c733a388748dafe5af5/pyproj-3.7.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8c4a8e4d3ba76c3adac3c087544cf92f7f9a19ea34946904a13fca48cc1c0106", size = 4637848 },
+ { url = "https://files.pythonhosted.org/packages/ea/f7/2a5b46d6f8da913d58d44942ab06ca4803b5424b73259b15344cf90040f6/pyproj-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82624fb42aa31f6b1a860fbc0316babd07fd712642bc31022df4e9b4056bf463", size = 6324856 },
+ { url = "https://files.pythonhosted.org/packages/36/83/c257771077bcf9da20d0e97abc834f9037c219986cc76d40183903a30464/pyproj-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1bbb3f89c68d4a6835c40b2da8b27680eec60e8cc7cdb08c09bcc725b2b62", size = 9525831 },
+ { url = "https://files.pythonhosted.org/packages/d6/50/a635de79def69fe03cdef3a4bd3bec780c30987bce3a15dd7099afb2506f/pyproj-3.7.0-cp312-cp312-win32.whl", hash = "sha256:952515d5592167ad4436b355485f82acebed2a49b46722159e4584b75a763dd3", size = 5811864 },
+ { url = "https://files.pythonhosted.org/packages/a1/8b/96bc8c8f3eca4eb7fa3758fde0b755d1df30a19f494376e3ee8de1ef4e79/pyproj-3.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0692f806224e8ed82fe4acfa57268ff444fdaf9f330689f24c0d96e59480cce1", size = 6224720 },
+ { url = "https://files.pythonhosted.org/packages/bf/da/a17c452bea1ff4cd58d6dc573055b9c8fb6af114b7d2c694782aec770865/pyproj-3.7.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:94e8b903a9e83448fd2379c49dec3e8cd83c9ed36f54354e68b601cef56d5426", size = 6254898 },
+ { url = "https://files.pythonhosted.org/packages/c2/31/ab07b389f2caa527c95ab2ea1940d28879bd2a19e67b2529cb3e94648d26/pyproj-3.7.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:64cb5c17d6f6305a8b978a40f95560c87c5b363fcac40632337955664437875a", size = 4628612 },
+ { url = "https://files.pythonhosted.org/packages/1d/24/def3ded6529db3e3d8351ad73481730249ab57d8d876d502f86d7958ce06/pyproj-3.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c54e9bdda7ab9c4a5af50f9d6e6ee7704e05fafd504896b96ed1208c7aea098", size = 6315895 },
+ { url = "https://files.pythonhosted.org/packages/dd/14/07314f78302105d199fb25e73376d723efe9c2ef3906463aae209913a6d3/pyproj-3.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24fa4e9e0abba875f9524808410cc520067eaf38fd5549ed0ef7c43ac39923c9", size = 9466144 },
+ { url = "https://files.pythonhosted.org/packages/00/f2/2a116920db3496e3ff3c94d7d8d15da41374f35cfe1b9e79682eca500a61/pyproj-3.7.0-cp313-cp313-win32.whl", hash = "sha256:b9e8353fc3c79dc14d1f5ac758a1a6e4eee04102c3c0b138670f121f5ac52eb4", size = 5807180 },
+ { url = "https://files.pythonhosted.org/packages/f8/33/3c8c6302717096b54aa14ccbb271045ba04629e21cbf348f2f2dc94f69b4/pyproj-3.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:10a8dc6ec61af97c89ff032647d743f8dc023645773da42ef43f7ae1125b3509", size = 6218036 },
+]
+
+[[package]]
+name = "pytest"
+version = "8.3.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
+]
+
+[[package]]
+name = "pytest-cov"
+version = "6.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "coverage", extra = ["toml"] },
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 },
+]
+
+[[package]]
+name = "pytest-xdist"
+version = "3.6.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "execnet" },
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/41/c4/3c310a19bc1f1e9ef50075582652673ef2bfc8cd62afef9585683821902f/pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d", size = 84060 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", size = 46108 },
+]
+
+[package.optional-dependencies]
+psutil = [
+ { name = "psutil" },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
+]
+
+[[package]]
+name = "pytz"
+version = "2024.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
+]
+
+[[package]]
+name = "pywin32"
+version = "308"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/72/a6/3e9f2c474895c1bb61b11fa9640be00067b5c5b363c501ee9c3fa53aec01/pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", size = 5927028 },
+ { url = "https://files.pythonhosted.org/packages/d9/b4/84e2463422f869b4b718f79eb7530a4c1693e96b8a4e5e968de38be4d2ba/pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", size = 6558484 },
+ { url = "https://files.pythonhosted.org/packages/9f/8f/fb84ab789713f7c6feacaa08dad3ec8105b88ade8d1c4f0f0dfcaaa017d6/pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", size = 7971454 },
+ { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 },
+ { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 },
+ { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 },
+ { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 },
+ { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 },
+ { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 },
+ { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 },
+ { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 },
+ { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 },
+ { url = "https://files.pythonhosted.org/packages/a8/41/ead05a7657ffdbb1edabb954ab80825c4f87a3de0285d59f8290457f9016/pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341", size = 5991824 },
+ { url = "https://files.pythonhosted.org/packages/e4/cd/0838c9a6063bff2e9bac2388ae36524c26c50288b5d7b6aebb6cdf8d375d/pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920", size = 6640327 },
+]
+
+[[package]]
+name = "pywin32-ctypes"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 },
+ { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 },
+ { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 },
+ { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 },
+ { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 },
+ { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 },
+ { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 },
+ { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 },
+ { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 },
+ { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 },
+ { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 },
+ { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 },
+ { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 },
+ { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 },
+ { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 },
+ { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 },
+ { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 },
+ { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 },
+ { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 },
+ { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 },
+ { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 },
+ { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 },
+ { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 },
+ { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 },
+ { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 },
+ { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 },
+ { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 },
+ { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 },
+ { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 },
+ { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 },
+ { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 },
+ { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 },
+ { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 },
+ { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 },
+ { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 },
+ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
+ { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777 },
+ { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318 },
+ { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891 },
+ { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614 },
+ { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360 },
+ { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006 },
+ { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577 },
+ { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593 },
+ { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312 },
+]
+
+[[package]]
+name = "pyzmq"
+version = "26.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "implementation_name == 'pypy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1f/a8/9837c39aba390eb7d01924ace49d761c8dbe7bc2d6082346d00c8332e431/pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", size = 1340058 },
+ { url = "https://files.pythonhosted.org/packages/a2/1f/a006f2e8e4f7d41d464272012695da17fb95f33b54342612a6890da96ff6/pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", size = 1008818 },
+ { url = "https://files.pythonhosted.org/packages/b6/09/b51b6683fde5ca04593a57bbe81788b6b43114d8f8ee4e80afc991e14760/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", size = 673199 },
+ { url = "https://files.pythonhosted.org/packages/c9/78/486f3e2e824f3a645238332bf5a4c4b4477c3063033a27c1e4052358dee2/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", size = 911762 },
+ { url = "https://files.pythonhosted.org/packages/5e/3b/2eb1667c9b866f53e76ee8b0c301b0469745a23bd5a87b7ee3d5dd9eb6e5/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", size = 868773 },
+ { url = "https://files.pythonhosted.org/packages/16/29/ca99b4598a9dc7e468b5417eda91f372b595be1e3eec9b7cbe8e5d3584e8/pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", size = 868834 },
+ { url = "https://files.pythonhosted.org/packages/ad/e5/9efaeb1d2f4f8c50da04144f639b042bc52869d3a206d6bf672ab3522163/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", size = 1202861 },
+ { url = "https://files.pythonhosted.org/packages/c3/62/c721b5608a8ac0a69bb83cbb7d07a56f3ff00b3991a138e44198a16f94c7/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", size = 1515304 },
+ { url = "https://files.pythonhosted.org/packages/87/84/e8bd321aa99b72f48d4606fc5a0a920154125bd0a4608c67eab742dab087/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", size = 1414712 },
+ { url = "https://files.pythonhosted.org/packages/cd/cd/420e3fd1ac6977b008b72e7ad2dae6350cc84d4c5027fc390b024e61738f/pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", size = 578113 },
+ { url = "https://files.pythonhosted.org/packages/5c/57/73930d56ed45ae0cb4946f383f985c855c9b3d4063f26416998f07523c0e/pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", size = 641631 },
+ { url = "https://files.pythonhosted.org/packages/61/d2/ae6ac5c397f1ccad59031c64beaafce7a0d6182e0452cc48f1c9c87d2dd0/pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", size = 543528 },
+ { url = "https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", size = 1340639 },
+ { url = "https://files.pythonhosted.org/packages/98/4d/5000468bd64c7910190ed0a6c76a1ca59a68189ec1f007c451dc181a22f4/pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", size = 1008710 },
+ { url = "https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", size = 673129 },
+ { url = "https://files.pythonhosted.org/packages/86/94/99085a3f492aa538161cbf27246e8886ff850e113e0c294a5b8245f13b52/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", size = 910107 },
+ { url = "https://files.pythonhosted.org/packages/31/1d/346809e8a9b999646d03f21096428453465b1bca5cd5c64ecd048d9ecb01/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", size = 867960 },
+ { url = "https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", size = 869204 },
+ { url = "https://files.pythonhosted.org/packages/0f/f9/18417771dee223ccf0f48e29adf8b4e25ba6d0e8285e33bcbce078070bc3/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", size = 1203351 },
+ { url = "https://files.pythonhosted.org/packages/e0/46/f13e67fe0d4f8a2315782cbad50493de6203ea0d744610faf4d5f5b16e90/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", size = 1514204 },
+ { url = "https://files.pythonhosted.org/packages/50/11/ddcf7343b7b7a226e0fc7b68cbf5a5bb56291fac07f5c3023bb4c319ebb4/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", size = 1414339 },
+ { url = "https://files.pythonhosted.org/packages/01/14/1c18d7d5b7be2708f513f37c61bfadfa62161c10624f8733f1c8451b3509/pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", size = 576928 },
+ { url = "https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", size = 642317 },
+ { url = "https://files.pythonhosted.org/packages/98/77/1cbfec0358078a4c5add529d8a70892db1be900980cdb5dd0898b3d6ab9d/pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", size = 543834 },
+ { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 },
+ { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 },
+ { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 },
+ { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 },
+ { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 },
+ { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 },
+ { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 },
+ { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 },
+ { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 },
+ { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 },
+ { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 },
+ { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 },
+ { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 },
+ { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 },
+ { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 },
+ { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 },
+ { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 },
+ { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 },
+ { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 },
+ { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 },
+ { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 },
+ { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 },
+ { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 },
+ { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 },
+ { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 },
+ { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 },
+ { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 },
+ { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 },
+ { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 },
+ { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 },
+ { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 },
+ { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 },
+ { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 },
+ { url = "https://files.pythonhosted.org/packages/ac/9e/ad5fbbe1bcc7a9d1e8c5f4f7de48f2c1dc481e151ef80cc1ce9a7fe67b55/pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2", size = 1341256 },
+ { url = "https://files.pythonhosted.org/packages/4c/d9/d7a8022108c214803a82b0b69d4885cee00933d21928f1f09dca371cf4bf/pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c", size = 1009385 },
+ { url = "https://files.pythonhosted.org/packages/ed/69/0529b59ac667ea8bfe8796ac71796b688fbb42ff78e06525dabfed3bc7ae/pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98", size = 908009 },
+ { url = "https://files.pythonhosted.org/packages/6e/bd/3ff3e1172f12f55769793a3a334e956ec2886805ebfb2f64756b6b5c6a1a/pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9", size = 862078 },
+ { url = "https://files.pythonhosted.org/packages/c3/ec/ab13585c3a1f48e2874253844c47b194d56eb25c94718691349c646f336f/pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db", size = 673756 },
+ { url = "https://files.pythonhosted.org/packages/1e/be/febcd4b04dd50ee6d514dfbc33a3d5d9cb38ec9516e02bbfc929baa0f141/pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073", size = 1203684 },
+ { url = "https://files.pythonhosted.org/packages/16/28/304150e71afd2df3b82f52f66c0d8ab9ac6fe1f1ffdf92bad4c8cc91d557/pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc", size = 1515864 },
+ { url = "https://files.pythonhosted.org/packages/18/89/8d48d8cd505c12a1f5edee597cc32ffcedc65fd8d2603aebaaedc38a7041/pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940", size = 1415383 },
+ { url = "https://files.pythonhosted.org/packages/d4/7e/43a60c3b179f7da0cbc2b649bd2702fd6a39bff5f72aa38d6e1aeb00256d/pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44", size = 578540 },
+ { url = "https://files.pythonhosted.org/packages/3a/55/8841dcd28f783ad06674c8fe8d7d72794b548d0bff8829aaafeb72e8b44d/pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec", size = 642147 },
+ { url = "https://files.pythonhosted.org/packages/b4/78/b3c31ccfcfcdd6ea50b6abc8f46a2a7aadb9c3d40531d1b908d834aaa12e/pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb", size = 543903 },
+ { url = "https://files.pythonhosted.org/packages/53/fb/36b2b2548286e9444e52fcd198760af99fd89102b5be50f0660fcfe902df/pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", size = 906955 },
+ { url = "https://files.pythonhosted.org/packages/77/8f/6ce54f8979a01656e894946db6299e2273fcee21c8e5fa57c6295ef11f57/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", size = 565701 },
+ { url = "https://files.pythonhosted.org/packages/ee/1c/bf8cd66730a866b16db8483286078892b7f6536f8c389fb46e4beba0a970/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", size = 794312 },
+ { url = "https://files.pythonhosted.org/packages/71/43/91fa4ff25bbfdc914ab6bafa0f03241d69370ef31a761d16bb859f346582/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", size = 752775 },
+ { url = "https://files.pythonhosted.org/packages/ec/d2/3b2ab40f455a256cb6672186bea95cd97b459ce4594050132d71e76f0d6f/pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", size = 550762 },
+ { url = "https://files.pythonhosted.org/packages/6c/78/3096d72581365dfb0081ac9512a3b53672fa69854aa174d78636510c4db8/pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3", size = 906945 },
+ { url = "https://files.pythonhosted.org/packages/da/f2/8054574d77c269c31d055d4daf3d8407adf61ea384a50c8d14b158551d09/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a", size = 565698 },
+ { url = "https://files.pythonhosted.org/packages/77/21/c3ad93236d1d60eea10b67528f55e7db115a9d32e2bf163fcf601f85e9cc/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6", size = 794307 },
+ { url = "https://files.pythonhosted.org/packages/6a/49/e95b491724500fcb760178ce8db39b923429e328e57bcf9162e32c2c187c/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a", size = 752769 },
+ { url = "https://files.pythonhosted.org/packages/9b/a9/50c9c06762b30792f71aaad8d1886748d39c4bffedc1171fbc6ad2b92d67/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4", size = 751338 },
+ { url = "https://files.pythonhosted.org/packages/ca/63/27e6142b4f67a442ee480986ca5b88edb01462dd2319843057683a5148bd/pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f", size = 550757 },
+]
+
+[[package]]
+name = "referencing"
+version = "0.36.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "rpds-py" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/27/32/fd98246df7a0f309b58cae68b10b6b219ef2eb66747f00dfb34422687087/referencing-0.36.1.tar.gz", hash = "sha256:ca2e6492769e3602957e9b831b94211599d2aade9477f5d44110d2530cf9aade", size = 74661 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/fa/9f193ef0c9074b659009f06d7cbacc6f25b072044815bcf799b76533dbb8/referencing-0.36.1-py3-none-any.whl", hash = "sha256:363d9c65f080d0d70bc41c721dce3c7f3e77fc09f269cd5c8813da18069a6794", size = 26777 },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
+]
+
+[[package]]
+name = "rich"
+version = "13.9.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
+]
+
+[[package]]
+name = "rpds-py"
+version = "0.22.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/42/2a/ead1d09e57449b99dcc190d8d2323e3a167421d8f8fdf0f217c6f6befe47/rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", size = 359514 },
+ { url = "https://files.pythonhosted.org/packages/8f/7e/1254f406b7793b586c68e217a6a24ec79040f85e030fff7e9049069284f4/rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", size = 349031 },
+ { url = "https://files.pythonhosted.org/packages/aa/da/17c6a2c73730d426df53675ff9cc6653ac7a60b6438d03c18e1c822a576a/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", size = 381485 },
+ { url = "https://files.pythonhosted.org/packages/aa/13/2dbacd820466aa2a3c4b747afb18d71209523d353cf865bf8f4796c969ea/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", size = 386794 },
+ { url = "https://files.pythonhosted.org/packages/6d/62/96905d0a35ad4e4bc3c098b2f34b2e7266e211d08635baa690643d2227be/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", size = 423523 },
+ { url = "https://files.pythonhosted.org/packages/eb/1b/d12770f2b6a9fc2c3ec0d810d7d440f6d465ccd8b7f16ae5385952c28b89/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", size = 446695 },
+ { url = "https://files.pythonhosted.org/packages/4d/cf/96f1fd75512a017f8e07408b6d5dbeb492d9ed46bfe0555544294f3681b3/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", size = 381959 },
+ { url = "https://files.pythonhosted.org/packages/ab/f0/d1c5b501c8aea85aeb938b555bfdf7612110a2f8cdc21ae0482c93dd0c24/rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", size = 410420 },
+ { url = "https://files.pythonhosted.org/packages/33/3b/45b6c58fb6aad5a569ae40fb890fc494c6b02203505a5008ee6dc68e65f7/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", size = 557620 },
+ { url = "https://files.pythonhosted.org/packages/83/62/3fdd2d3d47bf0bb9b931c4c73036b4ab3ec77b25e016ae26fab0f02be2af/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", size = 584202 },
+ { url = "https://files.pythonhosted.org/packages/04/f2/5dced98b64874b84ca824292f9cee2e3f30f3bcf231d15a903126684f74d/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", size = 552787 },
+ { url = "https://files.pythonhosted.org/packages/67/13/2273dea1204eda0aea0ef55145da96a9aa28b3f88bb5c70e994f69eda7c3/rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", size = 220088 },
+ { url = "https://files.pythonhosted.org/packages/4e/80/8c8176b67ad7f4a894967a7a4014ba039626d96f1d4874d53e409b58d69f/rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", size = 231737 },
+ { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 },
+ { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 },
+ { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 },
+ { url = "https://files.pythonhosted.org/packages/9a/e9/835196a69cb229d5c31c13b8ae603bd2da9a6695f35fe4270d398e1db44c/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", size = 386171 },
+ { url = "https://files.pythonhosted.org/packages/f9/8e/33fc4eba6683db71e91e6d594a2cf3a8fbceb5316629f0477f7ece5e3f75/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", size = 422676 },
+ { url = "https://files.pythonhosted.org/packages/37/47/2e82d58f8046a98bb9497a8319604c92b827b94d558df30877c4b3c6ccb3/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", size = 446152 },
+ { url = "https://files.pythonhosted.org/packages/e1/78/79c128c3e71abbc8e9739ac27af11dc0f91840a86fce67ff83c65d1ba195/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", size = 381300 },
+ { url = "https://files.pythonhosted.org/packages/c9/5b/2e193be0e8b228c1207f31fa3ea79de64dadb4f6a4833111af8145a6bc33/rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", size = 409636 },
+ { url = "https://files.pythonhosted.org/packages/c2/3f/687c7100b762d62186a1c1100ffdf99825f6fa5ea94556844bbbd2d0f3a9/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", size = 556708 },
+ { url = "https://files.pythonhosted.org/packages/8c/a2/c00cbc4b857e8b3d5e7f7fc4c81e23afd8c138b930f4f3ccf9a41a23e9e4/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", size = 583554 },
+ { url = "https://files.pythonhosted.org/packages/d0/08/696c9872cf56effdad9ed617ac072f6774a898d46b8b8964eab39ec562d2/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", size = 552105 },
+ { url = "https://files.pythonhosted.org/packages/18/1f/4df560be1e994f5adf56cabd6c117e02de7c88ee238bb4ce03ed50da9d56/rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", size = 220199 },
+ { url = "https://files.pythonhosted.org/packages/b8/1b/c29b570bc5db8237553002788dc734d6bd71443a2ceac2a58202ec06ef12/rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", size = 231775 },
+ { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 },
+ { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 },
+ { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 },
+ { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 },
+ { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 },
+ { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 },
+ { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 },
+ { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 },
+ { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 },
+ { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 },
+ { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 },
+ { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 },
+ { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 },
+ { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 },
+ { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 },
+ { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 },
+ { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 },
+ { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 },
+ { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 },
+ { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 },
+ { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 },
+ { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 },
+ { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 },
+ { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 },
+ { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 },
+ { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 },
+ { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 },
+ { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 },
+ { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 },
+ { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 },
+ { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 },
+ { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 },
+ { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 },
+ { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 },
+ { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 },
+ { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 },
+ { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 },
+ { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 },
+ { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 },
+ { url = "https://files.pythonhosted.org/packages/db/0f/a8ad17ddac7c880f48d5da50733dd25bfc35ba2be1bec9f23453e8c7a123/rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", size = 359735 },
+ { url = "https://files.pythonhosted.org/packages/0c/41/430903669397ea3ee76865e0b53ea236e8dc0ffbecde47b2c4c783ad6759/rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", size = 348724 },
+ { url = "https://files.pythonhosted.org/packages/c9/5c/3496f4f0ee818297544f2d5f641c49dde8ae156392e6834b79c0609ba006/rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", size = 381782 },
+ { url = "https://files.pythonhosted.org/packages/b6/dc/db0523ce0cd16ce579185cc9aa9141992de956d0a9c469ecfd1fb5d54ddc/rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", size = 387036 },
+ { url = "https://files.pythonhosted.org/packages/85/2a/9525c2427d2c257f877348918136a5d4e1b945c205a256e53bec61e54551/rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", size = 424566 },
+ { url = "https://files.pythonhosted.org/packages/b9/1c/f8c012a39794b84069635709f559c0309103d5d74b3f5013916e6ca4f174/rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", size = 447203 },
+ { url = "https://files.pythonhosted.org/packages/93/f5/c1c772364570d35b98ba64f36ec90c3c6d0b932bc4d8b9b4efef6dc64b07/rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", size = 382283 },
+ { url = "https://files.pythonhosted.org/packages/10/06/f94f61313f94fc75c3c3aa74563f80bbd990e5b25a7c1a38cee7d5d0309b/rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", size = 410022 },
+ { url = "https://files.pythonhosted.org/packages/3f/b0/37ab416a9528419920dfb64886c220f58fcbd66b978e0a91b66e9ee9a993/rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", size = 557817 },
+ { url = "https://files.pythonhosted.org/packages/2c/5d/9daa18adcd676dd3b2817c8a7cec3f3ebeeb0ce0d05a1b63bf994fc5114f/rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", size = 585099 },
+ { url = "https://files.pythonhosted.org/packages/41/3f/ad4e58035d3f848410aa3d59857b5f238bafab81c8b4a844281f80445d62/rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", size = 552818 },
+ { url = "https://files.pythonhosted.org/packages/b8/19/123acae8f4cab3c9463097c3ced3cc87c46f405056e249c874940e045309/rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", size = 220246 },
+ { url = "https://files.pythonhosted.org/packages/8b/8d/9db93e48d96ace1f6713c71ce72e2d94b71d82156c37b6a54e0930486f00/rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", size = 231932 },
+ { url = "https://files.pythonhosted.org/packages/8b/63/e29f8ee14fcf383574f73b6bbdcbec0fbc2e5fc36b4de44d1ac389b1de62/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", size = 360786 },
+ { url = "https://files.pythonhosted.org/packages/d3/e0/771ee28b02a24e81c8c0e645796a371350a2bb6672753144f36ae2d2afc9/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", size = 350589 },
+ { url = "https://files.pythonhosted.org/packages/cf/49/abad4c4a1e6f3adf04785a99c247bfabe55ed868133e2d1881200aa5d381/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", size = 381848 },
+ { url = "https://files.pythonhosted.org/packages/3a/7d/f4bc6d6fbe6af7a0d2b5f2ee77079efef7c8528712745659ec0026888998/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", size = 387879 },
+ { url = "https://files.pythonhosted.org/packages/13/b0/575c797377fdcd26cedbb00a3324232e4cb2c5d121f6e4b0dbf8468b12ef/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", size = 423916 },
+ { url = "https://files.pythonhosted.org/packages/54/78/87157fa39d58f32a68d3326f8a81ad8fb99f49fe2aa7ad9a1b7d544f9478/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", size = 448410 },
+ { url = "https://files.pythonhosted.org/packages/59/69/860f89996065a88be1b6ff2d60e96a02b920a262d8aadab99e7903986597/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", size = 382841 },
+ { url = "https://files.pythonhosted.org/packages/bd/d7/bc144e10d27e3cb350f98df2492a319edd3caaf52ddfe1293f37a9afbfd7/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", size = 409662 },
+ { url = "https://files.pythonhosted.org/packages/14/2a/6bed0b05233c291a94c7e89bc76ffa1c619d4e1979fbfe5d96024020c1fb/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", size = 558221 },
+ { url = "https://files.pythonhosted.org/packages/11/23/cd8f566de444a137bc1ee5795e47069a947e60810ba4152886fe5308e1b7/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", size = 583780 },
+ { url = "https://files.pythonhosted.org/packages/8d/63/79c3602afd14d501f751e615a74a59040328da5ef29ed5754ae80d236b84/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", size = 553619 },
+ { url = "https://files.pythonhosted.org/packages/9f/2e/c5c1689e80298d4e94c75b70faada4c25445739d91b94c211244a3ed7ed1/rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", size = 233338 },
+ { url = "https://files.pythonhosted.org/packages/bc/b7/d2c205723e3b4d75b03215694f0297a1b4b395bf834cb5896ad9bbb90f90/rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", size = 360594 },
+ { url = "https://files.pythonhosted.org/packages/d8/8f/c3515f5234cf6055046d4cfe9c80a3742a20acfa7d0b1b290f0d7f56a8db/rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", size = 349594 },
+ { url = "https://files.pythonhosted.org/packages/6b/98/5b487cb06afc484befe350c87fda37f4ce11333f04f3380aba43dcf5bce2/rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", size = 381138 },
+ { url = "https://files.pythonhosted.org/packages/5e/3a/12308d2c51b3fdfc173619943b7dc5ba41b4850c47112eeda38d9c54ed12/rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", size = 387828 },
+ { url = "https://files.pythonhosted.org/packages/17/b2/c242241ab5a2a206e093f24ccbfa519c4bbf10a762ac90bffe1766c225e0/rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", size = 424634 },
+ { url = "https://files.pythonhosted.org/packages/d5/c7/52a1b15012139f3ba740f291f1d03c6b632938ba61bc605f24c101952493/rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", size = 447862 },
+ { url = "https://files.pythonhosted.org/packages/55/3e/4d3ed8fd01bad77e8ed101116fe63b03f1011940d9596a8f4d82ac80cacd/rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", size = 382506 },
+ { url = "https://files.pythonhosted.org/packages/30/78/df59d6f92470a84369a3757abeae1cfd7f7239c8beb6d948949bf78317d2/rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", size = 410534 },
+ { url = "https://files.pythonhosted.org/packages/38/97/ea45d1edd9b753b20084b52dd5db6ee5e1ac3e036a27149972398a413858/rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", size = 557453 },
+ { url = "https://files.pythonhosted.org/packages/08/cd/3a1b35eb9da27ffbb981cfffd32a01c7655c4431ccb278cb3064f8887462/rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", size = 584412 },
+ { url = "https://files.pythonhosted.org/packages/87/91/31d1c5aeb1606f71188259e0ba6ed6f5c21a3c72f58b51db6a8bd0aa2b5d/rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", size = 553446 },
+ { url = "https://files.pythonhosted.org/packages/e7/ad/03b5ccd1ab492c9dece85b3bf1c96453ab8c47983936fae6880f688f60b3/rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", size = 233013 },
+]
+
+[[package]]
+name = "ruff"
+version = "0.9.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/80/63/77ecca9d21177600f551d1c58ab0e5a0b260940ea7312195bd2a4798f8a8/ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0", size = 3553799 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/af/b9/0e168e4e7fb3af851f739e8f07889b91d1a33a30fca8c29fa3149d6b03ec/ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347", size = 11652408 },
+ { url = "https://files.pythonhosted.org/packages/2c/22/08ede5db17cf701372a461d1cb8fdde037da1d4fa622b69ac21960e6237e/ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00", size = 11587553 },
+ { url = "https://files.pythonhosted.org/packages/42/05/dedfc70f0bf010230229e33dec6e7b2235b2a1b8cbb2a991c710743e343f/ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4", size = 11020755 },
+ { url = "https://files.pythonhosted.org/packages/df/9b/65d87ad9b2e3def67342830bd1af98803af731243da1255537ddb8f22209/ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d", size = 11826502 },
+ { url = "https://files.pythonhosted.org/packages/93/02/f2239f56786479e1a89c3da9bc9391120057fc6f4a8266a5b091314e72ce/ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c", size = 11390562 },
+ { url = "https://files.pythonhosted.org/packages/c9/37/d3a854dba9931f8cb1b2a19509bfe59e00875f48ade632e95aefcb7a0aee/ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f", size = 12548968 },
+ { url = "https://files.pythonhosted.org/packages/fa/c3/c7b812bb256c7a1d5553433e95980934ffa85396d332401f6b391d3c4569/ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684", size = 13187155 },
+ { url = "https://files.pythonhosted.org/packages/bd/5a/3c7f9696a7875522b66aa9bba9e326e4e5894b4366bd1dc32aa6791cb1ff/ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d", size = 12704674 },
+ { url = "https://files.pythonhosted.org/packages/be/d6/d908762257a96ce5912187ae9ae86792e677ca4f3dc973b71e7508ff6282/ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df", size = 14529328 },
+ { url = "https://files.pythonhosted.org/packages/2d/c2/049f1e6755d12d9cd8823242fa105968f34ee4c669d04cac8cea51a50407/ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247", size = 12385955 },
+ { url = "https://files.pythonhosted.org/packages/91/5a/a9bdb50e39810bd9627074e42743b00e6dc4009d42ae9f9351bc3dbc28e7/ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e", size = 11810149 },
+ { url = "https://files.pythonhosted.org/packages/e5/fd/57df1a0543182f79a1236e82a79c68ce210efb00e97c30657d5bdb12b478/ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe", size = 11479141 },
+ { url = "https://files.pythonhosted.org/packages/dc/16/bc3fd1d38974f6775fc152a0554f8c210ff80f2764b43777163c3c45d61b/ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb", size = 12014073 },
+ { url = "https://files.pythonhosted.org/packages/47/6b/e4ca048a8f2047eb652e1e8c755f384d1b7944f69ed69066a37acd4118b0/ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a", size = 12435758 },
+ { url = "https://files.pythonhosted.org/packages/c2/40/4d3d6c979c67ba24cf183d29f706051a53c36d78358036a9cd21421582ab/ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145", size = 9796916 },
+ { url = "https://files.pythonhosted.org/packages/c3/ef/7f548752bdb6867e6939489c87fe4da489ab36191525fadc5cede2a6e8e2/ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5", size = 10773080 },
+ { url = "https://files.pythonhosted.org/packages/0e/4e/33df635528292bd2d18404e4daabcd74ca8a9853b2e1df85ed3d32d24362/ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6", size = 10001738 },
+]
+
+[[package]]
+name = "scipy"
+version = "1.13.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+dependencies = [
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076 },
+ { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232 },
+ { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202 },
+ { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335 },
+ { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728 },
+ { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588 },
+ { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805 },
+ { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687 },
+ { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638 },
+ { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931 },
+ { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145 },
+ { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227 },
+ { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301 },
+ { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348 },
+ { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062 },
+ { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311 },
+ { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493 },
+ { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955 },
+ { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927 },
+ { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538 },
+ { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190 },
+ { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244 },
+ { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637 },
+ { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440 },
+]
+
+[[package]]
+name = "scipy"
+version = "1.15.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+dependencies = [
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/76/c6/8eb0654ba0c7d0bb1bf67bf8fbace101a8e4f250f7722371105e8b6f68fc/scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6", size = 59407493 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/86/53/b204ce5a4433f1864001b9d16f103b9c25f5002a602ae83585d0ea5f9c4a/scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1", size = 41414518 },
+ { url = "https://files.pythonhosted.org/packages/c7/fc/54ffa7a8847f7f303197a6ba65a66104724beba2e38f328135a78f0dc480/scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff", size = 32519265 },
+ { url = "https://files.pythonhosted.org/packages/f1/77/a98b8ba03d6f371dc31a38719affd53426d4665729dcffbed4afe296784a/scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea", size = 24792859 },
+ { url = "https://files.pythonhosted.org/packages/a7/78/70bb9f0df7444b18b108580934bfef774822e28fd34a68e5c263c7d2828a/scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e", size = 27886506 },
+ { url = "https://files.pythonhosted.org/packages/14/a7/f40f6033e06de4176ddd6cc8c3ae9f10a226c3bca5d6b4ab883bc9914a14/scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25", size = 38375041 },
+ { url = "https://files.pythonhosted.org/packages/17/03/390a1c5c61fd76b0fa4b3c5aa3bdd7e60f6c46f712924f1a9df5705ec046/scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52", size = 40597556 },
+ { url = "https://files.pythonhosted.org/packages/4e/70/fa95b3ae026b97eeca58204a90868802e5155ac71b9d7bdee92b68115dd3/scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0", size = 42938505 },
+ { url = "https://files.pythonhosted.org/packages/d6/07/427859116bdd71847c898180f01802691f203c3e2455a1eb496130ff07c5/scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8", size = 43909663 },
+ { url = "https://files.pythonhosted.org/packages/8e/2e/7b71312da9c2dabff53e7c9a9d08231bc34d9d8fdabe88a6f1155b44591c/scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2", size = 41424362 },
+ { url = "https://files.pythonhosted.org/packages/81/8c/ab85f1aa1cc200c796532a385b6ebf6a81089747adc1da7482a062acc46c/scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0", size = 32535910 },
+ { url = "https://files.pythonhosted.org/packages/3b/9c/6f4b787058daa8d8da21ddff881b4320e28de4704a65ec147adb50cb2230/scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf", size = 24809398 },
+ { url = "https://files.pythonhosted.org/packages/16/2b/949460a796df75fc7a1ee1becea202cf072edbe325ebe29f6d2029947aa7/scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac", size = 27918045 },
+ { url = "https://files.pythonhosted.org/packages/5f/36/67fe249dd7ccfcd2a38b25a640e3af7e59d9169c802478b6035ba91dfd6d/scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df", size = 38332074 },
+ { url = "https://files.pythonhosted.org/packages/fc/da/452e1119e6f720df3feb588cce3c42c5e3d628d4bfd4aec097bd30b7de0c/scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7", size = 40588469 },
+ { url = "https://files.pythonhosted.org/packages/7f/71/5f94aceeac99a4941478af94fe9f459c6752d497035b6b0761a700f5f9ff/scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a", size = 42965214 },
+ { url = "https://files.pythonhosted.org/packages/af/25/caa430865749d504271757cafd24066d596217e83326155993980bc22f97/scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b", size = 43896034 },
+ { url = "https://files.pythonhosted.org/packages/d8/6e/a9c42d0d39e09ed7fd203d0ac17adfea759cba61ab457671fe66e523dbec/scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776", size = 41478318 },
+ { url = "https://files.pythonhosted.org/packages/04/ee/e3e535c81828618878a7433992fecc92fa4df79393f31a8fea1d05615091/scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f", size = 32596696 },
+ { url = "https://files.pythonhosted.org/packages/c4/5e/b1b0124be8e76f87115f16b8915003eec4b7060298117715baf13f51942c/scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04", size = 24870366 },
+ { url = "https://files.pythonhosted.org/packages/14/36/c00cb73eefda85946172c27913ab995c6ad4eee00fa4f007572e8c50cd51/scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9", size = 28007461 },
+ { url = "https://files.pythonhosted.org/packages/68/94/aff5c51b3799349a9d1e67a056772a0f8a47db371e83b498d43467806557/scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce", size = 38068174 },
+ { url = "https://files.pythonhosted.org/packages/b0/3c/0de11ca154e24a57b579fb648151d901326d3102115bc4f9a7a86526ce54/scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2", size = 40249869 },
+ { url = "https://files.pythonhosted.org/packages/15/09/472e8d0a6b33199d1bb95e49bedcabc0976c3724edd9b0ef7602ccacf41e/scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5", size = 42629068 },
+ { url = "https://files.pythonhosted.org/packages/ff/ba/31c7a8131152822b3a2cdeba76398ffb404d81d640de98287d236da90c49/scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d", size = 43621992 },
+ { url = "https://files.pythonhosted.org/packages/2b/bf/dd68965a4c5138a630eeed0baec9ae96e5d598887835bdde96cdd2fe4780/scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85", size = 41441136 },
+ { url = "https://files.pythonhosted.org/packages/ef/5e/4928581312922d7e4d416d74c416a660addec4dd5ea185401df2269ba5a0/scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692", size = 32533699 },
+ { url = "https://files.pythonhosted.org/packages/32/90/03f99c43041852837686898c66767787cd41c5843d7a1509c39ffef683e9/scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab", size = 24807289 },
+ { url = "https://files.pythonhosted.org/packages/9d/52/bfe82b42ae112eaba1af2f3e556275b8727d55ac6e4932e7aef337a9d9d4/scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c", size = 27929844 },
+ { url = "https://files.pythonhosted.org/packages/f6/77/54ff610bad600462c313326acdb035783accc6a3d5f566d22757ad297564/scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e", size = 38031272 },
+ { url = "https://files.pythonhosted.org/packages/f1/26/98585cbf04c7cf503d7eb0a1966df8a268154b5d923c5fe0c1ed13154c49/scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e", size = 40210217 },
+ { url = "https://files.pythonhosted.org/packages/fd/3f/3d2285eb6fece8bc5dbb2f9f94d61157d61d155e854fd5fea825b8218f12/scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4", size = 42587785 },
+ { url = "https://files.pythonhosted.org/packages/48/7d/5b5251984bf0160d6533695a74a5fddb1fa36edd6f26ffa8c871fbd4782a/scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef", size = 43640439 },
+ { url = "https://files.pythonhosted.org/packages/e7/b8/0e092f592d280496de52e152582030f8a270b194f87f890e1a97c5599b81/scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b", size = 41619862 },
+ { url = "https://files.pythonhosted.org/packages/f6/19/0b6e1173aba4db9e0b7aa27fe45019857fb90d6904038b83927cbe0a6c1d/scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95", size = 32610387 },
+ { url = "https://files.pythonhosted.org/packages/e7/02/754aae3bd1fa0f2479ade3cfdf1732ecd6b05853f63eee6066a32684563a/scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364", size = 24883814 },
+ { url = "https://files.pythonhosted.org/packages/1f/ac/d7906201604a2ea3b143bb0de51b3966f66441ba50b7dc182c4505b3edf9/scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0", size = 27944865 },
+ { url = "https://files.pythonhosted.org/packages/84/9d/8f539002b5e203723af6a6f513a45e0a7671e9dabeedb08f417ac17e4edc/scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54", size = 39883261 },
+ { url = "https://files.pythonhosted.org/packages/97/c0/62fd3bab828bcccc9b864c5997645a3b86372a35941cdaf677565c25c98d/scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c", size = 42093299 },
+ { url = "https://files.pythonhosted.org/packages/e4/1f/5d46a8d94e9f6d2c913cbb109e57e7eed914de38ea99e2c4d69a9fc93140/scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5", size = 43181730 },
+]
+
+[[package]]
+name = "secretstorage"
+version = "3.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cryptography" },
+ { name = "jeepney" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221 },
+]
+
+[[package]]
+name = "shapely"
+version = "2.0.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "numpy", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4a/89/0d20bac88016be35ff7d3c0c2ae64b477908f1b1dfa540c5d69ac7af07fe/shapely-2.0.6.tar.gz", hash = "sha256:997f6159b1484059ec239cacaa53467fd8b5564dabe186cd84ac2944663b0bf6", size = 282361 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/17/d4/f84bbbdb7771f5b9ade94db2398b256cf1471f1eb0ca8afbe0f6ca725d5a/shapely-2.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29a34e068da2d321e926b5073539fd2a1d4429a2c656bd63f0bd4c8f5b236d0b", size = 1449635 },
+ { url = "https://files.pythonhosted.org/packages/03/10/bd6edb66ed0a845f0809f7ce653596f6fd9c6be675b3653872f47bf49f82/shapely-2.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c84c3f53144febf6af909d6b581bc05e8785d57e27f35ebaa5c1ab9baba13b", size = 1296756 },
+ { url = "https://files.pythonhosted.org/packages/af/09/6374c11cb493a9970e8c04d7be25f578a37f6494a2fecfbed3a447b16b2c/shapely-2.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad2fae12dca8d2b727fa12b007e46fbc522148a584f5d6546c539f3464dccde", size = 2381960 },
+ { url = "https://files.pythonhosted.org/packages/2b/a6/302e0d9c210ccf4d1ffadf7ab941797d3255dcd5f93daa73aaf116a4db39/shapely-2.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3304883bd82d44be1b27a9d17f1167fda8c7f5a02a897958d86c59ec69b705e", size = 2468133 },
+ { url = "https://files.pythonhosted.org/packages/8c/be/e448681dc485f2931d4adee93d531fce93608a3ee59433303cc1a46e21a5/shapely-2.0.6-cp310-cp310-win32.whl", hash = "sha256:3ec3a0eab496b5e04633a39fa3d5eb5454628228201fb24903d38174ee34565e", size = 1294982 },
+ { url = "https://files.pythonhosted.org/packages/cd/4c/6f4a6fc085e3be01c4c9de0117a2d373bf9fec5f0426cf4d5c94090a5a4d/shapely-2.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:28f87cdf5308a514763a5c38de295544cb27429cfa655d50ed8431a4796090c4", size = 1441141 },
+ { url = "https://files.pythonhosted.org/packages/37/15/269d8e1f7f658a37e61f7028683c546f520e4e7cedba1e32c77ff9d3a3c7/shapely-2.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aeb0f51a9db176da9a30cb2f4329b6fbd1e26d359012bb0ac3d3c7781667a9e", size = 1449578 },
+ { url = "https://files.pythonhosted.org/packages/37/63/e182e43081fffa0a2d970c480f2ef91647a6ab94098f61748c23c2a485f2/shapely-2.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a7a78b0d51257a367ee115f4d41ca4d46edbd0dd280f697a8092dd3989867b2", size = 1296792 },
+ { url = "https://files.pythonhosted.org/packages/6e/5a/d019f69449329dcd517355444fdb9ddd58bec5e080b8bdba007e8e4c546d/shapely-2.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f32c23d2f43d54029f986479f7c1f6e09c6b3a19353a3833c2ffb226fb63a855", size = 2443997 },
+ { url = "https://files.pythonhosted.org/packages/25/aa/53f145e5a610a49af9ac49f2f1be1ec8659ebd5c393d66ac94e57c83b00e/shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3dc9fb0eb56498912025f5eb352b5126f04801ed0e8bdbd867d21bdbfd7cbd0", size = 2528334 },
+ { url = "https://files.pythonhosted.org/packages/64/64/0c7b0a22b416d36f6296b92bb4219d82b53d0a7c47e16fd0a4c85f2f117c/shapely-2.0.6-cp311-cp311-win32.whl", hash = "sha256:d93b7e0e71c9f095e09454bf18dad5ea716fb6ced5df3cb044564a00723f339d", size = 1294669 },
+ { url = "https://files.pythonhosted.org/packages/b1/5a/6a67d929c467a1973b6bb9f0b00159cc343b02bf9a8d26db1abd2f87aa23/shapely-2.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:c02eb6bf4cfb9fe6568502e85bb2647921ee49171bcd2d4116c7b3109724ef9b", size = 1442032 },
+ { url = "https://files.pythonhosted.org/packages/46/77/efd9f9d4b6a762f976f8b082f54c9be16f63050389500fb52e4f6cc07c1a/shapely-2.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cec9193519940e9d1b86a3b4f5af9eb6910197d24af02f247afbfb47bcb3fab0", size = 1450326 },
+ { url = "https://files.pythonhosted.org/packages/68/53/5efa6e7a4036a94fe6276cf7bbb298afded51ca3396b03981ad680c8cc7d/shapely-2.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83b94a44ab04a90e88be69e7ddcc6f332da7c0a0ebb1156e1c4f568bbec983c3", size = 1298480 },
+ { url = "https://files.pythonhosted.org/packages/88/a2/1be1db4fc262e536465a52d4f19d85834724fedf2299a1b9836bc82fe8fa/shapely-2.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:537c4b2716d22c92036d00b34aac9d3775e3691f80c7aa517c2c290351f42cd8", size = 2439311 },
+ { url = "https://files.pythonhosted.org/packages/d5/7d/9a57e187cbf2fbbbdfd4044a4f9ce141c8d221f9963750d3b001f0ec080d/shapely-2.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fea108334be345c283ce74bf064fa00cfdd718048a8af7343c59eb40f59726", size = 2524835 },
+ { url = "https://files.pythonhosted.org/packages/6d/0a/f407509ab56825f39bf8cfce1fb410238da96cf096809c3e404e5bc71ea1/shapely-2.0.6-cp312-cp312-win32.whl", hash = "sha256:42fd4cd4834747e4990227e4cbafb02242c0cffe9ce7ef9971f53ac52d80d55f", size = 1295613 },
+ { url = "https://files.pythonhosted.org/packages/7b/b3/857afd9dfbfc554f10d683ac412eac6fa260d1f4cd2967ecb655c57e831a/shapely-2.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:665990c84aece05efb68a21b3523a6b2057e84a1afbef426ad287f0796ef8a48", size = 1442539 },
+ { url = "https://files.pythonhosted.org/packages/34/e8/d164ef5b0eab86088cde06dee8415519ffd5bb0dd1bd9d021e640e64237c/shapely-2.0.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:42805ef90783ce689a4dde2b6b2f261e2c52609226a0438d882e3ced40bb3013", size = 1445344 },
+ { url = "https://files.pythonhosted.org/packages/ce/e2/9fba7ac142f7831757a10852bfa465683724eadbc93d2d46f74a16f9af04/shapely-2.0.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6d2cb146191a47bd0cee8ff5f90b47547b82b6345c0d02dd8b25b88b68af62d7", size = 1296182 },
+ { url = "https://files.pythonhosted.org/packages/cf/dc/790d4bda27d196cd56ec66975eaae3351c65614cafd0e16ddde39ec9fb92/shapely-2.0.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3fdef0a1794a8fe70dc1f514440aa34426cc0ae98d9a1027fb299d45741c381", size = 2423426 },
+ { url = "https://files.pythonhosted.org/packages/af/b0/f8169f77eac7392d41e231911e0095eb1148b4d40c50ea9e34d999c89a7e/shapely-2.0.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c665a0301c645615a107ff7f52adafa2153beab51daf34587170d85e8ba6805", size = 2513249 },
+ { url = "https://files.pythonhosted.org/packages/f6/1d/a8c0e9ab49ff2f8e4dedd71b0122eafb22a18ad7e9d256025e1f10c84704/shapely-2.0.6-cp313-cp313-win32.whl", hash = "sha256:0334bd51828f68cd54b87d80b3e7cee93f249d82ae55a0faf3ea21c9be7b323a", size = 1294848 },
+ { url = "https://files.pythonhosted.org/packages/23/38/2bc32dd1e7e67a471d4c60971e66df0bdace88656c47a9a728ace0091075/shapely-2.0.6-cp313-cp313-win_amd64.whl", hash = "sha256:d37d070da9e0e0f0a530a621e17c0b8c3c9d04105655132a87cfff8bd77cc4c2", size = 1441371 },
+ { url = "https://files.pythonhosted.org/packages/9d/6f/19fda412323f512e21b8888523596177070bca29a80d1b70f4b6a5e7869f/shapely-2.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:392f66f458a0a2c706254f473290418236e52aa4c9b476a072539d63a2460595", size = 1451236 },
+ { url = "https://files.pythonhosted.org/packages/bc/f5/5dfd13e90fe881560b4b1196e47fab48d6469c33d0b78d0f57a5e10bd409/shapely-2.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eba5bae271d523c938274c61658ebc34de6c4b33fdf43ef7e938b5776388c1be", size = 1298209 },
+ { url = "https://files.pythonhosted.org/packages/76/89/6be88c828e2c671dfdd5b0c875d08c8573c6f1bac759f297b166e0b2c64c/shapely-2.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7060566bc4888b0c8ed14b5d57df8a0ead5c28f9b69fb6bed4476df31c51b0af", size = 2389098 },
+ { url = "https://files.pythonhosted.org/packages/a5/b2/6a4589439880244f86c1d3061efd91faf8ec21e646df18730810b6d59481/shapely-2.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b02154b3e9d076a29a8513dffcb80f047a5ea63c897c0cd3d3679f29363cf7e5", size = 2473382 },
+ { url = "https://files.pythonhosted.org/packages/42/dd/2a039361d249dc84f0470173356c36d74516fe2978dfdde98197618f4e5c/shapely-2.0.6-cp39-cp39-win32.whl", hash = "sha256:44246d30124a4f1a638a7d5419149959532b99dfa25b54393512e6acc9c211ac", size = 1296873 },
+ { url = "https://files.pythonhosted.org/packages/a7/68/0e4b9aab76d2b7f44013dc98aa16c7f9e33dd1b34088140fb15664967e8b/shapely-2.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:2b542d7f1dbb89192d3512c52b679c822ba916f93479fa5d4fc2fe4fa0b3c9e8", size = 1442993 },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
+]
+
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 },
+]
+
+[[package]]
+name = "soupsieve"
+version = "2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 },
+]
+
+[[package]]
+name = "sphinx"
+version = "7.4.7"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.10'",
+]
+dependencies = [
+ { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "babel", marker = "python_full_version < '3.10'" },
+ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" },
+ { name = "docutils", marker = "python_full_version < '3.10'" },
+ { name = "imagesize", marker = "python_full_version < '3.10'" },
+ { name = "importlib-metadata", marker = "python_full_version < '3.10'" },
+ { name = "jinja2", marker = "python_full_version < '3.10'" },
+ { name = "packaging", marker = "python_full_version < '3.10'" },
+ { name = "pygments", marker = "python_full_version < '3.10'" },
+ { name = "requests", marker = "python_full_version < '3.10'" },
+ { name = "snowballstemmer", marker = "python_full_version < '3.10'" },
+ { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.10'" },
+ { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.10'" },
+ { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.10'" },
+ { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.10'" },
+ { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.10'" },
+ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.10'" },
+ { name = "tomli", marker = "python_full_version < '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624 },
+]
+
+[[package]]
+name = "sphinx"
+version = "8.1.3"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version == '3.11.*'",
+ "python_full_version == '3.10.*'",
+]
+dependencies = [
+ { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+ { name = "babel", marker = "python_full_version >= '3.10'" },
+ { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" },
+ { name = "docutils", marker = "python_full_version >= '3.10'" },
+ { name = "imagesize", marker = "python_full_version >= '3.10'" },
+ { name = "jinja2", marker = "python_full_version >= '3.10'" },
+ { name = "packaging", marker = "python_full_version >= '3.10'" },
+ { name = "pygments", marker = "python_full_version >= '3.10'" },
+ { name = "requests", marker = "python_full_version >= '3.10'" },
+ { name = "snowballstemmer", marker = "python_full_version >= '3.10'" },
+ { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.10'" },
+ { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.10'" },
+ { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.10'" },
+ { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.10'" },
+ { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.10'" },
+ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.10'" },
+ { name = "tomli", marker = "python_full_version == '3.10.*'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 },
+]
+
+[[package]]
+name = "sphinx-copybutton"
+version = "0.5.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 },
+]
+
+[[package]]
+name = "sphinx-design"
+version = "0.6.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 },
+]
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 },
+]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 },
+]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 },
+]
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 },
+]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 },
+]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 },
+]
+
+[[package]]
+name = "sphinxext-altair"
+version = "0.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "altair" },
+ { name = "docutils" },
+ { name = "jinja2" },
+ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
+ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ea/2c/41b5f3079481f4e49a9451be1a429fda3dec1e51786875e104ef3c95d836/sphinxext_altair-0.2.0.tar.gz", hash = "sha256:eac920f97fdc9d44b669f442c24f6d96ea4f236179b96c25df41a8cd4385e5f6", size = 8648 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/c9/15bd3bf427be9dc4f4d06bb7fcc4b0b7fb82aef07e25c5026bb52c819380/sphinxext_altair-0.2.0-py3-none-any.whl", hash = "sha256:4a307add6a530586794ba80204d724305009b5f499782cf1f828af0fc1d056b9", size = 7786 },
+]
+
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asttokens" },
+ { name = "executing" },
+ { name = "pure-eval" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
+]
+
+[[package]]
+name = "tabulate"
+version = "0.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 },
+]
+
+[[package]]
+name = "taskipy"
+version = "1.14.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama" },
+ { name = "mslex", marker = "sys_platform == 'win32'" },
+ { name = "psutil" },
+ { name = "tomli", marker = "python_full_version < '4.0'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c7/44/572261df3db9c6c3332f8618fafeb07a578fd18b06673c73f000f3586749/taskipy-1.14.1.tar.gz", hash = "sha256:410fbcf89692dfd4b9f39c2b49e1750b0a7b81affd0e2d7ea8c35f9d6a4774ed", size = 14475 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/55/97/4e4cfb1391c81e926bebe3d68d5231b5dbc3bb41c6ba48349e68a881462d/taskipy-1.14.1-py3-none-any.whl", hash = "sha256:6e361520f29a0fd2159848e953599f9c75b1d0b047461e4965069caeb94908f1", size = 13052 },
+]
+
+[[package]]
+name = "tomli"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
+ { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
+ { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
+ { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
+ { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
+ { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
+ { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
+ { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
+ { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
+ { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
+ { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
+ { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
+ { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
+ { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
+ { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
+ { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
+ { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
+ { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
+ { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
+ { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
+ { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
+ { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
+ { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
+ { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
+ { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
+ { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
+ { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
+ { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
+ { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
+ { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
+ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
+]
+
+[[package]]
+name = "tomli-w"
+version = "1.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675 },
+]
+
+[[package]]
+name = "tomlkit"
+version = "0.13.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 },
+]
+
+[[package]]
+name = "tornado"
+version = "6.4.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 },
+ { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 },
+ { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 },
+ { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 },
+ { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 },
+ { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 },
+ { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 },
+ { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 },
+ { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 },
+ { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 },
+]
+
+[[package]]
+name = "traitlets"
+version = "5.14.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 },
+]
+
+[[package]]
+name = "trove-classifiers"
+version = "2025.1.15.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/cb/8f6a91c74049180e395590901834d68bef5d6a2ce4c9ca9792cfadc1b9b4/trove_classifiers-2025.1.15.22.tar.gz", hash = "sha256:90af74358d3a01b3532bc7b3c88d8c6a094c2fd50a563d13d9576179326d7ed9", size = 16236 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2b/c5/6422dbc59954389b20b2aba85b737ab4a552e357e7ea14b52f40312e7c84/trove_classifiers-2025.1.15.22-py3-none-any.whl", hash = "sha256:5f19c789d4f17f501d36c94dbbf969fb3e8c2784d008e6f5164dd2c3d6a2b07c", size = 13610 },
+]
+
+[[package]]
+name = "types-jsonschema"
+version = "4.23.0.20241208"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "referencing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ad/e6/9e5cd771687086844caa43dbb211ec0d1cfa899d17c110f3220efcd46e83/types_jsonschema-4.23.0.20241208.tar.gz", hash = "sha256:e8b15ad01f290ecf6aea53f93fbdf7d4730e4600313e89e8a7f95622f7e87b7c", size = 14770 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/91/64/4b2fba8b7cb0104ba013f2a1bf6f39a98e927e14befe1ef947d373b25218/types_jsonschema-4.23.0.20241208-py3-none-any.whl", hash = "sha256:87934bd9231c99d8eff94cacfc06ba668f7973577a9bd9e1f9de957c5737313e", size = 15021 },
+]
+
+[[package]]
+name = "types-pytz"
+version = "2024.2.0.20241221"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/54/26/516311b02b5a215e721155fb65db8a965d061372e388d6125ebce8d674b0/types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9", size = 10213 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/74/db/c92ca6920cccd9c2998b013601542e2ac5e59bc805bcff94c94ad254b7df/types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5", size = 10008 },
+]
+
+[[package]]
+name = "types-setuptools"
+version = "75.8.0.20250110"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f7/42/5713e90d4f9683f2301d900f33e4fc2405ad8ac224dda30f6cb7f4cd215b/types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271", size = 48185 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cf/a3/dbfd106751b11c728cec21cc62cbfe7ff7391b935c4b6e8f0bdc2e6fd541/types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480", size = 71521 },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.12.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
+]
+
+[[package]]
+name = "tzdata"
+version = "2024.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
+]
+
+[[package]]
+name = "userpath"
+version = "1.9.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d5/b7/30753098208505d7ff9be5b3a32112fb8a4cb3ddfccbbb7ba9973f2e29ff/userpath-1.9.2.tar.gz", hash = "sha256:6c52288dab069257cc831846d15d48133522455d4677ee69a9781f11dbefd815", size = 11140 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl", hash = "sha256:2cbf01a23d655a1ff8fc166dfb78da1b641d1ceabf0fe5f970767d380b14e89d", size = 9065 },
+]
+
+[[package]]
+name = "uv"
+version = "0.5.20"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/61/4cc21e8e79cebb4e49a6ca214a0647b00f49cb585886e0bf5e2490fe9e7c/uv-0.5.20.tar.gz", hash = "sha256:896305cc0d1f5fc5db97ed8e028c2fe236f6e0900bc72469d61ad97bc7ec5124", size = 2629688 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8b/22/a3f24aa6f405756f69b0eb1b974bf0e9d9c744f1effc3e82d56ce46b5519/uv-0.5.20-py3-none-linux_armv6l.whl", hash = "sha256:c299d2c7aa04803c16ed5378e4b5dbfcc57eb6a40962f1141520eb43c0ecd291", size = 15138092 },
+ { url = "https://files.pythonhosted.org/packages/e6/a5/f413ece0d351dbd2ab9067b42d111e7da6b3f133074ef245eb202891183e/uv-0.5.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0c73540d6afb923ea64a5a54ddd34fec191f91c4b1071bf65a2ea7b05a854017", size = 15318120 },
+ { url = "https://files.pythonhosted.org/packages/d8/bf/b2cf36530206fc46533e6b384756043c3c04acbe930ac1f5498b825fbea9/uv-0.5.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e3b38c2d5c14847fb68cf7c88bfee3e09dd170e1b229441cee40c98ce5f56c5e", size = 14206329 },
+ { url = "https://files.pythonhosted.org/packages/b4/38/d8f48e30d5a32fd8610fdf5fde1b96a7f9ae89799a5baabaf633e5ea0483/uv-0.5.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:ffce28f4b460f88f6e30d2a42874ee4d0e0daafe3d0436cda91ed05b130d7c90", size = 14701677 },
+ { url = "https://files.pythonhosted.org/packages/d0/9d/c0b865134b23e724cf02accdb93de3469808ffe34b9805a31ed9a483e339/uv-0.5.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3010eb9611f89f4d6fa681c406269c59c0faf3446bb9ef01abcfb7da600a88e7", size = 14885382 },
+ { url = "https://files.pythonhosted.org/packages/11/29/05af45986c7f0591b3c4a31c63e2d2d6dab3b3603a2ec50ee9e5b0c835b1/uv-0.5.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1541a67de42e64d9ff594b9a21ec238681ff0e40b2f90c1ecabcac71c7e622c", size = 15666066 },
+ { url = "https://files.pythonhosted.org/packages/d0/88/6d7b5ac6f8c78fe92c4a29d82d9b66c2b0b3177345d29f65fa15842cc1fd/uv-0.5.20-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4c23cde62f48b19a0dc6922f5c144b02c0c21b1c2e2606be872fc656e95a25e1", size = 16576104 },
+ { url = "https://files.pythonhosted.org/packages/f9/14/d833b564f16d0723015687580f834a3531e64f7c79d4ad14034357496bc7/uv-0.5.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbdc9f82cdcb539549654c85aada1c583fe18235666316599648657ff497f266", size = 16304628 },
+ { url = "https://files.pythonhosted.org/packages/58/f7/8c7cc0378d0c02f4a95910de96b37b0163fc09a847948676f6d139b6bdd3/uv-0.5.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:180b03d8fe0712297235498944252af19265aab396d22aef3783e963cfbfbcaf", size = 20571845 },
+ { url = "https://files.pythonhosted.org/packages/04/60/83b8185a23384ffcee4c07a8a2f5892b957b8c68aceba2b9832fab49b137/uv-0.5.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c337f7e029dc8faf020dd76847ea084591ea96fd5f40ddb5117214ecb12a9e6", size = 15959564 },
+ { url = "https://files.pythonhosted.org/packages/ad/29/cdda048af5c2aa2adcce6d133af217253cd76509d09b3b766762e2524758/uv-0.5.20-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:a4049cb7de46bd36d3b770ae3203e36d1db406ddc048bcd509578fd1d1072a38", size = 14966373 },
+ { url = "https://files.pythonhosted.org/packages/3d/a2/71e9b149ed36613c99b78a643237b471244071359f0e5d8d5e08230d7ea0/uv-0.5.20-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:2f84a5df76bdb31fa76a4b85bcdb86fae9a4418ad9067d2909c58917663fb743", size = 14855088 },
+ { url = "https://files.pythonhosted.org/packages/54/a1/0d02aad39ccf64095d020759375014eaea6b885cd9ecde52d0d4843567f2/uv-0.5.20-py3-none-musllinux_1_1_i686.whl", hash = "sha256:32d8685d262fca595a027ceca584549b0fe87b89be114e500f5af1de0fad2f1d", size = 15315996 },
+ { url = "https://files.pythonhosted.org/packages/54/86/5746288daaedc86da54da1fe1fe1440e01d0acd833995b8e784dba75f85d/uv-0.5.20-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:5af0ae866b0a9f2d7e8c0220401c585de69f5ebc157a582e8cb1014b16da1ef7", size = 16087766 },
+ { url = "https://files.pythonhosted.org/packages/97/3d/1a48ad47d29a8a6f07990eb1d50029f8d7a30a5dead0fd50d9cd47ee283f/uv-0.5.20-py3-none-win32.whl", hash = "sha256:880bc5afdfaaf5329318d897bec9cd860d00c2b2f2ab8979c438862a0c2ed81b", size = 15200613 },
+ { url = "https://files.pythonhosted.org/packages/d9/e7/cad364f24fcb03ff23e4b750d8934e62010fd520955ba64f8e763c1a70b6/uv-0.5.20-py3-none-win_amd64.whl", hash = "sha256:ae9a69696e75d4b8d08dadda84b3e1b914167b2a19cd4c7c746f8c2c2c5ab55a", size = 16560303 },
+]
+
+[[package]]
+name = "vega-datasets"
+version = "0.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pandas" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8f/a0/ce608d9a5b82fce2ebaa2311136b1e1d1dc2807f501bbdfa56bd174fff76/vega_datasets-0.9.0.tar.gz", hash = "sha256:9dbe9834208e8ec32ab44970df315de9102861e4cda13d8e143aab7a80d93fc0", size = 215013 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e6/9f/ca52771fe972e0dcc5167fedb609940e01516066938ff2ee28b273ae4f29/vega_datasets-0.9.0-py3-none-any.whl", hash = "sha256:3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d", size = 210822 },
+]
+
+[[package]]
+name = "vegafusion"
+version = "2.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "arro3-core" },
+ { name = "narwhals" },
+ { name = "packaging" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/a3/7cb762181a2118ab8943d12f1f8a9f85ad0236e399f1b1bdfd0fe471aa6a/vegafusion-2.0.1.tar.gz", hash = "sha256:2d7c41844643beaaab43af46f5cffeb44a963db2d75ecaa267f652f4e716988d", size = 6721316 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/53/82/6d99eca345220d9fee23913394bae07ddf45029d3366e649d1b5dddb111e/vegafusion-2.0.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dcec2f97c564276d429ff1d0ba6f9f5b254089703d909479307c0971b1a46d99", size = 20604733 },
+ { url = "https://files.pythonhosted.org/packages/e3/25/c78aa5b7bd72eec2724071a4b6daba89e1c076746144c3b9c8e54a63a8ee/vegafusion-2.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:21be9d05dd65bd5f9c0077ccef117818280cc807568bd54661ed0b414d440664", size = 18949783 },
+ { url = "https://files.pythonhosted.org/packages/0c/a0/31bb67d9fb03fd4d4596f32ee3c1838ec75514f910e11a51769c3ba656bf/vegafusion-2.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58c02357aa1f4d8fe526546f8d175d3befc7abcb3347948c8d21a3e2bd68ddba", size = 21679790 },
+ { url = "https://files.pythonhosted.org/packages/2a/79/8a8adc84b91b163addd0d018e2d9eb7a98e1e7576afe54a800025e07c0f5/vegafusion-2.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:36cb84020726ffaba92a235e23b048bc49c1736f90fc8f44bb5cdf00b75a7b15", size = 20457099 },
+ { url = "https://files.pythonhosted.org/packages/71/8f/0c927a5840938132666dce7f997600644efd0448a6ed046ef4d7cc0c7f50/vegafusion-2.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:f1b1240b80c860a0d384fadcf33ecfce39e70a33eb565222f6e9c5d42cbf55f5", size = 21234505 },
+]
+
+[[package]]
+name = "virtualenv"
+version = "20.29.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "distlib" },
+ { name = "filelock" },
+ { name = "platformdirs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5a/5d/8d625ebddf9d31c301f85125b78002d4e4401fe1c15c04dca58a54a3056a/virtualenv-20.29.0.tar.gz", hash = "sha256:6345e1ff19d4b1296954cee076baaf58ff2a12a84a338c62b02eda39f20aa982", size = 7658081 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f0/d3/12687ab375bb0e077ea802a5128f7b45eb5de7a7c6cb576ccf9dd59ff80a/virtualenv-20.29.0-py3-none-any.whl", hash = "sha256:c12311863497992dc4b8644f8ea82d3b35bb7ef8ee82e6630d76d0197c39baf9", size = 4282443 },
+]
+
+[[package]]
+name = "vl-convert-python"
+version = "1.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e6/f1/43803e91e12d4ab697eedc5e14029d1630daea0c81abc6321b96a31a7dc0/vl_convert_python-1.7.0.tar.gz", hash = "sha256:bc9e1f8ca0d8d3b3789c66e37cd6a8cf0a83406427d5143133346c2b5004485b", size = 4719466 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/1c/b0dc67d9e51eb9d14c35c79e033a680a92418edd12a3879bb50aade597a1/vl_convert_python-1.7.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:90fba4356bd621bd31e72507a55e26dd13ebe79efa784715743116109afd0d47", size = 28233538 },
+ { url = "https://files.pythonhosted.org/packages/dc/50/4b8b500f0b3c0b24ef3bec01563de412e95dbf27cfe53e403e6fa8514525/vl_convert_python-1.7.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:51f99c58b1d0d74126455ece7d41972740cb4430b8dfdf7e0908270eed5be32d", size = 26940338 },
+ { url = "https://files.pythonhosted.org/packages/95/0f/139568d71fadcb1be697acd2ccd0b79bd1553ca833d4448312191cd33654/vl_convert_python-1.7.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962100d7670b9d35f9bb9745cdf590412f62f57c134b4a142340ba93a4dbddba", size = 29124271 },
+ { url = "https://files.pythonhosted.org/packages/91/3c/c34e52138fa38eb6059cdb2c603ba1433decf4f97cb89e767c04a9605eff/vl_convert_python-1.7.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b50c492b640abb89a54a71e2c26f0f2d2c1cedc42030cc55bcc202670334724", size = 30089941 },
+ { url = "https://files.pythonhosted.org/packages/ae/e2/c4a3fff3efcfeebaab554c9c4b027e875fd339da7f619b144765353a60d1/vl_convert_python-1.7.0-cp37-abi3-win_amd64.whl", hash = "sha256:285bbadb1ce8a922c87f6e75a9544fe10a652d37bd4c1519fb93f90bab381588", size = 29796401 },
+]
+
+[[package]]
+name = "wcwidth"
+version = "0.2.13"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
+]
+
+[[package]]
+name = "widgetsnbextension"
+version = "4.0.13"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 },
+]
+
+[[package]]
+name = "xyzservices"
+version = "2024.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a0/16/ae87cbd2d6bfc40a419077521c35aadf5121725b7bee3d7c51b56f50958b/xyzservices-2024.9.0.tar.gz", hash = "sha256:68fb8353c9dbba4f1ff6c0f2e5e4e596bb9e1db7f94f4f7dfbcb26e25aa66fde", size = 1131900 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4c/d3/e07ce413d16ef64e885bea37551eac4c5ca3ddd440933f9c94594273d0d9/xyzservices-2024.9.0-py3-none-any.whl", hash = "sha256:776ae82b78d6e5ca63dd6a94abb054df8130887a4a308473b54a6bd364de8644", size = 85130 },
+]
+
+[[package]]
+name = "zipp"
+version = "3.21.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 },
+]
+
+[[package]]
+name = "zstandard"
+version = "0.23.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation == 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701 },
+ { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678 },
+ { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098 },
+ { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798 },
+ { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840 },
+ { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337 },
+ { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182 },
+ { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936 },
+ { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705 },
+ { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882 },
+ { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672 },
+ { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043 },
+ { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390 },
+ { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901 },
+ { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596 },
+ { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498 },
+ { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699 },
+ { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681 },
+ { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328 },
+ { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955 },
+ { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944 },
+ { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927 },
+ { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910 },
+ { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544 },
+ { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094 },
+ { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440 },
+ { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091 },
+ { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682 },
+ { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707 },
+ { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792 },
+ { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586 },
+ { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420 },
+ { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 },
+ { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 },
+ { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 },
+ { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 },
+ { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 },
+ { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 },
+ { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 },
+ { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 },
+ { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 },
+ { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 },
+ { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 },
+ { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 },
+ { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 },
+ { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 },
+ { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 },
+ { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 },
+ { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975 },
+ { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448 },
+ { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269 },
+ { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228 },
+ { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891 },
+ { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310 },
+ { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912 },
+ { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946 },
+ { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994 },
+ { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681 },
+ { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239 },
+ { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149 },
+ { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392 },
+ { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299 },
+ { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 },
+ { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 },
+ { url = "https://files.pythonhosted.org/packages/fb/96/4fcafeb7e013a2386d22f974b5b97a0b9a65004ed58c87ae001599bfbd48/zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb", size = 788697 },
+ { url = "https://files.pythonhosted.org/packages/83/ff/a52ce725be69b86a2967ecba0497a8184540cc284c0991125515449e54e2/zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916", size = 633679 },
+ { url = "https://files.pythonhosted.org/packages/34/0f/3dc62db122f6a9c481c335fff6fc9f4e88d8f6e2d47321ee3937328addb4/zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a", size = 4940416 },
+ { url = "https://files.pythonhosted.org/packages/1d/e5/9fe0dd8c85fdc2f635e6660d07872a5dc4b366db566630161e39f9f804e1/zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259", size = 5307693 },
+ { url = "https://files.pythonhosted.org/packages/73/bf/fe62c0cd865c171ee8ed5bc83174b5382a2cb729c8d6162edfb99a83158b/zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4", size = 5341236 },
+ { url = "https://files.pythonhosted.org/packages/39/86/4fe79b30c794286110802a6cd44a73b6a314ac8196b9338c0fbd78c2407d/zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58", size = 5439101 },
+ { url = "https://files.pythonhosted.org/packages/72/ed/cacec235c581ebf8c608c7fb3d4b6b70d1b490d0e5128ea6996f809ecaef/zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15", size = 4860320 },
+ { url = "https://files.pythonhosted.org/packages/f6/1e/2c589a2930f93946b132fc852c574a19d5edc23fad2b9e566f431050c7ec/zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269", size = 4931933 },
+ { url = "https://files.pythonhosted.org/packages/8e/f5/30eadde3686d902b5d4692bb5f286977cbc4adc082145eb3f49d834b2eae/zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700", size = 5463878 },
+ { url = "https://files.pythonhosted.org/packages/e0/c8/8aed1f0ab9854ef48e5ad4431367fcb23ce73f0304f7b72335a8edc66556/zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9", size = 4857192 },
+ { url = "https://files.pythonhosted.org/packages/a8/c6/55e666cfbcd032b9e271865e8578fec56e5594d4faeac379d371526514f5/zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69", size = 4696513 },
+ { url = "https://files.pythonhosted.org/packages/dc/bd/720b65bea63ec9de0ac7414c33b9baf271c8de8996e5ff324dc93fc90ff1/zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70", size = 5204823 },
+ { url = "https://files.pythonhosted.org/packages/d8/40/d678db1556e3941d330cd4e95623a63ef235b18547da98fa184cbc028ecf/zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2", size = 5666490 },
+ { url = "https://files.pythonhosted.org/packages/ed/cc/c89329723d7515898a1fc7ef5d251264078548c505719d13e9511800a103/zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5", size = 5196622 },
+ { url = "https://files.pythonhosted.org/packages/78/4c/634289d41e094327a94500dfc919e58841b10ea3a9efdfafbac614797ec2/zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274", size = 430620 },
+ { url = "https://files.pythonhosted.org/packages/a2/e2/0b0c5a0f4f7699fecd92c1ba6278ef9b01f2b0b0dd46f62bfc6729c05659/zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58", size = 495528 },
+]