From 238430136e9227460c3a125790c1d532c30c8ed8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 13 Jun 2020 01:44:29 +0200 Subject: [PATCH] Migrate script to use describe_event for logbook (#36729) --- homeassistant/components/logbook/__init__.py | 16 ----- homeassistant/components/script/__init__.py | 43 +++++++----- homeassistant/components/script/manifest.json | 1 + homeassistant/const.py | 1 - tests/components/logbook/test_init.py | 70 ------------------- tests/components/script/test_init.py | 38 ++++++++-- 6 files changed, 61 insertions(+), 108 deletions(-) diff --git a/homeassistant/components/logbook/__init__.py b/homeassistant/components/logbook/__init__.py index 6f2a159d2d6..ec5dcea3051 100644 --- a/homeassistant/components/logbook/__init__.py +++ b/homeassistant/components/logbook/__init__.py @@ -25,7 +25,6 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, EVENT_LOGBOOK_ENTRY, - EVENT_SCRIPT_STARTED, EVENT_STATE_CHANGED, HTTP_BAD_REQUEST, STATE_NOT_HOME, @@ -81,7 +80,6 @@ ALL_EVENT_TYPES = [ EVENT_LOGBOOK_ENTRY, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, - EVENT_SCRIPT_STARTED, ] LOG_MESSAGE_SCHEMA = vol.Schema( @@ -323,17 +321,6 @@ def humanify(hass, events): "context_user_id": event.context.user_id, } - elif event.event_type == EVENT_SCRIPT_STARTED: - yield { - "when": event.time_fired, - "name": event.data.get(ATTR_NAME), - "message": "started", - "domain": "script", - "entity_id": event.data.get(ATTR_ENTITY_ID), - "context_id": event.context.id, - "context_user_id": event.context.user_id, - } - def _get_related_entity_ids(session, entity_filter): timer_start = time.perf_counter() @@ -456,9 +443,6 @@ def _keep_event(hass, event, entities_filter): elif event.event_type == EVENT_LOGBOOK_ENTRY: domain = event.data.get(ATTR_DOMAIN) - elif event.event_type == EVENT_SCRIPT_STARTED: - domain = "script" - elif not entity_id and event.event_type in hass.data.get(DOMAIN, {}): # If the entity_id isn't described, use the domain that describes # the event for filtering. diff --git a/homeassistant/components/script/__init__.py b/homeassistant/components/script/__init__.py index 6efd4c849aa..b9043ff2f09 100644 --- a/homeassistant/components/script/__init__.py +++ b/homeassistant/components/script/__init__.py @@ -10,7 +10,6 @@ from homeassistant.const import ( ATTR_NAME, CONF_ALIAS, CONF_ICON, - EVENT_SCRIPT_STARTED, SERVICE_RELOAD, SERVICE_TOGGLE, SERVICE_TURN_OFF, @@ -41,6 +40,8 @@ CONF_SEQUENCE = "sequence" ENTITY_ID_FORMAT = DOMAIN + ".{}" +EVENT_SCRIPT_STARTED = "script_started" + SCRIPT_ENTRY_SCHEMA = vol.Schema( { vol.Optional(CONF_ALIAS): cv.string, @@ -81,13 +82,11 @@ def scripts_with_entity(hass: HomeAssistant, entity_id: str) -> List[str]: component = hass.data[DOMAIN] - results = [] - - for script_entity in component.entities: - if entity_id in script_entity.script.referenced_entities: - results.append(script_entity.entity_id) - - return results + return [ + script_entity.entity_id + for script_entity in component.entities + if entity_id in script_entity.script.referenced_entities + ] @callback @@ -114,13 +113,11 @@ def scripts_with_device(hass: HomeAssistant, device_id: str) -> List[str]: component = hass.data[DOMAIN] - results = [] - - for script_entity in component.entities: - if device_id in script_entity.script.referenced_devices: - results.append(script_entity.entity_id) - - return results + return [ + script_entity.entity_id + for script_entity in component.entities + if device_id in script_entity.script.referenced_devices + ] @callback @@ -191,6 +188,19 @@ async def async_setup(hass, config): DOMAIN, SERVICE_TOGGLE, toggle_service, schema=SCRIPT_TURN_ONOFF_SCHEMA ) + @callback + def async_describe_logbook_event(event): + """Describe the logbook event.""" + return { + "name": event.data.get(ATTR_NAME), + "message": "started", + "entity_id": event.data.get(ATTR_ENTITY_ID), + } + + hass.components.logbook.async_describe_event( + DOMAIN, EVENT_SCRIPT_STARTED, async_describe_logbook_event + ) + return True @@ -259,8 +269,7 @@ class ScriptEntity(ToggleEntity): @property def state_attributes(self): """Return the state attributes.""" - attrs = {} - attrs[ATTR_LAST_TRIGGERED] = self.script.last_triggered + attrs = {ATTR_LAST_TRIGGERED: self.script.last_triggered} if self.script.can_cancel: attrs[ATTR_CAN_CANCEL] = self.script.can_cancel if self.script.last_action: diff --git a/homeassistant/components/script/manifest.json b/homeassistant/components/script/manifest.json index 32acfcbb93b..9348469d258 100644 --- a/homeassistant/components/script/manifest.json +++ b/homeassistant/components/script/manifest.json @@ -2,6 +2,7 @@ "domain": "script", "name": "Scripts", "documentation": "https://www.home-assistant.io/integrations/script", + "after_dependencies": ["logbook"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/const.py b/homeassistant/const.py index 578c5215ed3..c95c6ec48cc 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -191,7 +191,6 @@ EVENT_HOMEASSISTANT_STOP = "homeassistant_stop" EVENT_HOMEASSISTANT_FINAL_WRITE = "homeassistant_final_write" EVENT_LOGBOOK_ENTRY = "logbook_entry" EVENT_PLATFORM_DISCOVERED = "platform_discovered" -EVENT_SCRIPT_STARTED = "script_started" EVENT_SERVICE_REGISTERED = "service_registered" EVENT_SERVICE_REMOVED = "service_removed" EVENT_STATE_CHANGED = "state_changed" diff --git a/tests/components/logbook/test_init.py b/tests/components/logbook/test_init.py index 7e92e7be69c..cf2744aa67a 100644 --- a/tests/components/logbook/test_init.py +++ b/tests/components/logbook/test_init.py @@ -13,10 +13,8 @@ from homeassistant.components.alexa.smart_home import EVENT_ALEXA_SMART_HOME from homeassistant.const import ( ATTR_ENTITY_ID, ATTR_HIDDEN, - ATTR_NAME, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, - EVENT_SCRIPT_STARTED, EVENT_STATE_CHANGED, STATE_NOT_HOME, STATE_OFF, @@ -302,45 +300,6 @@ class TestComponentLogbook(unittest.TestCase): entries[1], pointB, "blu", domain="sensor", entity_id=entity_id2 ) - def test_exclude_script_events(self): - """Test if script start can be excluded by entity_id.""" - name = "My Script Rule" - domain = "script" - entity_id = "script.my_script" - entity_id2 = "script.my_script_2" - entity_id2 = "sensor.blu" - - eventA = ha.Event( - logbook.EVENT_SCRIPT_STARTED, - {logbook.ATTR_NAME: name, logbook.ATTR_ENTITY_ID: entity_id}, - ) - eventB = ha.Event( - logbook.EVENT_SCRIPT_STARTED, - {logbook.ATTR_NAME: name, logbook.ATTR_ENTITY_ID: entity_id2}, - ) - - config = logbook.CONFIG_SCHEMA( - { - ha.DOMAIN: {}, - logbook.DOMAIN: { - logbook.CONF_EXCLUDE: {logbook.CONF_ENTITIES: [entity_id]} - }, - } - ) - entities_filter = logbook._generate_filter_from_config(config[logbook.DOMAIN]) - events = [ - e - for e in (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB) - if logbook._keep_event(self.hass, e, entities_filter) - ] - entries = list(logbook.humanify(self.hass, events)) - - assert len(entries) == 2 - self.assert_entry( - entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN - ) - self.assert_entry(entries[1], name=name, domain=domain, entity_id=entity_id2) - def test_include_events_entity(self): """Test if events are filtered if entity is included in config.""" entity_id = "sensor.bla" @@ -1293,35 +1252,6 @@ async def test_logbook_view_period_entity(hass, hass_client): assert json[0]["entity_id"] == entity_id_test -async def test_humanify_script_started_event(hass): - """Test humanifying Script Run event.""" - event1, event2 = list( - logbook.humanify( - hass, - [ - ha.Event( - EVENT_SCRIPT_STARTED, - {ATTR_ENTITY_ID: "script.hello", ATTR_NAME: "Hello Script"}, - ), - ha.Event( - EVENT_SCRIPT_STARTED, - {ATTR_ENTITY_ID: "script.bye", ATTR_NAME: "Bye Script"}, - ), - ], - ) - ) - - assert event1["name"] == "Hello Script" - assert event1["domain"] == "script" - assert event1["message"] == "started" - assert event1["entity_id"] == "script.hello" - - assert event2["name"] == "Bye Script" - assert event2["domain"] == "script" - assert event2["message"] == "started" - assert event2["entity_id"] == "script.bye" - - async def test_logbook_describe_event(hass, hass_client): """Test teaching logbook about a new event.""" await hass.async_add_executor_job(init_recorder_component, hass) diff --git a/tests/components/script/test_init.py b/tests/components/script/test_init.py index 7e5d77a8555..21f14ad9c88 100644 --- a/tests/components/script/test_init.py +++ b/tests/components/script/test_init.py @@ -4,18 +4,17 @@ import unittest import pytest -from homeassistant.components import script -from homeassistant.components.script import DOMAIN +from homeassistant.components import logbook, script +from homeassistant.components.script import DOMAIN, EVENT_SCRIPT_STARTED from homeassistant.const import ( ATTR_ENTITY_ID, ATTR_NAME, - EVENT_SCRIPT_STARTED, SERVICE_RELOAD, SERVICE_TOGGLE, SERVICE_TURN_OFF, SERVICE_TURN_ON, ) -from homeassistant.core import Context, callback, split_entity_id +from homeassistant.core import Context, Event, callback, split_entity_id from homeassistant.exceptions import ServiceNotFound from homeassistant.helpers.service import async_get_all_descriptions from homeassistant.loader import bind_hass @@ -468,3 +467,34 @@ async def test_config(hass): test_script = hass.states.get("script.test_script") assert test_script.name == "Script Name" assert test_script.attributes["icon"] == "mdi:party" + + +async def test_logbook_humanify_script_started_event(hass): + """Test humanifying script started event.""" + await async_setup_component(hass, DOMAIN, {}) + + event1, event2 = list( + logbook.humanify( + hass, + [ + Event( + EVENT_SCRIPT_STARTED, + {ATTR_ENTITY_ID: "script.hello", ATTR_NAME: "Hello Script"}, + ), + Event( + EVENT_SCRIPT_STARTED, + {ATTR_ENTITY_ID: "script.bye", ATTR_NAME: "Bye Script"}, + ), + ], + ) + ) + + assert event1["name"] == "Hello Script" + assert event1["domain"] == "script" + assert event1["message"] == "started" + assert event1["entity_id"] == "script.hello" + + assert event2["name"] == "Bye Script" + assert event2["domain"] == "script" + assert event2["message"] == "started" + assert event2["entity_id"] == "script.bye"