Migrate to voluptuous (#2989)

🍪 🐬
This commit is contained in:
Fabian Affolter 2016-08-27 22:42:34 +02:00 committed by Teagan Glenn
parent 6acaf25b0d
commit e6b9d5f5b3
3 changed files with 46 additions and 36 deletions

View File

@ -10,37 +10,35 @@ import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth from requests.auth import HTTPBasicAuth, HTTPDigestAuth
import voluptuous as vol 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.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 from homeassistant.helpers import config_validation as cv, template
_LOGGER = logging.getLogger(__name__) _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_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change'
CONF_STILL_IMAGE_URL = 'still_image_url'
DEFAULT_NAME = 'Generic Camera' DEFAULT_NAME = 'Generic Camera'
BASIC_AUTHENTICATION = 'basic'
DIGEST_AUTHENTICATION = 'digest'
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
# pylint: disable=no-value-for-parameter vol.Required(CONF_STILL_IMAGE_URL): vol.Any(cv.url, cv.template),
vol.Required(CONF_STILL_IMAGE_URL): vol.Any(vol.Url(), cv.template), vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION):
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]),
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.Optional(CONF_LIMIT_REFETCH_TO_URL_CHANGE, default=False): cv.boolean, 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 # 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.""" """Setup a generic IP Camera."""
add_devices_callback([GenericCamera(config)]) add_devices([GenericCamera(config)])
# pylint: disable=too-many-instance-attributes # pylint: disable=too-many-instance-attributes
@ -58,7 +56,7 @@ class GenericCamera(Camera):
password = device_info.get(CONF_PASSWORD) password = device_info.get(CONF_PASSWORD)
if username and 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) self._auth = HTTPDigestAuth(username, password)
else: else:
self._auth = HTTPBasicAuth(username, password) self._auth = HTTPBasicAuth(username, password)

View File

@ -9,26 +9,35 @@ from contextlib import closing
import requests import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth from requests.auth import HTTPBasicAuth, HTTPDigestAuth
import voluptuous as vol
from homeassistant.components.camera import DOMAIN, Camera from homeassistant.const import (
from homeassistant.helpers import validate_config CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_AUTHENTICATION,
HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION)
CONTENT_TYPE_HEADER = 'Content-Type' from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera)
from homeassistant.helpers import config_validation as cv
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
BASIC_AUTHENTICATION = 'basic' CONF_MJPEG_URL = 'mjpeg_url'
DIGEST_AUTHENTICATION = 'digest' 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 # 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.""" """Setup a MJPEG IP Camera."""
if not validate_config({DOMAIN: config}, {DOMAIN: ['mjpeg_url']}, add_devices([MjpegCamera(config)])
_LOGGER):
return None
add_devices_callback([MjpegCamera(config)])
def extract_image_from_mjpeg(stream): def extract_image_from_mjpeg(stream):
@ -50,17 +59,16 @@ class MjpegCamera(Camera):
def __init__(self, device_info): def __init__(self, device_info):
"""Initialize a MJPEG camera.""" """Initialize a MJPEG camera."""
super().__init__() super().__init__()
self._name = device_info.get('name', 'Mjpeg Camera') self._name = device_info.get(CONF_NAME)
self._authentication = device_info.get('authentication', self._authentication = device_info.get(CONF_AUTHENTICATION)
BASIC_AUTHENTICATION) self._username = device_info.get(CONF_USERNAME)
self._username = device_info.get('username') self._password = device_info.get(CONF_PASSWORD)
self._password = device_info.get('password') self._mjpeg_url = device_info[CONF_MJPEG_URL]
self._mjpeg_url = device_info['mjpeg_url']
def camera_stream(self): def camera_stream(self):
"""Return a MJPEG stream image response directly from the camera.""" """Return a MJPEG stream image response directly from the camera."""
if self._username and self._password: if self._username and self._password:
if self._authentication == DIGEST_AUTHENTICATION: if self._authentication == HTTP_DIGEST_AUTHENTICATION:
auth = HTTPDigestAuth(self._username, self._password) auth = HTTPDigestAuth(self._username, self._password)
else: else:
auth = HTTPBasicAuth(self._username, self._password) auth = HTTPBasicAuth(self._username, self._password)

View File

@ -23,6 +23,7 @@ CONF_ACCESS_TOKEN = 'access_token'
CONF_AFTER = 'after' CONF_AFTER = 'after'
CONF_ALIAS = 'alias' CONF_ALIAS = 'alias'
CONF_API_KEY = 'api_key' CONF_API_KEY = 'api_key'
CONF_AUTHENTICATION = 'authentication'
CONF_BEFORE = 'before' CONF_BEFORE = 'before'
CONF_BELOW = 'below' CONF_BELOW = 'below'
CONF_BLACKLIST = 'blacklist' CONF_BLACKLIST = 'blacklist'
@ -280,6 +281,9 @@ HTTP_METHOD_NOT_ALLOWED = 405
HTTP_UNPROCESSABLE_ENTITY = 422 HTTP_UNPROCESSABLE_ENTITY = 422
HTTP_INTERNAL_SERVER_ERROR = 500 HTTP_INTERNAL_SERVER_ERROR = 500
HTTP_BASIC_AUTHENTICATION = 'basic'
HTTP_DIGEST_AUTHENTICATION = 'digest'
HTTP_HEADER_HA_AUTH = 'X-HA-access' HTTP_HEADER_HA_AUTH = 'X-HA-access'
HTTP_HEADER_ACCEPT_ENCODING = 'Accept-Encoding' HTTP_HEADER_ACCEPT_ENCODING = 'Accept-Encoding'
HTTP_HEADER_CONTENT_TYPE = 'Content-type' HTTP_HEADER_CONTENT_TYPE = 'Content-type'