From e6b9d5f5b35aae3b48a8b798a1d7e5eee965936a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 27 Aug 2016 22:42:34 +0200 Subject: [PATCH] Migrate to voluptuous (#2989) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🍪 🐬 --- homeassistant/components/camera/generic.py | 32 +++++++-------- homeassistant/components/camera/mjpeg.py | 46 +++++++++++++--------- homeassistant/const.py | 4 ++ 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/homeassistant/components/camera/generic.py b/homeassistant/components/camera/generic.py index a03acc32eb8..85a662065a6 100644 --- a/homeassistant/components/camera/generic.py +++ b/homeassistant/components/camera/generic.py @@ -10,37 +10,35 @@ import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth import voluptuous as vol -from homeassistant.const import CONF_NAME, CONF_USERNAME, CONF_PASSWORD +from homeassistant.const import ( + CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_AUTHENTICATION, + HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION) from homeassistant.exceptions import TemplateError -from homeassistant.components.camera import PLATFORM_SCHEMA, Camera +from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera) from homeassistant.helpers import config_validation as cv, template - _LOGGER = logging.getLogger(__name__) -CONF_AUTHENTICATION = 'authentication' -CONF_STILL_IMAGE_URL = 'still_image_url' CONF_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change' +CONF_STILL_IMAGE_URL = 'still_image_url' + DEFAULT_NAME = 'Generic Camera' -BASIC_AUTHENTICATION = 'basic' -DIGEST_AUTHENTICATION = 'digest' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - # pylint: disable=no-value-for-parameter - vol.Required(CONF_STILL_IMAGE_URL): vol.Any(vol.Url(), cv.template), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_AUTHENTICATION, default=BASIC_AUTHENTICATION): - vol.In([BASIC_AUTHENTICATION, DIGEST_AUTHENTICATION]), + vol.Required(CONF_STILL_IMAGE_URL): vol.Any(cv.url, cv.template), + vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): + vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]), vol.Optional(CONF_LIMIT_REFETCH_TO_URL_CHANGE, default=False): cv.boolean, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_PASSWORD): cv.string, + vol.Optional(CONF_USERNAME): cv.string, }) # pylint: disable=unused-argument -def setup_platform(hass, config, add_devices_callback, discovery_info=None): +def setup_platform(hass, config, add_devices, discovery_info=None): """Setup a generic IP Camera.""" - add_devices_callback([GenericCamera(config)]) + add_devices([GenericCamera(config)]) # pylint: disable=too-many-instance-attributes @@ -58,7 +56,7 @@ class GenericCamera(Camera): password = device_info.get(CONF_PASSWORD) if username and password: - if device_info[CONF_AUTHENTICATION] == DIGEST_AUTHENTICATION: + if device_info[CONF_AUTHENTICATION] == HTTP_DIGEST_AUTHENTICATION: self._auth = HTTPDigestAuth(username, password) else: self._auth = HTTPBasicAuth(username, password) diff --git a/homeassistant/components/camera/mjpeg.py b/homeassistant/components/camera/mjpeg.py index 16897df315b..04f099d8b1e 100644 --- a/homeassistant/components/camera/mjpeg.py +++ b/homeassistant/components/camera/mjpeg.py @@ -9,26 +9,35 @@ from contextlib import closing import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth +import voluptuous as vol -from homeassistant.components.camera import DOMAIN, Camera -from homeassistant.helpers import validate_config - -CONTENT_TYPE_HEADER = 'Content-Type' +from homeassistant.const import ( + CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_AUTHENTICATION, + HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION) +from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera) +from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) -BASIC_AUTHENTICATION = 'basic' -DIGEST_AUTHENTICATION = 'digest' +CONF_MJPEG_URL = 'mjpeg_url' +CONTENT_TYPE_HEADER = 'Content-Type' + +DEFAULT_NAME = 'Mjpeg Camera' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_MJPEG_URL): cv.url, + vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): + vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]), + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_PASSWORD): cv.string, + vol.Optional(CONF_USERNAME): cv.string, +}) # pylint: disable=unused-argument -def setup_platform(hass, config, add_devices_callback, discovery_info=None): +def setup_platform(hass, config, add_devices, discovery_info=None): """Setup a MJPEG IP Camera.""" - if not validate_config({DOMAIN: config}, {DOMAIN: ['mjpeg_url']}, - _LOGGER): - return None - - add_devices_callback([MjpegCamera(config)]) + add_devices([MjpegCamera(config)]) def extract_image_from_mjpeg(stream): @@ -50,17 +59,16 @@ class MjpegCamera(Camera): def __init__(self, device_info): """Initialize a MJPEG camera.""" super().__init__() - self._name = device_info.get('name', 'Mjpeg Camera') - self._authentication = device_info.get('authentication', - BASIC_AUTHENTICATION) - self._username = device_info.get('username') - self._password = device_info.get('password') - self._mjpeg_url = device_info['mjpeg_url'] + self._name = device_info.get(CONF_NAME) + self._authentication = device_info.get(CONF_AUTHENTICATION) + self._username = device_info.get(CONF_USERNAME) + self._password = device_info.get(CONF_PASSWORD) + self._mjpeg_url = device_info[CONF_MJPEG_URL] def camera_stream(self): """Return a MJPEG stream image response directly from the camera.""" if self._username and self._password: - if self._authentication == DIGEST_AUTHENTICATION: + if self._authentication == HTTP_DIGEST_AUTHENTICATION: auth = HTTPDigestAuth(self._username, self._password) else: auth = HTTPBasicAuth(self._username, self._password) diff --git a/homeassistant/const.py b/homeassistant/const.py index b296a4959b1..76fc1226ca1 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -23,6 +23,7 @@ CONF_ACCESS_TOKEN = 'access_token' CONF_AFTER = 'after' CONF_ALIAS = 'alias' CONF_API_KEY = 'api_key' +CONF_AUTHENTICATION = 'authentication' CONF_BEFORE = 'before' CONF_BELOW = 'below' CONF_BLACKLIST = 'blacklist' @@ -280,6 +281,9 @@ HTTP_METHOD_NOT_ALLOWED = 405 HTTP_UNPROCESSABLE_ENTITY = 422 HTTP_INTERNAL_SERVER_ERROR = 500 +HTTP_BASIC_AUTHENTICATION = 'basic' +HTTP_DIGEST_AUTHENTICATION = 'digest' + HTTP_HEADER_HA_AUTH = 'X-HA-access' HTTP_HEADER_ACCEPT_ENCODING = 'Accept-Encoding' HTTP_HEADER_CONTENT_TYPE = 'Content-type'