From aa4544accb96c7226597e761caaa41986cbaa826 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 26 Apr 2023 18:39:02 +0200 Subject: [PATCH] Add assist pipeline and language selectors (#92030) --- homeassistant/helpers/selector.py | 56 +++++++++++++++++++++++++++++++ tests/helpers/test_selector.py | 39 ++++++++++++++++++++- 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/homeassistant/helpers/selector.py b/homeassistant/helpers/selector.py index e2f58e357ed..fec9d25563e 100644 --- a/homeassistant/helpers/selector.py +++ b/homeassistant/helpers/selector.py @@ -286,6 +286,28 @@ class AreaSelector(Selector[AreaSelectorConfig]): return [vol.Schema(str)(val) for val in data] +class AssistPipelineSelectorConfig(TypedDict, total=False): + """Class to represent an assist pipeline selector config.""" + + +@SELECTORS.register("assist_pipeline") +class AssistPipelineSelector(Selector[AssistPipelineSelectorConfig]): + """Selector for an assist pipeline.""" + + selector_type = "assist_pipeline" + + CONFIG_SCHEMA = vol.Schema({}) + + def __init__(self, config: AssistPipelineSelectorConfig) -> None: + """Instantiate a selector.""" + super().__init__(config) + + def __call__(self, data: Any) -> str: + """Validate the passed selection.""" + pipeline: str = vol.Schema(str)(data) + return pipeline + + class AttributeSelectorConfig(TypedDict, total=False): """Class to represent an attribute selector config.""" @@ -659,6 +681,40 @@ class IconSelector(Selector[IconSelectorConfig]): return icon +class LanguageSelectorConfig(TypedDict, total=False): + """Class to represent an language selector config.""" + + languages: list[str] + native_name: bool + no_sort: bool + + +@SELECTORS.register("language") +class LanguageSelector(Selector[LanguageSelectorConfig]): + """Selector for an language.""" + + selector_type = "language" + + CONFIG_SCHEMA = vol.Schema( + { + vol.Optional("languages"): [str], + vol.Optional("native_name", default=False): cv.boolean, + vol.Optional("no_sort", default=False): cv.boolean, + } + ) + + def __init__(self, config: LanguageSelectorConfig) -> None: + """Instantiate a selector.""" + super().__init__(config) + + def __call__(self, data: Any) -> str: + """Validate the passed selection.""" + language: str = vol.Schema(str)(data) + if "languages" in self.config and language not in self.config["languages"]: + raise vol.Invalid(f"Value {language} is not a valid option") + return language + + class LocationSelectorConfig(TypedDict, total=False): """Class to represent a location selector config.""" diff --git a/tests/helpers/test_selector.py b/tests/helpers/test_selector.py index 0a24eac38c6..3c04087e48d 100644 --- a/tests/helpers/test_selector.py +++ b/tests/helpers/test_selector.py @@ -342,6 +342,23 @@ def test_area_selector_schema(schema, valid_selections, invalid_selections) -> N _test_selector("area", schema, valid_selections, invalid_selections) +@pytest.mark.parametrize( + ("schema", "valid_selections", "invalid_selections"), + ( + ( + {}, + ("23ouih2iu23ou2", "2j4hp3uy4p87wyrpiuhk34"), + (None, True, 1), + ), + ), +) +def test_assist_pipeline_selector_schema( + schema, valid_selections, invalid_selections +) -> None: + """Test assist pipeline selector.""" + _test_selector("assist_pipeline", schema, valid_selections, invalid_selections) + + @pytest.mark.parametrize( ("schema", "valid_selections", "invalid_selections"), ( @@ -431,7 +448,7 @@ def test_boolean_selector_schema(schema, valid_selections, invalid_selections) - def test_config_entry_selector_schema( schema, valid_selections, invalid_selections ) -> None: - """Test boolean selector.""" + """Test config entry selector.""" _test_selector("config_entry", schema, valid_selections, invalid_selections) @@ -748,6 +765,26 @@ def test_media_selector_schema(schema, valid_selections, invalid_selections) -> ) +@pytest.mark.parametrize( + ("schema", "valid_selections", "invalid_selections"), + ( + ( + {}, + ("nl", "fr"), + (None, True, 1), + ), + ( + {"languages": ["nl", "fr"]}, + ("nl", "fr"), + (None, True, 1, "de", "en"), + ), + ), +) +def test_language_selector_schema(schema, valid_selections, invalid_selections) -> None: + """Test language selector.""" + _test_selector("language", schema, valid_selections, invalid_selections) + + @pytest.mark.parametrize( ("schema", "valid_selections", "invalid_selections"), (