From 9e0ca719ed857f410c3e7d3528fb132a0f3f34db Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Wed, 10 Jan 2018 09:06:26 +0100 Subject: [PATCH] Deprecate explicit entity_id in template platforms (#11123) * Deprecate explicit entity_id in template platforms * Use config validator for deprecation * Fix copy/paste typos * Also print the config value * Add test for config validator * Assert the module name that logged the message --- .../components/binary_sensor/template.py | 5 +++++ homeassistant/components/cover/template.py | 5 +++++ homeassistant/components/light/template.py | 5 +++++ homeassistant/components/sensor/template.py | 5 +++++ homeassistant/components/switch/template.py | 5 +++++ homeassistant/helpers/config_validation.py | 18 ++++++++++++++++ tests/helpers/test_config_validation.py | 21 +++++++++++++++++++ 7 files changed, 64 insertions(+) diff --git a/homeassistant/components/binary_sensor/template.py b/homeassistant/components/binary_sensor/template.py index 16167a93b82..92213a9b590 100644 --- a/homeassistant/components/binary_sensor/template.py +++ b/homeassistant/components/binary_sensor/template.py @@ -38,6 +38,11 @@ SENSOR_SCHEMA = vol.Schema({ vol.All(cv.time_period, cv.positive_timedelta), }) +SENSOR_SCHEMA = vol.All( + cv.deprecated(ATTR_ENTITY_ID), + SENSOR_SCHEMA, +) + PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_SENSORS): vol.Schema({cv.slug: SENSOR_SCHEMA}), }) diff --git a/homeassistant/components/cover/template.py b/homeassistant/components/cover/template.py index f4728a12a3b..a7db472f191 100644 --- a/homeassistant/components/cover/template.py +++ b/homeassistant/components/cover/template.py @@ -67,6 +67,11 @@ COVER_SCHEMA = vol.Schema({ vol.Optional(CONF_ENTITY_ID): cv.entity_ids }) +COVER_SCHEMA = vol.All( + cv.deprecated(CONF_ENTITY_ID), + COVER_SCHEMA, +) + PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_COVERS): vol.Schema({cv.slug: COVER_SCHEMA}), }) diff --git a/homeassistant/components/light/template.py b/homeassistant/components/light/template.py index d4f2b93e6b5..ed7ba1978cc 100644 --- a/homeassistant/components/light/template.py +++ b/homeassistant/components/light/template.py @@ -44,6 +44,11 @@ LIGHT_SCHEMA = vol.Schema({ vol.Optional(CONF_ENTITY_ID): cv.entity_ids }) +LIGHT_SCHEMA = vol.All( + cv.deprecated(CONF_ENTITY_ID), + LIGHT_SCHEMA, +) + PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_LIGHTS): vol.Schema({cv.slug: LIGHT_SCHEMA}), }) diff --git a/homeassistant/components/sensor/template.py b/homeassistant/components/sensor/template.py index b347439e08d..1d9bf0b7a9a 100644 --- a/homeassistant/components/sensor/template.py +++ b/homeassistant/components/sensor/template.py @@ -31,6 +31,11 @@ SENSOR_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids }) +SENSOR_SCHEMA = vol.All( + cv.deprecated(ATTR_ENTITY_ID), + SENSOR_SCHEMA, +) + PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_SENSORS): vol.Schema({cv.slug: SENSOR_SCHEMA}), }) diff --git a/homeassistant/components/switch/template.py b/homeassistant/components/switch/template.py index 93ebf98e9ac..64dafdcadef 100644 --- a/homeassistant/components/switch/template.py +++ b/homeassistant/components/switch/template.py @@ -38,6 +38,11 @@ SWITCH_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids }) +SWITCH_SCHEMA = vol.All( + cv.deprecated(ATTR_ENTITY_ID), + SWITCH_SCHEMA, +) + PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_SWITCHES): vol.Schema({cv.slug: SWITCH_SCHEMA}), }) diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index e5d0a34f76e..afb4483647d 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -5,6 +5,8 @@ import os import re from urllib.parse import urlparse from socket import _GLOBAL_DEFAULT_TIMEOUT +import logging +import inspect from typing import Any, Union, TypeVar, Callable, Sequence, Dict @@ -430,6 +432,22 @@ def ensure_list_csv(value: Any) -> Sequence: return ensure_list(value) +def deprecated(key): + """Log key as deprecated.""" + module_name = inspect.getmodule(inspect.stack()[1][0]).__name__ + + def validator(config): + """Check if key is in config and log warning.""" + if key in config: + logging.getLogger(module_name).warning( + "The '%s' option (with value '%s') is deprecated, please " + "remove it from your configuration.", key, config[key]) + + return config + + return validator + + # Validator helpers def key_dependency(key, dependency): diff --git a/tests/helpers/test_config_validation.py b/tests/helpers/test_config_validation.py index 5a940742e75..26262f50ac4 100644 --- a/tests/helpers/test_config_validation.py +++ b/tests/helpers/test_config_validation.py @@ -441,6 +441,27 @@ def test_datetime(): schema('2016-11-23T18:59:08') +def test_deprecated(caplog): + """Test deprecation log.""" + schema = vol.Schema({ + 'venus': cv.boolean, + 'mars': cv.boolean + }) + deprecated_schema = vol.All( + cv.deprecated('mars'), + schema + ) + + deprecated_schema({'venus': True}) + assert len(caplog.records) == 0 + + deprecated_schema({'mars': True}) + assert len(caplog.records) == 1 + assert caplog.records[0].name == __name__ + assert ("The 'mars' option (with value 'True') is deprecated, " + "please remove it from your configuration.") in caplog.text + + def test_key_dependency(): """Test key_dependency validator.""" schema = vol.Schema(cv.key_dependency('beer', 'soda'))