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 }, +]