Moved service decorator to service helpers

Moved the service decorator to the service helpers module and moved the
associated tests.
This commit is contained in:
Ryan Kraus 2016-01-24 22:46:30 -05:00
parent f66aeb2e73
commit 5830da63b1
5 changed files with 40 additions and 17 deletions

View File

@ -31,7 +31,8 @@ import logging
from homeassistant.const import STATE_HOME, STATE_NOT_HOME, STATE_ON, STATE_OFF
from homeassistant.helpers import validate_config
from homeassistant.helpers.event_decorators import \
track_state_change, track_time_change, service
track_state_change, track_time_change
from homeassistant.helpers.service import service
import homeassistant.components as core
from homeassistant.components import device_tracker
from homeassistant.components import light

View File

@ -24,7 +24,7 @@ import homeassistant.config as config_util
import homeassistant.loader as loader
import homeassistant.components as core_components
import homeassistant.components.group as group
from homeassistant.helpers import event_decorators
from homeassistant.helpers import event_decorators, service
from homeassistant.helpers.entity import Entity
from homeassistant.const import (
__version__, EVENT_COMPONENT_LOADED, CONF_LATITUDE, CONF_LONGITUDE,
@ -202,6 +202,7 @@ def from_config_dict(config, hass=None, config_dir=None, enable_log=True,
# give event decorators access to HASS
event_decorators.HASS = hass
service.HASS = hass
# Setup the components
for domain in loader.load_order_components(components):

View File

@ -1,9 +1,12 @@
"""Service calling related helpers."""
import functools
import logging
from homeassistant.util import split_entity_id
from homeassistant.const import ATTR_ENTITY_ID
HASS = None
CONF_SERVICE = 'service'
CONF_SERVICE_ENTITY_ID = 'entity_id'
CONF_SERVICE_DATA = 'data'
@ -11,6 +14,23 @@ CONF_SERVICE_DATA = 'data'
_LOGGER = logging.getLogger(__name__)
def _callback(action, *args, **kwargs):
""" adds HASS to callback arguments """
action(HASS, *args, **kwargs)
def service(domain, service_name):
""" Decorator factory to register a service """
def register_service_decorator(action):
""" Decorator to register a service """
HASS.services.register(domain, service_name,
functools.partial(_callback, action))
return action
return register_service_decorator
def call_from_config(hass, config, blocking=False):
"""Call a service based on a config hash."""
if not isinstance(config, dict) or CONF_SERVICE not in config:
@ -18,7 +38,7 @@ def call_from_config(hass, config, blocking=False):
return
try:
domain, service = split_entity_id(config[CONF_SERVICE])
domain, service_name = split_entity_id(config[CONF_SERVICE])
except ValueError:
_LOGGER.error('Invalid service specified: %s', config[CONF_SERVICE])
return
@ -40,4 +60,4 @@ def call_from_config(hass, config, blocking=False):
elif entity_id is not None:
service_data[ATTR_ENTITY_ID] = entity_id
hass.services.call(domain, service, service_data, blocking)
hass.services.call(domain, service_name, service_data, blocking)

View File

@ -15,7 +15,7 @@ import homeassistant.core as ha
import homeassistant.util.dt as dt_util
from homeassistant.helpers import event_decorators
from homeassistant.helpers.event_decorators import (
track_time_change, track_utc_time_change, track_state_change, service,
track_time_change, track_utc_time_change, track_state_change,
track_sunrise, track_sunset)
from homeassistant.components import sun
@ -37,17 +37,6 @@ class TestEventDecoratorHelpers(unittest.TestCase):
""" Stop down stuff we started. """
self.hass.stop()
def test_service(self):
""" Test service registration decorator. """
runs = []
decor = service('test', 'test')
decor(lambda x, y: runs.append(1))
self.hass.services.call('test', 'test')
self.hass.pool.block_till_done()
self.assertEqual(1, len(runs))
def test_track_sunrise(self):
""" Test track sunrise decorator """
latitude = 32.87336

View File

@ -7,7 +7,6 @@ Test service helpers.
import unittest
from unittest.mock import patch
from homeassistant.const import SERVICE_TURN_ON
from homeassistant.helpers import service
from tests.common import get_test_home_assistant, mock_service
@ -23,10 +22,23 @@ class TestServiceHelpers(unittest.TestCase):
self.hass = get_test_home_assistant()
self.calls = mock_service(self.hass, 'test_domain', 'test_service')
service.HASS = self.hass
def tearDown(self): # pylint: disable=invalid-name
""" Stop down stuff we started. """
self.hass.stop()
def test_service(self):
""" Test service registration decorator. """
runs = []
decor = service.service('test', 'test')
decor(lambda x, y: runs.append(1))
self.hass.services.call('test', 'test')
self.hass.pool.block_till_done()
self.assertEqual(1, len(runs))
def test_split_entity_string(self):
service.call_from_config(self.hass, {
'service': 'test_domain.test_service',