67 lines
1.9 KiB
Python
Raw Normal View History

2016-10-11 16:42:06 +00:00
# -*- coding:utf-8 -*-
# a module of helper functions
# mostly for the configuration
import contextlib
import os
from . import nest
# use six for python2/python3 compatibility
from six.moves import configparser
class MissingCredentialsError(ValueError):
pass
def get_config(config_path=None, prog='nest'):
if not config_path:
config_path = os.path.sep.join(('~', '.config', prog, 'config'))
defaults = {'celsius': False}
config_file = os.path.expanduser(config_path)
if os.path.exists(config_file):
config = configparser.SafeConfigParser()
config.read([config_file])
if config.has_section('nest'):
defaults.update(dict(config.items('nest')))
return defaults
def get_auth_credentials(config_path=None):
config = get_config(config_path)
username = config.get('user')
password = config.get('password')
return username, password
@contextlib.contextmanager
def nest_login(config_path=None, username=None, password=None, **kwargs):
"""
This a context manager for creating a Nest object using
authentication credentials either provided as keyword arguments
or read from the configuration file.
:param config_path: Path to the config file.
The default is used if none is provided.
Optional if the the credentials are provided as arguments.
:param username: Optional if the config file contains the username.
:param password: Optional if the config file contains the password.
:param kwargs: Keyword arguments to pass onto the Nest initializer.
:return: Nest object
"""
credentials_config = get_auth_credentials(config_path)
if not username:
username = credentials_config[0]
if not password:
password = credentials_config[1]
if username and password:
yield nest.Nest(username, password, **kwargs)
else:
raise MissingCredentialsError(
'The login credentials have not been provided.')