Skip to content

Commit

Permalink
Add SelectorType enum and TypedDicts for each selector's data (#68399)
Browse files Browse the repository at this point in the history
* rebase off current

* rearrange

* Overload selector function

* Update/fix all selector references

* better typing?

* remove extra option

* move things around

* Switch to Sequence type to avoid ignoring mypy error

* Get rid of ...'s

* Improve typing to reduce number of ignores

* Remove all typing ignores

* Make config optional for selectors that don't need a config

* add missing unit prefixes

* Rename TypedDicts

* Update homeassistant/helpers/selector.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* review feedback

* remove peta from integration integration

* Fix min_max

* Revert change to selector function

* Fix logic

* Add typing for selector classes

* Update selector.py

* Fix indent

Co-authored-by: Erik Montnemery <erik@montnemery.com>
  • Loading branch information
raman325 and emontnemery committed Apr 11, 2022
1 parent e996142 commit b325c11
Show file tree
Hide file tree
Showing 16 changed files with 525 additions and 239 deletions.
59 changes: 28 additions & 31 deletions homeassistant/components/derivative/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from homeassistant.const import (
CONF_NAME,
CONF_SOURCE,
CONF_UNIT_OF_MEASUREMENT,
TIME_DAYS,
TIME_HOURS,
TIME_MINUTES,
Expand All @@ -31,50 +30,48 @@
)

UNIT_PREFIXES = [
{"value": "none", "label": "none"},
{"value": "n", "label": "n (nano)"},
{"value": "µ", "label": "µ (micro)"},
{"value": "m", "label": "m (milli)"},
{"value": "k", "label": "k (kilo)"},
{"value": "M", "label": "M (mega)"},
{"value": "G", "label": "G (giga)"},
{"value": "T", "label": "T (tera)"},
{"value": "P", "label": "P (peta)"},
selector.SelectOptionDict(value="none", label="none"),
selector.SelectOptionDict(value="n", label="n (nano)"),
selector.SelectOptionDict(value="µ", label="µ (micro)"),
selector.SelectOptionDict(value="m", label="m (milli)"),
selector.SelectOptionDict(value="k", label="k (kilo)"),
selector.SelectOptionDict(value="M", label="M (mega)"),
selector.SelectOptionDict(value="G", label="G (giga)"),
selector.SelectOptionDict(value="T", label="T (tera)"),
selector.SelectOptionDict(value="P", label="P (peta)"),
]
TIME_UNITS = [
{"value": TIME_SECONDS, "label": "Seconds"},
{"value": TIME_MINUTES, "label": "Minutes"},
{"value": TIME_HOURS, "label": "Hours"},
{"value": TIME_DAYS, "label": "Days"},
selector.SelectOptionDict(value=TIME_SECONDS, label="Seconds"),
selector.SelectOptionDict(value=TIME_MINUTES, label="Minutes"),
selector.SelectOptionDict(value=TIME_HOURS, label="Hours"),
selector.SelectOptionDict(value=TIME_DAYS, label="Days"),
]

