From 810e5f530d2c81848bdec62975580e238bb69789 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Thu, 23 Feb 2023 05:53:48 +0000 Subject: [PATCH 1/9] Type hint use_signature for better autocompletion and function signatures --- altair/utils/core.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/altair/utils/core.py b/altair/utils/core.py index 165816927..c3e6efd7e 100644 --- a/altair/utils/core.py +++ b/altair/utils/core.py @@ -9,6 +9,7 @@ import sys import traceback import warnings +from typing import ParamSpec, Callable, TypeVar, Any import jsonschema import pandas as pd @@ -22,6 +23,9 @@ # Import for pandas < 0.20.0 from pandas.lib import infer_dtype as _infer_dtype +_V = TypeVar("_V") +_P = ParamSpec("_P") + def infer_dtype(value): """Infer the dtype of the value. @@ -552,10 +556,10 @@ def parse_shorthand( return attrs -def use_signature(Obj): +def use_signature(Obj: Callable[_P, Any]): """Apply call signature and documentation of Obj to the decorated method""" - def decorate(f): + def decorate(f: Callable[..., _V]) -> Callable[_P, _V]: # call-signature of f is exposed via __wrapped__. # we want it to mimic Obj.__init__ f.__wrapped__ = Obj.__init__ From 7dce731e1876c897e2a7fbe8adea004ee81583a2 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Thu, 23 Feb 2023 06:02:32 +0000 Subject: [PATCH 2/9] Add typing_rextensions as a new requirement --- altair/utils/core.py | 8 +++++++- doc/getting_started/installation.rst | 4 +++- requirements.txt | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/altair/utils/core.py b/altair/utils/core.py index c3e6efd7e..50c4a9294 100644 --- a/altair/utils/core.py +++ b/altair/utils/core.py @@ -9,7 +9,7 @@ import sys import traceback import warnings -from typing import ParamSpec, Callable, TypeVar, Any +from typing import Callable, TypeVar, Any import jsonschema import pandas as pd @@ -17,6 +17,12 @@ from altair.utils.schemapi import SchemaBase +try: + from typing import ParamSpec +except ImportError: + # ParamSpec was introduced in typing in Python 3.10 + from typing_extensions import ParamSpec + try: from pandas.api.types import infer_dtype as _infer_dtype except ImportError: diff --git a/doc/getting_started/installation.rst b/doc/getting_started/installation.rst index 0199182b0..ecdf23102 100644 --- a/doc/getting_started/installation.rst +++ b/doc/getting_started/installation.rst @@ -24,12 +24,13 @@ Altair has the following dependencies, all of which are installed automatically with the above installation commands: - python 3.6 or newer -- importlib_metadata_ (python<3.8) - jinja2 - jsonschema_ - NumPy_ - Pandas_ - Toolz_ +- importlib_metadata_ (python<3.8) +- typing_extensions_ (python<3.11) To run Altair's full test suite and build Altair's documentation requires a few additional dependencies, see `CONTRIBUTING.md ` @@ -68,6 +69,7 @@ development version directly from GitHub using: .. _IPython: https://github.com/ipython/ipython .. _importlib_metadata: https://github.com/python/importlib_metadata +.. _typing_extensions: https://github.com/python/typing_extensions .. _jsonschema: https://github.com/Julian/jsonschema .. _NumPy: http://www.numpy.org/ .. _Pandas: http://pandas.pydata.org diff --git a/requirements.txt b/requirements.txt index d6ab9d282..51a29a81a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,6 @@ importlib_metadata; python_version < "3.8" +# typing_extensions.Self requires at least 4.0.1 +typing_extensions>=4.0.1; python_version < "3.11" jinja2 jsonschema>=3.0 numpy From 942d1c8cb130d81896335384d77816fbb079d9c4 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Thu, 23 Feb 2023 06:30:17 +0000 Subject: [PATCH 3/9] Switch to Self for self-return-type annotation --- altair/vegalite/v5/api.py | 151 ++++----- altair/vegalite/v5/schema/mixins.py | 494 ++++++++++++++-------------- tools/generate_schema_wrapper.py | 49 +-- tools/update_init_file.py | 7 + 4 files changed, 345 insertions(+), 356 deletions(-) diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py index 456a55a58..26351b6e7 100644 --- a/altair/vegalite/v5/api.py +++ b/altair/vegalite/v5/api.py @@ -1,5 +1,4 @@ import warnings -from typing import TypeVar import hashlib import io @@ -16,15 +15,11 @@ from .display import renderers, VEGALITE_VERSION, VEGAEMBED_VERSION, VEGA_VERSION from .theme import themes -_TTopLevelMixin = TypeVar("_TTopLevelMixin", bound="TopLevelMixin") -_TEncodingMixin = TypeVar("_TEncodingMixin", bound="_EncodingMixin") -_TChart = TypeVar("_TChart", bound="Chart") -_TRepeatChart = TypeVar("_TRepeatChart", bound="RepeatChart") -_TConcatChart = TypeVar("_TConcatChart", bound="ConcatChart") -_THConcatChart = TypeVar("_THConcatChart", bound="HConcatChart") -_TVConcatChart = TypeVar("_TVConcatChart", bound="VConcatChart") -_TLayerChart = TypeVar("_TLayerChart", bound="LayerChart") -_TFacetChart = TypeVar("_TFacetChart", bound="FacetChart") +try: + from typing import Self +except ImportError: + # Self was introduced in typing in Python 3.11 + from typing_extensions import Self # ------------------------------------------------------------------------ @@ -748,7 +743,7 @@ def repeat( return RepeatChart(spec=self, repeat=repeat, columns=columns, **kwargs) - def properties(self: _TTopLevelMixin, **kwargs) -> _TTopLevelMixin: + def properties(self, **kwargs) -> Self: """Set top-level properties of the Chart. Argument names and types are the same as class initialization. @@ -767,7 +762,7 @@ def properties(self: _TTopLevelMixin, **kwargs) -> _TTopLevelMixin: return copy def project( - self: _TTopLevelMixin, + self, type=Undefined, center=Undefined, clipAngle=Undefined, @@ -788,7 +783,7 @@ def project( tilt=Undefined, translate=Undefined, **kwds, - ) -> _TTopLevelMixin: + ) -> Self: """Add a geographic projection to the chart. This is generally used either with ``mark_geoshape`` or with the @@ -898,8 +893,8 @@ def _add_transform(self, *transforms): return copy def transform_aggregate( - self: _TTopLevelMixin, aggregate=Undefined, groupby=Undefined, **kwds - ) -> _TTopLevelMixin: + self, aggregate=Undefined, groupby=Undefined, **kwds + ) -> Self: """ Add an :class:`AggregateTransform` to the schema. @@ -974,8 +969,8 @@ def transform_aggregate( ) def transform_bin( - self: _TTopLevelMixin, as_=Undefined, field=Undefined, bin=True, **kwargs - ) -> _TTopLevelMixin: + self, as_=Undefined, field=Undefined, bin=True, **kwargs + ) -> Self: """ Add a :class:`BinTransform` to the schema. @@ -1032,8 +1027,8 @@ def transform_bin( return self._add_transform(core.BinTransform(**kwargs)) def transform_calculate( - self: _TTopLevelMixin, as_=Undefined, calculate=Undefined, **kwargs - ) -> _TTopLevelMixin: + self, as_=Undefined, calculate=Undefined, **kwargs + ) -> Self: """ Add a :class:`CalculateTransform` to the schema. @@ -1096,7 +1091,7 @@ def transform_calculate( return self def transform_density( - self: _TTopLevelMixin, + self, density, as_=Undefined, bandwidth=Undefined, @@ -1107,7 +1102,7 @@ def transform_density( maxsteps=Undefined, minsteps=Undefined, steps=Undefined, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`DensityTransform` to the spec. Parameters @@ -1164,7 +1159,7 @@ def transform_density( ) def transform_impute( - self: _TTopLevelMixin, + self, impute, key, frame=Undefined, @@ -1172,7 +1167,7 @@ def transform_impute( keyvals=Undefined, method=Undefined, value=Undefined, - ) -> _TTopLevelMixin: + ) -> Self: """ Add an :class:`ImputeTransform` to the schema. @@ -1234,8 +1229,8 @@ def transform_impute( ) def transform_joinaggregate( - self: _TTopLevelMixin, joinaggregate=Undefined, groupby=Undefined, **kwargs - ) -> _TTopLevelMixin: + self, joinaggregate=Undefined, groupby=Undefined, **kwargs + ) -> Self: """ Add a :class:`JoinAggregateTransform` to the schema. @@ -1286,7 +1281,7 @@ def transform_joinaggregate( ) # TODO: Update docstring - def transform_filter(self: _TTopLevelMixin, filter, **kwargs) -> _TTopLevelMixin: + def transform_filter(self, filter, **kwargs) -> Self: """ Add a :class:`FilterTransform` to the schema. @@ -1320,8 +1315,8 @@ def transform_filter(self: _TTopLevelMixin, filter, **kwargs) -> _TTopLevelMixin return self._add_transform(core.FilterTransform(filter=filter, **kwargs)) def transform_flatten( - self: _TTopLevelMixin, flatten, as_=Undefined - ) -> _TTopLevelMixin: + self, flatten, as_=Undefined + ) -> Self: """Add a :class:`FlattenTransform` to the schema. Parameters @@ -1349,7 +1344,7 @@ def transform_flatten( core.FlattenTransform(flatten=flatten, **{"as": as_}) ) - def transform_fold(self: _TTopLevelMixin, fold, as_=Undefined) -> _TTopLevelMixin: + def transform_fold(self, fold, as_=Undefined) -> Self: """Add a :class:`FoldTransform` to the spec. Parameters @@ -1373,13 +1368,13 @@ def transform_fold(self: _TTopLevelMixin, fold, as_=Undefined) -> _TTopLevelMixi return self._add_transform(core.FoldTransform(fold=fold, **{"as": as_})) def transform_loess( - self: _TTopLevelMixin, + self, on, loess, as_=Undefined, bandwidth=Undefined, groupby=Undefined, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`LoessTransform` to the spec. Parameters @@ -1415,13 +1410,13 @@ def transform_loess( ) def transform_lookup( - self: _TTopLevelMixin, + self, lookup=Undefined, from_=Undefined, as_=Undefined, default=Undefined, **kwargs, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`DataLookupTransform` or :class:`SelectionLookupTransform` to the chart Parameters @@ -1470,13 +1465,13 @@ def transform_lookup( return self._add_transform(core.LookupTransform(**kwargs)) def transform_pivot( - self: _TTopLevelMixin, + self, pivot, value, groupby=Undefined, limit=Undefined, op=Undefined, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`PivotTransform` to the chart. Parameters @@ -1516,13 +1511,13 @@ def transform_pivot( ) def transform_quantile( - self: _TTopLevelMixin, + self, quantile, as_=Undefined, groupby=Undefined, probs=Undefined, step=Undefined, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`QuantileTransform` to the chart Parameters @@ -1562,7 +1557,7 @@ def transform_quantile( ) def transform_regression( - self: _TTopLevelMixin, + self, on, regression, as_=Undefined, @@ -1571,7 +1566,7 @@ def transform_regression( method=Undefined, order=Undefined, params=Undefined, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`RegressionTransform` to the chart. Parameters @@ -1626,7 +1621,7 @@ def transform_regression( ) ) - def transform_sample(self: _TTopLevelMixin, sample=1000) -> _TTopLevelMixin: + def transform_sample(self, sample=1000) -> Self: """ Add a :class:`SampleTransform` to the schema. @@ -1647,8 +1642,8 @@ def transform_sample(self: _TTopLevelMixin, sample=1000) -> _TTopLevelMixin: return self._add_transform(core.SampleTransform(sample)) def transform_stack( - self: _TTopLevelMixin, as_, stack, groupby, offset=Undefined, sort=Undefined - ) -> _TTopLevelMixin: + self, as_, stack, groupby, offset=Undefined, sort=Undefined + ) -> Self: """ Add a :class:`StackTransform` to the schema. @@ -1684,12 +1679,12 @@ def transform_stack( ) def transform_timeunit( - self: _TTopLevelMixin, + self, as_=Undefined, field=Undefined, timeUnit=Undefined, **kwargs, - ) -> _TTopLevelMixin: + ) -> Self: """ Add a :class:`TimeUnitTransform` to the schema. @@ -1768,14 +1763,14 @@ def transform_timeunit( return self def transform_window( - self: _TTopLevelMixin, + self, window=Undefined, frame=Undefined, groupby=Undefined, ignorePeers=Undefined, sort=Undefined, **kwargs, - ) -> _TTopLevelMixin: + ) -> Self: """Add a :class:`WindowTransform` to the schema Parameters @@ -2014,21 +2009,21 @@ def _set_resolve(self, **kwargs): return copy @utils.use_signature(core.AxisResolveMap) - def resolve_axis(self: _TTopLevelMixin, *args, **kwargs) -> _TTopLevelMixin: + def resolve_axis(self, *args, **kwargs) -> Self: return self._set_resolve(axis=core.AxisResolveMap(*args, **kwargs)) @utils.use_signature(core.LegendResolveMap) - def resolve_legend(self: _TTopLevelMixin, *args, **kwargs) -> _TTopLevelMixin: + def resolve_legend(self, *args, **kwargs) -> Self: return self._set_resolve(legend=core.LegendResolveMap(*args, **kwargs)) @utils.use_signature(core.ScaleResolveMap) - def resolve_scale(self: _TTopLevelMixin, *args, **kwargs) -> _TTopLevelMixin: + def resolve_scale(self, *args, **kwargs) -> Self: return self._set_resolve(scale=core.ScaleResolveMap(*args, **kwargs)) class _EncodingMixin(object): @utils.use_signature(core.FacetedEncoding) - def encode(self: _TEncodingMixin, *args, **kwargs) -> _TEncodingMixin: + def encode(self, *args, **kwargs) -> Self: # Convert args to kwargs based on their types. kwargs = utils.infer_encoding_types(args, kwargs, channels) @@ -2231,7 +2226,7 @@ def to_dict(self, *args, **kwargs) -> dict: return super(Chart, copy).to_dict(*args, **kwargs) return super().to_dict(*args, **kwargs) - def add_params(self: _TChart, *params) -> _TChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params: return self @@ -2246,10 +2241,10 @@ def add_params(self: _TChart, *params) -> _TChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _TChart, *params) -> _TChart: + def add_selection(self, *params) -> Self: return self.add_params(*params) - def interactive(self: _TChart, name=None, bind_x=True, bind_y=True) -> _TChart: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters @@ -2406,8 +2401,8 @@ def __init__( ) def interactive( - self: _TRepeatChart, name=None, bind_x=True, bind_y=True - ) -> _TRepeatChart: + self, name=None, bind_x=True, bind_y=True + ) -> Self: """Make chart axes scales interactive Parameters @@ -2430,7 +2425,7 @@ def interactive( copy.spec = copy.spec.interactive(name=name, bind_x=bind_x, bind_y=bind_y) return copy - def add_params(self: _TRepeatChart, *params) -> _TRepeatChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params or self.spec is Undefined: return self @@ -2441,7 +2436,7 @@ def add_params(self: _TRepeatChart, *params) -> _TRepeatChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _TRepeatChart, *selections) -> _TRepeatChart: + def add_selection(self, *selections) -> Self: return self.add_params(*selections) @@ -2492,8 +2487,8 @@ def __or__(self, other): return copy def interactive( - self: _TConcatChart, name=None, bind_x=True, bind_y=True - ) -> _TConcatChart: + self, name=None, bind_x=True, bind_y=True + ) -> Self: """Make chart axes scales interactive Parameters @@ -2519,7 +2514,7 @@ def interactive( encodings.append("y") return self.add_params(selection_interval(bind="scales", encodings=encodings)) - def add_params(self: _TConcatChart, *params) -> _TConcatChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params or not self.concat: return self @@ -2530,7 +2525,7 @@ def add_params(self: _TConcatChart, *params) -> _TConcatChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _TConcatChart, *selections) -> _TConcatChart: + def add_selection(self, *selections) -> Self: return self.add_params(*selections) @@ -2564,8 +2559,8 @@ def __or__(self, other): return copy def interactive( - self: _THConcatChart, name=None, bind_x=True, bind_y=True - ) -> _THConcatChart: + self, name=None, bind_x=True, bind_y=True + ) -> Self: """Make chart axes scales interactive Parameters @@ -2591,7 +2586,7 @@ def interactive( encodings.append("y") return self.add_params(selection_interval(bind="scales", encodings=encodings)) - def add_params(self: _THConcatChart, *params) -> _THConcatChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params or not self.hconcat: return self @@ -2602,7 +2597,7 @@ def add_params(self: _THConcatChart, *params) -> _THConcatChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _THConcatChart, *selections) -> _THConcatChart: + def add_selection(self, *selections) -> Self: return self.add_params(*selections) @@ -2636,8 +2631,8 @@ def __and__(self, other): return copy def interactive( - self: _TVConcatChart, name=None, bind_x=True, bind_y=True - ) -> _TVConcatChart: + self, name=None, bind_x=True, bind_y=True + ) -> Self: """Make chart axes scales interactive Parameters @@ -2663,7 +2658,7 @@ def interactive( encodings.append("y") return self.add_params(selection_interval(bind="scales", encodings=encodings)) - def add_params(self: _TVConcatChart, *params) -> _TVConcatChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params or not self.vconcat: return self @@ -2674,7 +2669,7 @@ def add_params(self: _TVConcatChart, *params) -> _TVConcatChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _TVConcatChart, *selections) -> _TVConcatChart: + def add_selection(self, *selections) -> Self: return self.add_params(*selections) @@ -2719,15 +2714,15 @@ def __add__(self, other): copy += other return copy - def add_layers(self: _TLayerChart, *layers) -> _TLayerChart: + def add_layers(self, *layers) -> Self: copy = self.copy(deep=["layer"]) for layer in layers: copy += layer return copy def interactive( - self: _TLayerChart, name=None, bind_x=True, bind_y=True - ) -> _TLayerChart: + self, name=None, bind_x=True, bind_y=True + ) -> Self: """Make chart axes scales interactive Parameters @@ -2756,7 +2751,7 @@ def interactive( ) return copy - def add_params(self: _TLayerChart, *params) -> _TLayerChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params or not self.layer: return self @@ -2767,7 +2762,7 @@ def add_params(self: _TLayerChart, *params) -> _TLayerChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _TLayerChart, *selections) -> _TLayerChart: + def add_selection(self, *selections) -> Self: return self.add_params(*selections) @@ -2797,8 +2792,8 @@ def __init__( ) def interactive( - self: _TFacetChart, name=None, bind_x=True, bind_y=True - ) -> _TFacetChart: + self, name=None, bind_x=True, bind_y=True + ) -> Self: """Make chart axes scales interactive Parameters @@ -2821,7 +2816,7 @@ def interactive( copy.spec = copy.spec.interactive(name=name, bind_x=bind_x, bind_y=bind_y) return copy - def add_params(self: _TFacetChart, *params) -> _TFacetChart: + def add_params(self, *params) -> Self: """Add one or more parameters to the chart.""" if not params or self.spec is Undefined: return self @@ -2832,7 +2827,7 @@ def add_params(self: _TFacetChart, *params) -> _TFacetChart: @utils.deprecation.deprecated( message="'add_selection' is deprecated. Use 'add_params' instead." ) - def add_selection(self: _TFacetChart, *selections) -> _TFacetChart: + def add_selection(self, *selections) -> Self: return self.add_params(*selections) diff --git a/altair/vegalite/v5/schema/mixins.py b/altair/vegalite/v5/schema/mixins.py index 3db7c794f..631447b8d 100644 --- a/altair/vegalite/v5/schema/mixins.py +++ b/altair/vegalite/v5/schema/mixins.py @@ -3,19 +3,21 @@ from . import core from altair.utils import use_signature from altair.utils.schemapi import Undefined -from typing import TypeVar -_TConfigMethodMixin = TypeVar("_TConfigMethodMixin", bound="ConfigMethodMixin") -_TMarkMethodMixin = TypeVar("_TMarkMethodMixin", bound="MarkMethodMixin") +try: + from typing import Self +except ImportError: + # Self was introduced in typing in Python 3.11 + from typing_extensions import Self class MarkMethodMixin(object): """A mixin class that defines mark methods""" - def mark_arc(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_arc(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, dir=Undefined, @@ -35,7 +37,7 @@ def mark_arc(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Und timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, yOffset=Undefined, - **kwds) -> _TMarkMethodMixin: + **kwds) -> Self: """Set the chart's mark to 'arc' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -69,10 +71,10 @@ def mark_arc(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Und copy.mark = "arc" return copy - def mark_area(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_area(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, @@ -92,7 +94,7 @@ def mark_area(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, - yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'area' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -126,10 +128,10 @@ def mark_area(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un copy.mark = "area" return copy - def mark_bar(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_bar(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, dir=Undefined, @@ -149,7 +151,7 @@ def mark_bar(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Und timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, yOffset=Undefined, - **kwds) -> _TMarkMethodMixin: + **kwds) -> Self: """Set the chart's mark to 'bar' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -183,30 +185,30 @@ def mark_bar(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Und copy.mark = "bar" return copy - def mark_image(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, - cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, - cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, - cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, - description=Undefined, dir=Undefined, discreteBandSize=Undefined, dx=Undefined, - dy=Undefined, ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, - filled=Undefined, font=Undefined, fontSize=Undefined, fontStyle=Undefined, - fontWeight=Undefined, height=Undefined, href=Undefined, innerRadius=Undefined, - interpolate=Undefined, invalid=Undefined, limit=Undefined, line=Undefined, - lineBreak=Undefined, lineHeight=Undefined, opacity=Undefined, order=Undefined, - orient=Undefined, outerRadius=Undefined, padAngle=Undefined, point=Undefined, - radius=Undefined, radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, - shape=Undefined, size=Undefined, smooth=Undefined, stroke=Undefined, - strokeCap=Undefined, strokeDash=Undefined, strokeDashOffset=Undefined, - strokeJoin=Undefined, strokeMiterLimit=Undefined, strokeOffset=Undefined, - strokeOpacity=Undefined, strokeWidth=Undefined, style=Undefined, tension=Undefined, - text=Undefined, theta=Undefined, theta2=Undefined, theta2Offset=Undefined, - thetaOffset=Undefined, thickness=Undefined, timeUnitBandPosition=Undefined, - timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, - x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, - y2=Undefined, y2Offset=Undefined, yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_image(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, + cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, + cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, + dir=Undefined, discreteBandSize=Undefined, dx=Undefined, dy=Undefined, + ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, filled=Undefined, + font=Undefined, fontSize=Undefined, fontStyle=Undefined, fontWeight=Undefined, + height=Undefined, href=Undefined, innerRadius=Undefined, interpolate=Undefined, + invalid=Undefined, limit=Undefined, line=Undefined, lineBreak=Undefined, + lineHeight=Undefined, opacity=Undefined, order=Undefined, orient=Undefined, + outerRadius=Undefined, padAngle=Undefined, point=Undefined, radius=Undefined, + radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, shape=Undefined, + size=Undefined, smooth=Undefined, stroke=Undefined, strokeCap=Undefined, + strokeDash=Undefined, strokeDashOffset=Undefined, strokeJoin=Undefined, + strokeMiterLimit=Undefined, strokeOffset=Undefined, strokeOpacity=Undefined, + strokeWidth=Undefined, style=Undefined, tension=Undefined, text=Undefined, + theta=Undefined, theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, + thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, + tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, + x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'image' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -240,10 +242,10 @@ def mark_image(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=U copy.mark = "image" return copy - def mark_line(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_line(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, @@ -263,7 +265,7 @@ def mark_line(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, - yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'line' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -297,30 +299,30 @@ def mark_line(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un copy.mark = "line" return copy - def mark_point(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, - cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, - cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, - cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, - description=Undefined, dir=Undefined, discreteBandSize=Undefined, dx=Undefined, - dy=Undefined, ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, - filled=Undefined, font=Undefined, fontSize=Undefined, fontStyle=Undefined, - fontWeight=Undefined, height=Undefined, href=Undefined, innerRadius=Undefined, - interpolate=Undefined, invalid=Undefined, limit=Undefined, line=Undefined, - lineBreak=Undefined, lineHeight=Undefined, opacity=Undefined, order=Undefined, - orient=Undefined, outerRadius=Undefined, padAngle=Undefined, point=Undefined, - radius=Undefined, radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, - shape=Undefined, size=Undefined, smooth=Undefined, stroke=Undefined, - strokeCap=Undefined, strokeDash=Undefined, strokeDashOffset=Undefined, - strokeJoin=Undefined, strokeMiterLimit=Undefined, strokeOffset=Undefined, - strokeOpacity=Undefined, strokeWidth=Undefined, style=Undefined, tension=Undefined, - text=Undefined, theta=Undefined, theta2=Undefined, theta2Offset=Undefined, - thetaOffset=Undefined, thickness=Undefined, timeUnitBandPosition=Undefined, - timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, - x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, - y2=Undefined, y2Offset=Undefined, yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_point(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, + cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, + cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, + dir=Undefined, discreteBandSize=Undefined, dx=Undefined, dy=Undefined, + ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, filled=Undefined, + font=Undefined, fontSize=Undefined, fontStyle=Undefined, fontWeight=Undefined, + height=Undefined, href=Undefined, innerRadius=Undefined, interpolate=Undefined, + invalid=Undefined, limit=Undefined, line=Undefined, lineBreak=Undefined, + lineHeight=Undefined, opacity=Undefined, order=Undefined, orient=Undefined, + outerRadius=Undefined, padAngle=Undefined, point=Undefined, radius=Undefined, + radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, shape=Undefined, + size=Undefined, smooth=Undefined, stroke=Undefined, strokeCap=Undefined, + strokeDash=Undefined, strokeDashOffset=Undefined, strokeJoin=Undefined, + strokeMiterLimit=Undefined, strokeOffset=Undefined, strokeOpacity=Undefined, + strokeWidth=Undefined, style=Undefined, tension=Undefined, text=Undefined, + theta=Undefined, theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, + thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, + tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, + x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'point' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -354,10 +356,10 @@ def mark_point(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=U copy.mark = "point" return copy - def mark_rect(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_rect(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, @@ -377,7 +379,7 @@ def mark_rect(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, - yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'rect' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -411,10 +413,10 @@ def mark_rect(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un copy.mark = "rect" return copy - def mark_rule(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_rule(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, @@ -434,7 +436,7 @@ def mark_rule(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, - yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'rule' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -468,10 +470,10 @@ def mark_rule(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un copy.mark = "rule" return copy - def mark_text(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_text(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, @@ -491,7 +493,7 @@ def mark_text(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, - yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'text' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -525,10 +527,10 @@ def mark_text(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un copy.mark = "text" return copy - def mark_tick(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + def mark_tick(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, @@ -548,7 +550,7 @@ def mark_tick(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, - yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'tick' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -582,30 +584,30 @@ def mark_tick(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Un copy.mark = "tick" return copy - def mark_trail(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, - cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, - cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, - cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, - description=Undefined, dir=Undefined, discreteBandSize=Undefined, dx=Undefined, - dy=Undefined, ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, - filled=Undefined, font=Undefined, fontSize=Undefined, fontStyle=Undefined, - fontWeight=Undefined, height=Undefined, href=Undefined, innerRadius=Undefined, - interpolate=Undefined, invalid=Undefined, limit=Undefined, line=Undefined, - lineBreak=Undefined, lineHeight=Undefined, opacity=Undefined, order=Undefined, - orient=Undefined, outerRadius=Undefined, padAngle=Undefined, point=Undefined, - radius=Undefined, radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, - shape=Undefined, size=Undefined, smooth=Undefined, stroke=Undefined, - strokeCap=Undefined, strokeDash=Undefined, strokeDashOffset=Undefined, - strokeJoin=Undefined, strokeMiterLimit=Undefined, strokeOffset=Undefined, - strokeOpacity=Undefined, strokeWidth=Undefined, style=Undefined, tension=Undefined, - text=Undefined, theta=Undefined, theta2=Undefined, theta2Offset=Undefined, - thetaOffset=Undefined, thickness=Undefined, timeUnitBandPosition=Undefined, - timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, - x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, - y2=Undefined, y2Offset=Undefined, yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_trail(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, + cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, + cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, + dir=Undefined, discreteBandSize=Undefined, dx=Undefined, dy=Undefined, + ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, filled=Undefined, + font=Undefined, fontSize=Undefined, fontStyle=Undefined, fontWeight=Undefined, + height=Undefined, href=Undefined, innerRadius=Undefined, interpolate=Undefined, + invalid=Undefined, limit=Undefined, line=Undefined, lineBreak=Undefined, + lineHeight=Undefined, opacity=Undefined, order=Undefined, orient=Undefined, + outerRadius=Undefined, padAngle=Undefined, point=Undefined, radius=Undefined, + radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, shape=Undefined, + size=Undefined, smooth=Undefined, stroke=Undefined, strokeCap=Undefined, + strokeDash=Undefined, strokeDashOffset=Undefined, strokeJoin=Undefined, + strokeMiterLimit=Undefined, strokeOffset=Undefined, strokeOpacity=Undefined, + strokeWidth=Undefined, style=Undefined, tension=Undefined, text=Undefined, + theta=Undefined, theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, + thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, + tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, + x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'trail' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -639,31 +641,30 @@ def mark_trail(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=U copy.mark = "trail" return copy - def mark_circle(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, - cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, - cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, - cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, - description=Undefined, dir=Undefined, discreteBandSize=Undefined, dx=Undefined, - dy=Undefined, ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, - filled=Undefined, font=Undefined, fontSize=Undefined, fontStyle=Undefined, - fontWeight=Undefined, height=Undefined, href=Undefined, innerRadius=Undefined, - interpolate=Undefined, invalid=Undefined, limit=Undefined, line=Undefined, - lineBreak=Undefined, lineHeight=Undefined, opacity=Undefined, order=Undefined, - orient=Undefined, outerRadius=Undefined, padAngle=Undefined, point=Undefined, - radius=Undefined, radius2=Undefined, radius2Offset=Undefined, - radiusOffset=Undefined, shape=Undefined, size=Undefined, smooth=Undefined, - stroke=Undefined, strokeCap=Undefined, strokeDash=Undefined, - strokeDashOffset=Undefined, strokeJoin=Undefined, strokeMiterLimit=Undefined, - strokeOffset=Undefined, strokeOpacity=Undefined, strokeWidth=Undefined, - style=Undefined, tension=Undefined, text=Undefined, theta=Undefined, - theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, + def mark_circle(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, + cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, + cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, + dir=Undefined, discreteBandSize=Undefined, dx=Undefined, dy=Undefined, + ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, filled=Undefined, + font=Undefined, fontSize=Undefined, fontStyle=Undefined, fontWeight=Undefined, + height=Undefined, href=Undefined, innerRadius=Undefined, interpolate=Undefined, + invalid=Undefined, limit=Undefined, line=Undefined, lineBreak=Undefined, + lineHeight=Undefined, opacity=Undefined, order=Undefined, orient=Undefined, + outerRadius=Undefined, padAngle=Undefined, point=Undefined, radius=Undefined, + radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, shape=Undefined, + size=Undefined, smooth=Undefined, stroke=Undefined, strokeCap=Undefined, + strokeDash=Undefined, strokeDashOffset=Undefined, strokeJoin=Undefined, + strokeMiterLimit=Undefined, strokeOffset=Undefined, strokeOpacity=Undefined, + strokeWidth=Undefined, style=Undefined, tension=Undefined, text=Undefined, + theta=Undefined, theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, - y2Offset=Undefined, yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + y2Offset=Undefined, yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'circle' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -697,31 +698,30 @@ def mark_circle(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria= copy.mark = "circle" return copy - def mark_square(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, - cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, - cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, - cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, - description=Undefined, dir=Undefined, discreteBandSize=Undefined, dx=Undefined, - dy=Undefined, ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, - filled=Undefined, font=Undefined, fontSize=Undefined, fontStyle=Undefined, - fontWeight=Undefined, height=Undefined, href=Undefined, innerRadius=Undefined, - interpolate=Undefined, invalid=Undefined, limit=Undefined, line=Undefined, - lineBreak=Undefined, lineHeight=Undefined, opacity=Undefined, order=Undefined, - orient=Undefined, outerRadius=Undefined, padAngle=Undefined, point=Undefined, - radius=Undefined, radius2=Undefined, radius2Offset=Undefined, - radiusOffset=Undefined, shape=Undefined, size=Undefined, smooth=Undefined, - stroke=Undefined, strokeCap=Undefined, strokeDash=Undefined, - strokeDashOffset=Undefined, strokeJoin=Undefined, strokeMiterLimit=Undefined, - strokeOffset=Undefined, strokeOpacity=Undefined, strokeWidth=Undefined, - style=Undefined, tension=Undefined, text=Undefined, theta=Undefined, - theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, + def mark_square(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, + cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, + cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, + dir=Undefined, discreteBandSize=Undefined, dx=Undefined, dy=Undefined, + ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, filled=Undefined, + font=Undefined, fontSize=Undefined, fontStyle=Undefined, fontWeight=Undefined, + height=Undefined, href=Undefined, innerRadius=Undefined, interpolate=Undefined, + invalid=Undefined, limit=Undefined, line=Undefined, lineBreak=Undefined, + lineHeight=Undefined, opacity=Undefined, order=Undefined, orient=Undefined, + outerRadius=Undefined, padAngle=Undefined, point=Undefined, radius=Undefined, + radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, shape=Undefined, + size=Undefined, smooth=Undefined, stroke=Undefined, strokeCap=Undefined, + strokeDash=Undefined, strokeDashOffset=Undefined, strokeJoin=Undefined, + strokeMiterLimit=Undefined, strokeOffset=Undefined, strokeOpacity=Undefined, + strokeWidth=Undefined, style=Undefined, tension=Undefined, text=Undefined, + theta=Undefined, theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, - y2Offset=Undefined, yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + y2Offset=Undefined, yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'square' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -755,31 +755,31 @@ def mark_square(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria= copy.mark = "square" return copy - def mark_geoshape(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, aria=Undefined, - ariaRole=Undefined, ariaRoleDescription=Undefined, aspect=Undefined, - bandSize=Undefined, baseline=Undefined, binSpacing=Undefined, blend=Undefined, - clip=Undefined, color=Undefined, continuousBandSize=Undefined, - cornerRadius=Undefined, cornerRadiusBottomLeft=Undefined, - cornerRadiusBottomRight=Undefined, cornerRadiusEnd=Undefined, - cornerRadiusTopLeft=Undefined, cornerRadiusTopRight=Undefined, cursor=Undefined, - description=Undefined, dir=Undefined, discreteBandSize=Undefined, dx=Undefined, - dy=Undefined, ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, - filled=Undefined, font=Undefined, fontSize=Undefined, fontStyle=Undefined, - fontWeight=Undefined, height=Undefined, href=Undefined, innerRadius=Undefined, - interpolate=Undefined, invalid=Undefined, limit=Undefined, line=Undefined, - lineBreak=Undefined, lineHeight=Undefined, opacity=Undefined, order=Undefined, - orient=Undefined, outerRadius=Undefined, padAngle=Undefined, point=Undefined, - radius=Undefined, radius2=Undefined, radius2Offset=Undefined, - radiusOffset=Undefined, shape=Undefined, size=Undefined, smooth=Undefined, - stroke=Undefined, strokeCap=Undefined, strokeDash=Undefined, - strokeDashOffset=Undefined, strokeJoin=Undefined, strokeMiterLimit=Undefined, - strokeOffset=Undefined, strokeOpacity=Undefined, strokeWidth=Undefined, - style=Undefined, tension=Undefined, text=Undefined, theta=Undefined, - theta2=Undefined, theta2Offset=Undefined, thetaOffset=Undefined, - thickness=Undefined, timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, - tooltip=Undefined, url=Undefined, width=Undefined, x=Undefined, x2=Undefined, - x2Offset=Undefined, xOffset=Undefined, y=Undefined, y2=Undefined, - y2Offset=Undefined, yOffset=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_geoshape(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRole=Undefined, + ariaRoleDescription=Undefined, aspect=Undefined, bandSize=Undefined, + baseline=Undefined, binSpacing=Undefined, blend=Undefined, clip=Undefined, + color=Undefined, continuousBandSize=Undefined, cornerRadius=Undefined, + cornerRadiusBottomLeft=Undefined, cornerRadiusBottomRight=Undefined, + cornerRadiusEnd=Undefined, cornerRadiusTopLeft=Undefined, + cornerRadiusTopRight=Undefined, cursor=Undefined, description=Undefined, + dir=Undefined, discreteBandSize=Undefined, dx=Undefined, dy=Undefined, + ellipsis=Undefined, fill=Undefined, fillOpacity=Undefined, filled=Undefined, + font=Undefined, fontSize=Undefined, fontStyle=Undefined, fontWeight=Undefined, + height=Undefined, href=Undefined, innerRadius=Undefined, interpolate=Undefined, + invalid=Undefined, limit=Undefined, line=Undefined, lineBreak=Undefined, + lineHeight=Undefined, opacity=Undefined, order=Undefined, orient=Undefined, + outerRadius=Undefined, padAngle=Undefined, point=Undefined, radius=Undefined, + radius2=Undefined, radius2Offset=Undefined, radiusOffset=Undefined, + shape=Undefined, size=Undefined, smooth=Undefined, stroke=Undefined, + strokeCap=Undefined, strokeDash=Undefined, strokeDashOffset=Undefined, + strokeJoin=Undefined, strokeMiterLimit=Undefined, strokeOffset=Undefined, + strokeOpacity=Undefined, strokeWidth=Undefined, style=Undefined, + tension=Undefined, text=Undefined, theta=Undefined, theta2=Undefined, + theta2Offset=Undefined, thetaOffset=Undefined, thickness=Undefined, + timeUnitBandPosition=Undefined, timeUnitBandSize=Undefined, tooltip=Undefined, + url=Undefined, width=Undefined, x=Undefined, x2=Undefined, x2Offset=Undefined, + xOffset=Undefined, y=Undefined, y2=Undefined, y2Offset=Undefined, + yOffset=Undefined, **kwds) -> Self: """Set the chart's mark to 'geoshape' (see :class:`MarkDef`) """ kwds = dict(align=align, angle=angle, aria=aria, ariaRole=ariaRole, @@ -813,9 +813,9 @@ def mark_geoshape(self: _TMarkMethodMixin, align=Undefined, angle=Undefined, ari copy.mark = "geoshape" return copy - def mark_boxplot(self: _TMarkMethodMixin, box=Undefined, clip=Undefined, color=Undefined, - extent=Undefined, median=Undefined, opacity=Undefined, orient=Undefined, - outliers=Undefined, rule=Undefined, size=Undefined, ticks=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_boxplot(self, box=Undefined, clip=Undefined, color=Undefined, extent=Undefined, + median=Undefined, opacity=Undefined, orient=Undefined, outliers=Undefined, + rule=Undefined, size=Undefined, ticks=Undefined, **kwds) -> Self: """Set the chart's mark to 'boxplot' (see :class:`BoxPlotDef`) """ kwds = dict(box=box, clip=clip, color=color, extent=extent, median=median, opacity=opacity, @@ -827,9 +827,9 @@ def mark_boxplot(self: _TMarkMethodMixin, box=Undefined, clip=Undefined, color=U copy.mark = "boxplot" return copy - def mark_errorbar(self: _TMarkMethodMixin, clip=Undefined, color=Undefined, extent=Undefined, - opacity=Undefined, orient=Undefined, rule=Undefined, size=Undefined, - thickness=Undefined, ticks=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_errorbar(self, clip=Undefined, color=Undefined, extent=Undefined, opacity=Undefined, + orient=Undefined, rule=Undefined, size=Undefined, thickness=Undefined, + ticks=Undefined, **kwds) -> Self: """Set the chart's mark to 'errorbar' (see :class:`ErrorBarDef`) """ kwds = dict(clip=clip, color=color, extent=extent, opacity=opacity, orient=orient, rule=rule, @@ -841,9 +841,9 @@ def mark_errorbar(self: _TMarkMethodMixin, clip=Undefined, color=Undefined, exte copy.mark = "errorbar" return copy - def mark_errorband(self: _TMarkMethodMixin, band=Undefined, borders=Undefined, clip=Undefined, - color=Undefined, extent=Undefined, interpolate=Undefined, opacity=Undefined, - orient=Undefined, tension=Undefined, **kwds) -> _TMarkMethodMixin: + def mark_errorband(self, band=Undefined, borders=Undefined, clip=Undefined, color=Undefined, + extent=Undefined, interpolate=Undefined, opacity=Undefined, orient=Undefined, + tension=Undefined, **kwds) -> Self: """Set the chart's mark to 'errorband' (see :class:`ErrorBandDef`) """ kwds = dict(band=band, borders=borders, clip=clip, color=color, extent=extent, @@ -860,13 +860,13 @@ class ConfigMethodMixin(object): """A mixin class that defines config methods""" @use_signature(core.Config) - def configure(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure(self, *args, **kwargs) -> Self: copy = self.copy(deep=False) copy.config = core.Config(*args, **kwargs) return copy @use_signature(core.RectConfig) - def configure_arc(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_arc(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -874,7 +874,7 @@ def configure_arc(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodM return copy @use_signature(core.AreaConfig) - def configure_area(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_area(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -882,7 +882,7 @@ def configure_area(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.AxisConfig) - def configure_axis(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axis(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -890,7 +890,7 @@ def configure_axis(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.AxisConfig) - def configure_axisBand(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisBand(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -898,7 +898,7 @@ def configure_axisBand(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMe return copy @use_signature(core.AxisConfig) - def configure_axisBottom(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisBottom(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -906,7 +906,7 @@ def configure_axisBottom(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfig return copy @use_signature(core.AxisConfig) - def configure_axisDiscrete(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisDiscrete(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -914,7 +914,7 @@ def configure_axisDiscrete(self: _TConfigMethodMixin, *args, **kwargs) -> _TConf return copy @use_signature(core.AxisConfig) - def configure_axisLeft(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisLeft(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -922,7 +922,7 @@ def configure_axisLeft(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMe return copy @use_signature(core.AxisConfig) - def configure_axisPoint(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisPoint(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -930,7 +930,7 @@ def configure_axisPoint(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.AxisConfig) - def configure_axisQuantitative(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisQuantitative(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -938,7 +938,7 @@ def configure_axisQuantitative(self: _TConfigMethodMixin, *args, **kwargs) -> _T return copy @use_signature(core.AxisConfig) - def configure_axisRight(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisRight(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -946,7 +946,7 @@ def configure_axisRight(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.AxisConfig) - def configure_axisTemporal(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisTemporal(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -954,7 +954,7 @@ def configure_axisTemporal(self: _TConfigMethodMixin, *args, **kwargs) -> _TConf return copy @use_signature(core.AxisConfig) - def configure_axisTop(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisTop(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -962,7 +962,7 @@ def configure_axisTop(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMet return copy @use_signature(core.AxisConfig) - def configure_axisX(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisX(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -970,7 +970,7 @@ def configure_axisX(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.AxisConfig) - def configure_axisXBand(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisXBand(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -978,7 +978,7 @@ def configure_axisXBand(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.AxisConfig) - def configure_axisXDiscrete(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisXDiscrete(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -986,7 +986,7 @@ def configure_axisXDiscrete(self: _TConfigMethodMixin, *args, **kwargs) -> _TCon return copy @use_signature(core.AxisConfig) - def configure_axisXPoint(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisXPoint(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -994,7 +994,7 @@ def configure_axisXPoint(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfig return copy @use_signature(core.AxisConfig) - def configure_axisXQuantitative(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisXQuantitative(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1002,7 +1002,7 @@ def configure_axisXQuantitative(self: _TConfigMethodMixin, *args, **kwargs) -> _ return copy @use_signature(core.AxisConfig) - def configure_axisXTemporal(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisXTemporal(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1010,7 +1010,7 @@ def configure_axisXTemporal(self: _TConfigMethodMixin, *args, **kwargs) -> _TCon return copy @use_signature(core.AxisConfig) - def configure_axisY(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisY(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1018,7 +1018,7 @@ def configure_axisY(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.AxisConfig) - def configure_axisYBand(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisYBand(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1026,7 +1026,7 @@ def configure_axisYBand(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.AxisConfig) - def configure_axisYDiscrete(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisYDiscrete(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1034,7 +1034,7 @@ def configure_axisYDiscrete(self: _TConfigMethodMixin, *args, **kwargs) -> _TCon return copy @use_signature(core.AxisConfig) - def configure_axisYPoint(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisYPoint(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1042,7 +1042,7 @@ def configure_axisYPoint(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfig return copy @use_signature(core.AxisConfig) - def configure_axisYQuantitative(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisYQuantitative(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1050,7 +1050,7 @@ def configure_axisYQuantitative(self: _TConfigMethodMixin, *args, **kwargs) -> _ return copy @use_signature(core.AxisConfig) - def configure_axisYTemporal(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_axisYTemporal(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1058,7 +1058,7 @@ def configure_axisYTemporal(self: _TConfigMethodMixin, *args, **kwargs) -> _TCon return copy @use_signature(core.BarConfig) - def configure_bar(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_bar(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1066,7 +1066,7 @@ def configure_bar(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodM return copy @use_signature(core.BoxPlotConfig) - def configure_boxplot(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_boxplot(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1074,7 +1074,7 @@ def configure_boxplot(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMet return copy @use_signature(core.MarkConfig) - def configure_circle(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_circle(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1082,7 +1082,7 @@ def configure_circle(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMeth return copy @use_signature(core.CompositionConfig) - def configure_concat(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_concat(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1090,7 +1090,7 @@ def configure_concat(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMeth return copy @use_signature(core.ErrorBandConfig) - def configure_errorband(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_errorband(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1098,7 +1098,7 @@ def configure_errorband(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.ErrorBarConfig) - def configure_errorbar(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_errorbar(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1106,7 +1106,7 @@ def configure_errorbar(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMe return copy @use_signature(core.CompositionConfig) - def configure_facet(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_facet(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1114,7 +1114,7 @@ def configure_facet(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.MarkConfig) - def configure_geoshape(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_geoshape(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1122,7 +1122,7 @@ def configure_geoshape(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMe return copy @use_signature(core.HeaderConfig) - def configure_header(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_header(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1130,7 +1130,7 @@ def configure_header(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMeth return copy @use_signature(core.HeaderConfig) - def configure_headerColumn(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_headerColumn(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1138,7 +1138,7 @@ def configure_headerColumn(self: _TConfigMethodMixin, *args, **kwargs) -> _TConf return copy @use_signature(core.HeaderConfig) - def configure_headerFacet(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_headerFacet(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1146,7 +1146,7 @@ def configure_headerFacet(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfi return copy @use_signature(core.HeaderConfig) - def configure_headerRow(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_headerRow(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1154,7 +1154,7 @@ def configure_headerRow(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.RectConfig) - def configure_image(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_image(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1162,7 +1162,7 @@ def configure_image(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.LegendConfig) - def configure_legend(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_legend(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1170,7 +1170,7 @@ def configure_legend(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMeth return copy @use_signature(core.LineConfig) - def configure_line(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_line(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1178,7 +1178,7 @@ def configure_line(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.MarkConfig) - def configure_mark(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_mark(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1186,7 +1186,7 @@ def configure_mark(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.MarkConfig) - def configure_point(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_point(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1194,7 +1194,7 @@ def configure_point(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.ProjectionConfig) - def configure_projection(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_projection(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1202,7 +1202,7 @@ def configure_projection(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfig return copy @use_signature(core.RangeConfig) - def configure_range(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_range(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1210,7 +1210,7 @@ def configure_range(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.RectConfig) - def configure_rect(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_rect(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1218,7 +1218,7 @@ def configure_rect(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.MarkConfig) - def configure_rule(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_rule(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1226,7 +1226,7 @@ def configure_rule(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.ScaleConfig) - def configure_scale(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_scale(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1234,7 +1234,7 @@ def configure_scale(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.SelectionConfig) - def configure_selection(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_selection(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1242,7 +1242,7 @@ def configure_selection(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigM return copy @use_signature(core.MarkConfig) - def configure_square(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_square(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1250,7 +1250,7 @@ def configure_square(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMeth return copy @use_signature(core.MarkConfig) - def configure_text(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_text(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1258,7 +1258,7 @@ def configure_text(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.TickConfig) - def configure_tick(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_tick(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1266,7 +1266,7 @@ def configure_tick(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethod return copy @use_signature(core.TitleConfig) - def configure_title(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_title(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1274,7 +1274,7 @@ def configure_title(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.LineConfig) - def configure_trail(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_trail(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -1282,7 +1282,7 @@ def configure_trail(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMetho return copy @use_signature(core.ViewConfig) - def configure_view(self: _TConfigMethodMixin, *args, **kwargs) -> _TConfigMethodMixin: + def configure_view(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py index 7942f1572..c08b6a130 100644 --- a/tools/generate_schema_wrapper.py +++ b/tools/generate_schema_wrapper.py @@ -144,7 +144,7 @@ def to_dict(self, validate=True, ignore=(), context=None): """ MARK_METHOD = ''' -def mark_{mark}({def_arglist}) -> {self_type}: +def mark_{mark}({def_arglist}) -> Self: """Set the chart's mark to '{mark}' (see :class:`{mark_def}`) """ kwds = dict({dict_arglist}) @@ -158,7 +158,7 @@ def mark_{mark}({def_arglist}) -> {self_type}: CONFIG_METHOD = """ @use_signature(core.{classname}) -def {method}(self: {self_type}, *args, **kwargs) -> {self_type}: +def {method}(self, *args, **kwargs) -> Self: copy = self.copy(deep=False) copy.config = core.{classname}(*args, **kwargs) return copy @@ -166,7 +166,7 @@ def {method}(self: {self_type}, *args, **kwargs) -> {self_type}: CONFIG_PROP_METHOD = """ @use_signature(core.{classname}) -def configure_{prop}(self: {self_type}, *args, **kwargs) -> {self_type}: +def configure_{prop}(self, *args, **kwargs) -> Self: copy = self.copy(deep=['config']) if copy.config is Undefined: copy.config = core.Config() @@ -498,18 +498,12 @@ def generate_vegalite_mark_mixin(schemafile, markdefs): schema = json.load(f) class_name = "MarkMethodMixin" - type_var_name = f"_T{class_name}" imports = [ - "from typing import TypeVar", "from altair.utils.schemapi import Undefined", "from . import core", ] - type_var_definition = ( - f'{type_var_name} = TypeVar("{type_var_name}", bound="{class_name}")' - ) - code = [ f"class {class_name}(object):", ' """A mixin class that defines mark methods"""', @@ -527,7 +521,7 @@ def generate_vegalite_mark_mixin(schemafile, markdefs): required -= {"type"} kwds -= {"type"} - def_args = [f"self: {type_var_name}"] + [ + def_args = ["self"] + [ "{}=Undefined".format(p) for p in (sorted(required) + sorted(kwds)) ] dict_args = ["{0}={0}".format(p) for p in (sorted(required) + sorted(kwds))] @@ -543,21 +537,16 @@ def generate_vegalite_mark_mixin(schemafile, markdefs): mark_def=mark_def, def_arglist=indent_arglist(def_args, indent_level=10 + len(mark)), dict_arglist=indent_arglist(dict_args, indent_level=16), - self_type=type_var_name, ) code.append("\n ".join(mark_method.splitlines())) - return imports, type_var_definition, "\n".join(code) + return imports, "\n".join(code) def generate_vegalite_config_mixin(schemafile): imports = ["from . import core", "from altair.utils import use_signature"] class_name = "ConfigMethodMixin" - type_var_name = f"_T{class_name}" - type_var_definition = ( - f'{type_var_name} = TypeVar("{type_var_name}", bound="{class_name}")' - ) code = [ f"class {class_name}(object):", @@ -568,20 +557,16 @@ def generate_vegalite_config_mixin(schemafile): info = SchemaInfo({"$ref": "#/definitions/Config"}, rootschema=schema) # configure() method - method = CONFIG_METHOD.format( - classname="Config", method="configure", self_type=type_var_name - ) + method = CONFIG_METHOD.format(classname="Config", method="configure") code.append("\n ".join(method.splitlines())) # configure_prop() methods for prop, prop_info in info.properties.items(): classname = prop_info.refname if classname and classname.endswith("Config"): - method = CONFIG_PROP_METHOD.format( - classname=classname, prop=prop, self_type=type_var_name - ) + method = CONFIG_PROP_METHOD.format(classname=classname, prop=prop) code.append("\n ".join(method.splitlines())) - return imports, type_var_definition, "\n".join(code) + return imports, "\n".join(code) def vegalite_main(skip_download=False): @@ -631,19 +616,21 @@ def vegalite_main(skip_download=False): } outfile = join(schemapath, "mixins.py") print("Generating\n {}\n ->{}".format(schemafile, outfile)) - mark_imports, mark_type_var, mark_mixin = generate_vegalite_mark_mixin( - schemafile, markdefs - ) - config_imports, config_type_var, config_mixin = generate_vegalite_config_mixin( - schemafile - ) + mark_imports, mark_mixin = generate_vegalite_mark_mixin(schemafile, markdefs) + config_imports, config_mixin = generate_vegalite_config_mixin(schemafile) + try_except_imports = [ + "try:", + " from typing import Self", + "except ImportError:", + " # Self was introduced in typing in Python 3.11", + " from typing_extensions import Self", + ] imports = sorted(set(mark_imports + config_imports)) - type_vars = sorted([mark_type_var, config_type_var]) with open(outfile, "w", encoding="utf8") as f: f.write(HEADER) f.write("\n".join(imports)) f.write("\n\n") - f.write("\n".join(type_vars)) + f.write("\n".join(try_except_imports)) f.write("\n\n\n") f.write(mark_mixin) f.write("\n\n\n") diff --git a/tools/update_init_file.py b/tools/update_init_file.py index 1ebce280e..b34948fe8 100644 --- a/tools/update_init_file.py +++ b/tools/update_init_file.py @@ -10,6 +10,12 @@ import black +try: + from typing import Self +except ImportError: + # Self was introduced in typing in Python 3.11 + from typing_extensions import Self + # Import Altair from head ROOT_DIR = abspath(join(dirname(__file__), "..")) sys.path.insert(0, ROOT_DIR) @@ -64,6 +70,7 @@ def _is_relevant_attribute(attr_name): getattr(attr, "_deprecated", False) is True or attr_name.startswith("_") or attr is TypeVar + or attr is Self ): return False else: From 27d53971d32289fe115b32f2c66aed70d70814ca Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Thu, 23 Feb 2023 07:33:23 +0000 Subject: [PATCH 4/9] Move use_signature on class level to __init__ --- altair/vegalite/v5/api.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py index 26351b6e7..489740dc2 100644 --- a/altair/vegalite/v5/api.py +++ b/altair/vegalite/v5/api.py @@ -120,8 +120,11 @@ def _prepare_data(data, context=None): Title = core.TitleParams -@utils.use_signature(core.LookupData) class LookupData(core.LookupData): + @utils.use_signature(core.LookupData) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + def to_dict(self, *args, **kwargs): """Convert the chart to a dictionary suitable for JSON export.""" copy = self.copy(deep=False) @@ -129,10 +132,13 @@ def to_dict(self, *args, **kwargs): return super(LookupData, copy).to_dict(*args, **kwargs) -@utils.use_signature(core.FacetMapping) class FacetMapping(core.FacetMapping): _class_is_valid_at_instantiation = False + @utils.use_signature(core.FacetMapping) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + def to_dict(self, *args, **kwargs): copy = self.copy(deep=False) context = kwargs.get("context", {}) @@ -2339,13 +2345,13 @@ def _get(spec, attr): ) -@utils.use_signature(core.TopLevelRepeatSpec) class RepeatChart(TopLevelMixin, core.TopLevelRepeatSpec): """A chart repeated across rows and columns with small changes""" # Because TopLevelRepeatSpec is defined as a union as of Vega-Lite schema 4.9, # we set the arguments explicitly here. # TODO: Should we instead use tools/schemapi/codegen._get_args? + @utils.use_signature(core.TopLevelRepeatSpec) def __init__( self, repeat=Undefined, @@ -2460,10 +2466,10 @@ def repeat(repeater="repeat"): return core.RepeatRef(repeat=repeater) -@utils.use_signature(core.TopLevelConcatSpec) class ConcatChart(TopLevelMixin, core.TopLevelConcatSpec): """A chart with horizontally-concatenated facets""" + @utils.use_signature(core.TopLevelConcatSpec) def __init__(self, data=Undefined, concat=(), columns=Undefined, **kwargs): # TODO: move common data to top level? for spec in concat: @@ -2534,10 +2540,10 @@ def concat(*charts, **kwargs): return ConcatChart(concat=charts, **kwargs) -@utils.use_signature(core.TopLevelHConcatSpec) class HConcatChart(TopLevelMixin, core.TopLevelHConcatSpec): """A chart with horizontally-concatenated facets""" + @utils.use_signature(core.TopLevelHConcatSpec) def __init__(self, data=Undefined, hconcat=(), **kwargs): # TODO: move common data to top level? for spec in hconcat: @@ -2606,10 +2612,10 @@ def hconcat(*charts, **kwargs): return HConcatChart(hconcat=charts, **kwargs) -@utils.use_signature(core.TopLevelVConcatSpec) class VConcatChart(TopLevelMixin, core.TopLevelVConcatSpec): """A chart with vertically-concatenated facets""" + @utils.use_signature(core.TopLevelVConcatSpec) def __init__(self, data=Undefined, vconcat=(), **kwargs): # TODO: move common data to top level? for spec in vconcat: @@ -2678,10 +2684,10 @@ def vconcat(*charts, **kwargs): return VConcatChart(vconcat=charts, **kwargs) -@utils.use_signature(core.TopLevelLayerSpec) class LayerChart(TopLevelMixin, _EncodingMixin, core.TopLevelLayerSpec): """A Chart with layers within a single panel""" + @utils.use_signature(core.TopLevelLayerSpec) def __init__(self, data=Undefined, layer=(), **kwargs): # TODO: move common data to top level? # TODO: check for conflicting interaction @@ -2771,10 +2777,10 @@ def layer(*charts, **kwargs): return LayerChart(layer=charts, **kwargs) -@utils.use_signature(core.TopLevelFacetSpec) class FacetChart(TopLevelMixin, core.TopLevelFacetSpec): """A Chart with layers within a single panel""" + @utils.use_signature(core.TopLevelFacetSpec) def __init__( self, data=Undefined, From f47b79fdb6c0c759ba66a6eef20d1d8f18a2e365 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Thu, 23 Feb 2023 07:58:38 +0000 Subject: [PATCH 5/9] Format code --- altair/vegalite/v5/api.py | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py index 489740dc2..e0a1b36ab 100644 --- a/altair/vegalite/v5/api.py +++ b/altair/vegalite/v5/api.py @@ -974,9 +974,7 @@ def transform_aggregate( core.AggregateTransform(aggregate=aggregate, groupby=groupby) ) - def transform_bin( - self, as_=Undefined, field=Undefined, bin=True, **kwargs - ) -> Self: + def transform_bin(self, as_=Undefined, field=Undefined, bin=True, **kwargs) -> Self: """ Add a :class:`BinTransform` to the schema. @@ -1032,9 +1030,7 @@ def transform_bin( kwargs["field"] = field return self._add_transform(core.BinTransform(**kwargs)) - def transform_calculate( - self, as_=Undefined, calculate=Undefined, **kwargs - ) -> Self: + def transform_calculate(self, as_=Undefined, calculate=Undefined, **kwargs) -> Self: """ Add a :class:`CalculateTransform` to the schema. @@ -1320,9 +1316,7 @@ def transform_filter(self, filter, **kwargs) -> Self: filter = new_filter return self._add_transform(core.FilterTransform(filter=filter, **kwargs)) - def transform_flatten( - self, flatten, as_=Undefined - ) -> Self: + def transform_flatten(self, flatten, as_=Undefined) -> Self: """Add a :class:`FlattenTransform` to the schema. Parameters @@ -2406,9 +2400,7 @@ def __init__( **kwds, ) - def interactive( - self, name=None, bind_x=True, bind_y=True - ) -> Self: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters @@ -2492,9 +2484,7 @@ def __or__(self, other): copy |= other return copy - def interactive( - self, name=None, bind_x=True, bind_y=True - ) -> Self: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters @@ -2564,9 +2554,7 @@ def __or__(self, other): copy |= other return copy - def interactive( - self, name=None, bind_x=True, bind_y=True - ) -> Self: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters @@ -2636,9 +2624,7 @@ def __and__(self, other): copy &= other return copy - def interactive( - self, name=None, bind_x=True, bind_y=True - ) -> Self: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters @@ -2726,9 +2712,7 @@ def add_layers(self, *layers) -> Self: copy += layer return copy - def interactive( - self, name=None, bind_x=True, bind_y=True - ) -> Self: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters @@ -2797,9 +2781,7 @@ def __init__( data=data, spec=spec, facet=facet, params=params, **kwargs ) - def interactive( - self, name=None, bind_x=True, bind_y=True - ) -> Self: + def interactive(self, name=None, bind_x=True, bind_y=True) -> Self: """Make chart axes scales interactive Parameters From b37bd17ae1f7cc77fc4738222bfc009514868dac Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Thu, 23 Feb 2023 08:26:01 +0000 Subject: [PATCH 6/9] Add PR to changes.rst --- doc/releases/changes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases/changes.rst b/doc/releases/changes.rst index 0c9a44b15..3145a7063 100644 --- a/doc/releases/changes.rst +++ b/doc/releases/changes.rst @@ -20,7 +20,7 @@ Enhancements - The ``Title`` and ``Impute`` aliases were added for ``TitleParams`` and ``ImputeParams``, respectively (#2732). - Saving charts with HTML inline is now supported without having altair_saver installed (#2807). - The documentation page has been revamped, both in terms of appearance and content. -- More informative autocompletion by removing deprecated methods (#2814) and adding support for completion in method chains for editors that rely on type hints (e.g. VS Code) (#2846) +- More informative autocompletion by removing deprecated methods (#2814) and for editors that rely on type hints (e.g. VS Code) we added support for completion in method chains (#2846) and extended keyword completion to cover additional methods (#2920). - Substantially improved error handling. Both in terms of finding the more relevant error (#2842), and in terms of improving the formatting and clarity of the error messages (#2824, #2568). - Include experimental support for the DataFrame Interchange Protocol (through `__dataframe__` attribute). This requires `pyarrow>=11.0.0` (#2888). From ab8949407cc667face8c4de51565e2d51c6f1897 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Fri, 24 Feb 2023 07:34:54 +0000 Subject: [PATCH 7/9] Switch to using sys.version_info --- altair/utils/core.py | 5 ++--- altair/vegalite/v5/api.py | 6 +++--- altair/vegalite/v5/schema/mixins.py | 7 ++++--- tools/generate_schema_wrapper.py | 8 +++++--- tools/update_init_file.py | 5 ++--- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/altair/utils/core.py b/altair/utils/core.py index 50c4a9294..dd139fa2c 100644 --- a/altair/utils/core.py +++ b/altair/utils/core.py @@ -17,10 +17,9 @@ from altair.utils.schemapi import SchemaBase -try: +if sys.version_info >= (3, 10): from typing import ParamSpec -except ImportError: - # ParamSpec was introduced in typing in Python 3.10 +else: from typing_extensions import ParamSpec try: diff --git a/altair/vegalite/v5/api.py b/altair/vegalite/v5/api.py index 2b8c0a2cf..89d18c697 100644 --- a/altair/vegalite/v5/api.py +++ b/altair/vegalite/v5/api.py @@ -7,6 +7,7 @@ import pandas as pd from toolz.curried import pipe as _pipe import itertools +import sys from .schema import core, channels, mixins, Undefined, SCHEMA_URL @@ -15,10 +16,9 @@ from .display import renderers, VEGALITE_VERSION, VEGAEMBED_VERSION, VEGA_VERSION from .theme import themes -try: +if sys.version_info >= (3, 11): from typing import Self -except ImportError: - # Self was introduced in typing in Python 3.11 +else: from typing_extensions import Self diff --git a/altair/vegalite/v5/schema/mixins.py b/altair/vegalite/v5/schema/mixins.py index a525ee802..490972681 100644 --- a/altair/vegalite/v5/schema/mixins.py +++ b/altair/vegalite/v5/schema/mixins.py @@ -1,13 +1,14 @@ # The contents of this file are automatically written by # tools/generate_schema_wrapper.py. Do not modify directly. +import sys + from . import core from altair.utils import use_signature from altair.utils.schemapi import Undefined -try: +if sys.version_info >= (3, 11): from typing import Self -except ImportError: - # Self was introduced in typing in Python 3.11 +else: from typing_extensions import Self diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py index 3fb29a0f4..7631ba483 100644 --- a/tools/generate_schema_wrapper.py +++ b/tools/generate_schema_wrapper.py @@ -622,15 +622,17 @@ def vegalite_main(skip_download=False): mark_imports, mark_mixin = generate_vegalite_mark_mixin(schemafile, markdefs) config_imports, config_mixin = generate_vegalite_config_mixin(schemafile) try_except_imports = [ - "try:", + "if sys.version_info >= (3, 11):", " from typing import Self", - "except ImportError:", - " # Self was introduced in typing in Python 3.11", + "else:", " from typing_extensions import Self", ] + stdlib_imports = ["import sys"] imports = sorted(set(mark_imports + config_imports)) with open(outfile, "w", encoding="utf8") as f: f.write(HEADER) + f.write("\n".join(stdlib_imports)) + f.write("\n\n") f.write("\n".join(imports)) f.write("\n\n") f.write("\n".join(try_except_imports)) diff --git a/tools/update_init_file.py b/tools/update_init_file.py index b34948fe8..b451c4543 100644 --- a/tools/update_init_file.py +++ b/tools/update_init_file.py @@ -10,10 +10,9 @@ import black -try: +if sys.version_info >= (3, 11): from typing import Self -except ImportError: - # Self was introduced in typing in Python 3.11 +else: from typing_extensions import Self # Import Altair from head From 309d040dbd6c4cf0133867e2d571d31be3132487 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Fri, 24 Feb 2023 08:47:02 +0100 Subject: [PATCH 8/9] Apply suggestion from code review Co-authored-by: Mattijn van Hoek --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 51a29a81a..96ae4e1c7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ importlib_metadata; python_version < "3.8" -# typing_extensions.Self requires at least 4.0.1 typing_extensions>=4.0.1; python_version < "3.11" jinja2 jsonschema>=3.0 From 6576b72d985ec234f757730fa3fb3b16af6f23e3 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sat, 25 Feb 2023 06:30:43 +0000 Subject: [PATCH 9/9] Reran schema generation after merge of master --- altair/vegalite/v5/schema/mixins.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/altair/vegalite/v5/schema/mixins.py b/altair/vegalite/v5/schema/mixins.py index a950ddc9a..569daefb8 100644 --- a/altair/vegalite/v5/schema/mixins.py +++ b/altair/vegalite/v5/schema/mixins.py @@ -815,8 +815,8 @@ def mark_geoshape(self, align=Undefined, angle=Undefined, aria=Undefined, ariaRo return copy def mark_boxplot(self, box=Undefined, clip=Undefined, color=Undefined, extent=Undefined, - median=Undefined, opacity=Undefined, orient=Undefined, outliers=Undefined, - rule=Undefined, size=Undefined, ticks=Undefined, **kwds) -> Self: + invalid=Undefined, median=Undefined, opacity=Undefined, orient=Undefined, + outliers=Undefined, rule=Undefined, size=Undefined, ticks=Undefined, **kwds) -> Self: """Set the chart's mark to 'boxplot' (see :class:`BoxPlotDef`) """ kwds = dict(box=box, clip=clip, color=color, extent=extent, invalid=invalid, median=median,