From 40dc6d8191a001c973bf25d22972fcec1681a7a5 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Wed, 8 Nov 2023 09:55:00 +0100 Subject: [PATCH] Reduce modbus validator by using table (#103488) --- homeassistant/components/modbus/validators.py | 31 ++++++++----------- tests/components/modbus/test_sensor.py | 2 +- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/modbus/validators.py b/homeassistant/components/modbus/validators.py index 5fa314d589c..7c007ee0279 100644 --- a/homeassistant/components/modbus/validators.py +++ b/homeassistant/components/modbus/validators.py @@ -98,27 +98,22 @@ def struct_validator(config: dict[str, Any]) -> dict[str, Any]: data_type = config[CONF_DATA_TYPE] = DataType.INT16 count = config.get(CONF_COUNT, None) structure = config.get(CONF_STRUCTURE, None) - slave_count = config.get(CONF_SLAVE_COUNT, None) - slave_name = CONF_SLAVE_COUNT - if not slave_count: - slave_count = config.get(CONF_VIRTUAL_COUNT, 0) - slave_name = CONF_VIRTUAL_COUNT + slave_count = config.get(CONF_SLAVE_COUNT, config.get(CONF_VIRTUAL_COUNT, 0)) swap_type = config.get(CONF_SWAP, CONF_SWAP_NONE) validator = DEFAULT_STRUCT_FORMAT[data_type].validate_parm - if count and not validator.count: - error = f"{name}: `{CONF_COUNT}: {count}` cannot be combined with `{CONF_DATA_TYPE}: {data_type}`" - raise vol.Invalid(error) - if not count and validator.count: - error = f"{name}: `{CONF_COUNT}:` missing, demanded with `{CONF_DATA_TYPE}: {data_type}`" - raise vol.Invalid(error) - if structure and not validator.structure: - error = f"{name}: `{CONF_STRUCTURE}: {structure}` cannot be combined with `{CONF_DATA_TYPE}: {data_type}`" - raise vol.Invalid(error) - if not structure and validator.structure: - error = f"{name}: `{CONF_STRUCTURE}` missing or empty, demanded with `{CONF_DATA_TYPE}: {data_type}`" - raise vol.Invalid(error) + for entry in ( + (count, validator.count, CONF_COUNT), + (structure, validator.structure, CONF_STRUCTURE), + ): + if bool(entry[0]) != entry[1]: + error = "cannot be combined" if not entry[1] else "missing, demanded" + error = ( + f"{name}: `{entry[2]}:` {error} with `{CONF_DATA_TYPE}: {data_type}`" + ) + raise vol.Invalid(error) + if slave_count and not validator.slave_count: - error = f"{name}: `{slave_name}: {slave_count}` cannot be combined with `{CONF_DATA_TYPE}: {data_type}`" + error = f"{name}: `{CONF_VIRTUAL_COUNT} / {CONF_SLAVE_COUNT}:` cannot be combined with `{CONF_DATA_TYPE}: {data_type}`" raise vol.Invalid(error) if swap_type != CONF_SWAP_NONE: swap_type_validator = { diff --git a/tests/components/modbus/test_sensor.py b/tests/components/modbus/test_sensor.py index 72aebbd396f..1c627faa09c 100644 --- a/tests/components/modbus/test_sensor.py +++ b/tests/components/modbus/test_sensor.py @@ -247,7 +247,7 @@ async def test_config_sensor(hass: HomeAssistant, mock_modbus) -> None: }, ] }, - f"{TEST_ENTITY_NAME}: `{CONF_STRUCTURE}` missing or empty, demanded with `{CONF_DATA_TYPE}: {DataType.CUSTOM}`", + f"{TEST_ENTITY_NAME}: `{CONF_STRUCTURE}:` missing, demanded with `{CONF_DATA_TYPE}: {DataType.CUSTOM}`", ), ( {