OPTIONS_SCHEMA = vol.Schema(
{
vol.Required(CONF_ROUND_DIGITS, default=2): selector.selector(
{
"number": {
"min": 0,
"max": 6,
"mode": "box",
CONF_UNIT_OF_MEASUREMENT: "decimals",
}
}
vol.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0,
max=6,
mode=selector.NumberSelectorMode.BOX,
unit_of_measurement="decimals",
),
),
vol.Required(CONF_TIME_WINDOW): selector.selector({"duration": {}}),
vol.Required(CONF_UNIT_PREFIX, default="none"): selector.selector(
{"select": {"options": UNIT_PREFIXES}}
vol.Required(CONF_TIME_WINDOW): selector.DurationSelector(),
vol.Required(CONF_UNIT_PREFIX, default="none"): selector.SelectSelector(
selector.SelectSelectorConfig(options=UNIT_PREFIXES),
),
vol.Required(CONF_UNIT_TIME, default=TIME_HOURS): selector.selector(
{"select": {"options": TIME_UNITS}}
vol.Required(CONF_UNIT_TIME, default=TIME_HOURS): selector.SelectSelector(
selector.SelectSelectorConfig(options=TIME_UNITS),
),
}
)

CONFIG_SCHEMA = vol.Schema(
{
vol.Required(CONF_NAME): selector.selector({"text": {}}),
vol.Required(CONF_SOURCE): selector.selector(
{"entity": {"domain": "sensor"}},
vol.Required(CONF_NAME): selector.TextSelector(),
vol.Required(CONF_SOURCE): selector.EntitySelector(
selector.EntitySelectorConfig(domain="sensor"),
),
}
).extend(OPTIONS_SCHEMA.schema)
Expand Down
22 changes: 9 additions & 13 deletions homeassistant/components/group/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,9 @@ def basic_group_options_schema(
return vol.Schema(
{
vol.Required(CONF_ENTITIES): entity_selector_without_own_entities(
handler, {"domain": domain, "multiple": True}
),
vol.Required(CONF_HIDE_MEMBERS, default=False): selector.selector(
{"boolean": {}}
handler, selector.EntitySelectorConfig(domain=domain, multiple=True)
),
vol.Required(CONF_HIDE_MEMBERS, default=False): selector.BooleanSelector(),
}
)

Expand All @@ -46,13 +44,11 @@ def basic_group_config_schema(domain: str) -> vol.Schema:
"""Generate config schema."""
return vol.Schema(
{
vol.Required("name"): selector.selector({"text": {}}),
vol.Required(CONF_ENTITIES): selector.selector(
{"entity": {"domain": domain, "multiple": True}}
),
vol.Required(CONF_HIDE_MEMBERS, default=False): selector.selector(
{"boolean": {}}
vol.Required("name"): selector.TextSelector(),
vol.Required(CONF_ENTITIES): selector.EntitySelector(
selector.EntitySelectorConfig(domain=domain, multiple=True),
),
vol.Required(CONF_HIDE_MEMBERS, default=False): selector.BooleanSelector(),
}
)

Expand All @@ -64,14 +60,14 @@ def binary_sensor_options_schema(
"""Generate options schema."""
return basic_group_options_schema("binary_sensor", handler, options).extend(
{
vol.Required(CONF_ALL, default=False): selector.selector({"boolean": {}}),
vol.Required(CONF_ALL, default=False): selector.BooleanSelector(),
}
)


BINARY_SENSOR_CONFIG_SCHEMA = basic_group_config_schema("binary_sensor").extend(
{
vol.Required(CONF_ALL, default=False): selector.selector({"boolean": {}}),
vol.Required(CONF_ALL, default=False): selector.BooleanSelector(),
}
)

Expand All @@ -86,7 +82,7 @@ def light_switch_options_schema(
{
vol.Required(
CONF_ALL, default=False, description={"advanced": True}
): selector.selector({"boolean": {}}),
): selector.BooleanSelector(),
}
)

Expand Down
67 changes: 34 additions & 33 deletions homeassistant/components/integration/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from homeassistant.const import (
CONF_METHOD,
CONF_NAME,
CONF_UNIT_OF_MEASUREMENT,
TIME_DAYS,
TIME_HOURS,
TIME_MINUTES,
Expand All @@ -34,56 +33,58 @@
)

UNIT_PREFIXES = [
{"value": "none", "label": "none"},
{"value": "k", "label": "k (kilo)"},
{"value": "M", "label": "M (mega)"},
{"value": "G", "label": "G (giga)"},
{"value": "T", "label": "T (tera)"},
selector.SelectOptionDict(value="none", label="none"),
selector.SelectOptionDict(value="k", label="k (kilo)"),
selector.SelectOptionDict(value="M", label="M (mega)"),
selector.SelectOptionDict(value="G", label="G (giga)"),
selector.SelectOptionDict(value="T", label="T (tera)"),
]
TIME_UNITS = [
{"value": TIME_SECONDS, "label": "s (seconds)"},
{"value": TIME_MINUTES, "label": "min (minutes)"},
{"value": TIME_HOURS, "label": "h (hours)"},
{"value": TIME_DAYS, "label": "d (days)"},
selector.SelectOptionDict(value=TIME_SECONDS, label="s (seconds)"),
selector.SelectOptionDict(value=TIME_MINUTES, label="min (minutes)"),
selector.SelectOptionDict(value=TIME_HOURS, label="h (hours)"),
selector.SelectOptionDict(value=TIME_DAYS, label="d (days)"),
]
INTEGRATION_METHODS = [
{"value": METHOD_TRAPEZOIDAL, "label": "Trapezoidal rule"},
{"value": METHOD_LEFT, "label": "Left Riemann sum"},
{"value": METHOD_RIGHT, "label": "Right Riemann sum"},
selector.SelectOptionDict(value=METHOD_TRAPEZOIDAL, label="Trapezoidal rule"),
selector.SelectOptionDict(value=METHOD_LEFT, label="Left Riemann sum"),
selector.SelectOptionDict(value=METHOD_RIGHT, label="Right Riemann sum"),
]

OPTIONS_SCHEMA = vol.Schema(
{
vol.Required(CONF_ROUND_DIGITS, default=2): selector.selector(
{"number": {"min": 0, "max": 6, "mode": "box"}}
vol.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0, max=6, mode=selector.NumberSelectorMode.BOX
),
),
}
)

CONFIG_SCHEMA = vol.Schema(
{
vol.Required(CONF_NAME): selector.selector({"text": {}}),
vol.Required(CONF_SOURCE_SENSOR): selector.selector(
{"entity": {"domain": "sensor"}},
vol.Required(CONF_NAME): selector.TextSelector(),
vol.Required(CONF_SOURCE_SENSOR): selector.EntitySelector(
selector.EntitySelectorConfig(domain="sensor")
),
vol.Required(CONF_METHOD, default=METHOD_TRAPEZOIDAL): selector.selector(
{"select": {"options": INTEGRATION_METHODS}}
vol.Required(CONF_METHOD, default=METHOD_TRAPEZOIDAL): selector.SelectSelector(
selector.SelectSelectorConfig(options=INTEGRATION_METHODS),
),
vol.Required(CONF_ROUND_DIGITS, default=2): selector.selector(
{
"number": {
"min": 0,
"max": 6,
"mode": "box",
CONF_UNIT_OF_MEASUREMENT: "decimals",
}
}
vol.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0,
max=6,
mode=selector.NumberSelectorMode.BOX,
unit_of_measurement="decimals",
),
),
vol.Required(CONF_UNIT_PREFIX, default="none"): selector.selector(
{"select": {"options": UNIT_PREFIXES}}
vol.Required(CONF_UNIT_PREFIX, default="none"): selector.SelectSelector(
selector.SelectSelectorConfig(options=UNIT_PREFIXES),
),
vol.Required(CONF_UNIT_TIME, default=TIME_HOURS): selector.selector(
{"select": {"options": TIME_UNITS, "mode": "dropdown"}}
vol.Required(CONF_UNIT_TIME, default=TIME_HOURS): selector.SelectSelector(
selector.SelectSelectorConfig(
options=TIME_UNITS, mode=selector.SelectSelectorMode.DROPDOWN
),
),
}
)
Expand Down
46 changes: 26 additions & 20 deletions homeassistant/components/knx/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,14 @@
CONF_KNX_LABEL_TUNNELING_UDP: Final = "UDP"
CONF_KNX_LABEL_TUNNELING_UDP_ROUTE_BACK: Final = "UDP with route back / NAT mode"

_IA_SELECTOR = selector.selector({"text": {}})
_IP_SELECTOR = selector.selector({"text": {}})
_IA_SELECTOR = selector.TextSelector()
_IP_SELECTOR = selector.TextSelector()
_PORT_SELECTOR = vol.All(
selector.selector({"number": {"min": 1, "max": 65535, "mode": "box"}}),
selector.NumberSelector(
selector.NumberSelectorConfig(
min=1, max=65535, mode=selector.NumberSelectorMode.BOX
),
),
vol.Coerce(int),
)

Expand Down Expand Up @@ -254,14 +258,18 @@ async def async_step_secure_manual(

fields = {
vol.Required(CONF_KNX_SECURE_USER_ID, default=2): vol.All(
selector.selector({"number": {"min": 1, "max": 127, "mode": "box"}}),
selector.NumberSelector(
selector.NumberSelectorConfig(
min=1, max=127, mode=selector.NumberSelectorMode.BOX
),
),
vol.Coerce(int),
),
vol.Required(CONF_KNX_SECURE_USER_PASSWORD): selector.selector(
{"text": {"type": "password"}}
vol.Required(CONF_KNX_SECURE_USER_PASSWORD): selector.TextSelector(
selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD),
),
vol.Required(CONF_KNX_SECURE_DEVICE_AUTHENTICATION): selector.selector(
{"text": {"type": "password"}}
vol.Required(CONF_KNX_SECURE_DEVICE_AUTHENTICATION): selector.TextSelector(
selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD),
),
}

Expand Down Expand Up @@ -301,8 +309,8 @@ async def async_step_secure_knxkeys(
)

fields = {
vol.Required(CONF_KNX_KNXKEY_FILENAME): selector.selector({"text": {}}),
vol.Required(CONF_KNX_KNXKEY_PASSWORD): selector.selector({"text": {}}),
vol.Required(CONF_KNX_KNXKEY_FILENAME): selector.TextSelector(),
vol.Required(CONF_KNX_KNXKEY_PASSWORD): selector.TextSelector(),
}

return self.async_show_form(
Expand Down Expand Up @@ -405,7 +413,7 @@ async def async_step_init(
vol.Required(
CONF_KNX_INDIVIDUAL_ADDRESS,
default=self.current_config[CONF_KNX_INDIVIDUAL_ADDRESS],
): selector.selector({"text": {}}),
): selector.TextSelector(),
vol.Required(
CONF_KNX_MCAST_GRP,
default=self.current_config.get(CONF_KNX_MCAST_GRP, DEFAULT_MCAST_GRP),
Expand Down Expand Up @@ -438,7 +446,7 @@ async def async_step_init(
CONF_KNX_DEFAULT_STATE_UPDATER,
),
)
] = selector.selector({"boolean": {}})
] = selector.BooleanSelector()
data_schema[
vol.Required(
CONF_KNX_RATE_LIMIT,
Expand All @@ -448,14 +456,12 @@ async def async_step_init(
),
)
] = vol.All(
selector.selector(
{
"number": {
"min": 1,
"max": CONF_MAX_RATE_LIMIT,
"mode": "box",
}
}
selector.NumberSelector(
selector.NumberSelectorConfig(
min=0,
max=CONF_MAX_RATE_LIMIT,
mode=selector.NumberSelectorMode.BOX,
),
),
vol.Coerce(int),
)
Expand Down
26 changes: 14 additions & 12 deletions homeassistant/components/min_max/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,33 @@
from .const import CONF_ENTITY_IDS, CONF_ROUND_DIGITS, DOMAIN

_STATISTIC_MEASURES = [
{"value": "min", "label": "Minimum"},
{"value": "max", "label": "Maximum"},
{"value": "mean", "label": "Arithmetic mean"},
{"value": "median", "label": "Median"},
{"value": "last", "label": "Most recently updated"},
selector.SelectOptionDict(value="min", label="Minimum"),
selector.SelectOptionDict(value="max", label="Maximum"),
selector.SelectOptionDict(value="mean", label="Arithmetic mean"),
selector.SelectOptionDict(value="median", label="Median"),
selector.SelectOptionDict(value="last", label="Most recently updated"),
]


OPTIONS_SCHEMA = vol.Schema(
{
vol.Required(CONF_ENTITY_IDS): selector.selector(
{"entity": {"domain": "sensor", "multiple": True}}
vol.Required(CONF_ENTITY_IDS): selector.EntitySelector(
selector.EntitySelectorConfig(domain="sensor", multiple=True),
),
vol.Required(CONF_TYPE): selector.selector(
{"select": {"options": _STATISTIC_MEASURES}}
vol.Required(CONF_TYPE): selector.SelectSelector(
selector.SelectSelectorConfig(options=_STATISTIC_MEASURES),
),
vol.Required(CONF_ROUND_DIGITS, default=2): selector.selector(
{"number": {"min": 0, "max": 6, "mode": "box"}}
vol.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0, max=6, mode=selector.NumberSelectorMode.BOX
),
),
}
)

CONFIG_SCHEMA = vol.Schema(
{
vol.Required("name"): selector.selector({"text": {}}),
vol.Required("name"): selector.TextSelector(),
}
).extend(OPTIONS_SCHEMA.schema)

Expand Down

0 comments on commit b325c11

Please sign in to comment.