Source code for misfit.cli
#!/usr/bin/env python
"""Misfit client
Usage:
misfit authorize --client_id=<client_id> --client_secret=<client_secret> [--config=<config_file>]
misfit profile [--user_id=<user_id>] [--object_id=<object_id>] [--config=<config_file>]
misfit device [--user_id=<user_id>] [--object_id=<object_id>] [--config=<config_file>]
misfit goal (--start_date=<start_date> --end_date=<end_date>|--object_id=<object_id>) [--user_id=<user_id>] [--config=<config_file>]
misfit summary --start_date=<start_date> --end_date=<end_date> [--detail] [--user_id=<user_id>] [--config=<config_file>]
misfit session (--start_date=<start_date> --end_date=<end_date>|--object_id=<object_id>) [--user_id=<user_id>] [--config=<config_file>]
misfit sleep (--start_date=<start_date> --end_date=<end_date>|--object_id=<object_id>) [--user_id=<user_id>] [--config=<config_file>]
misfit --version
misfit --help
Options:
-h --help Show this screen.
--version Show version.
--client_id=<client_id> App key of your Misfit app.
--client_secret=<client_secret> App secret of your Misfit app.
--config=<config_file> Use the config file specified [default: ./misfit.cfg]
--user_id=<user_id> Misfit User ID.
--object_id=<object_id> ID of a single Misfit object.
--start_date=<start_date Date at the start of a range: Eg. 2014-11-20.
--end_date=<end_date> Date at the end of a range: Eg. 2014-11-30.
--detail If specified, print summary detail for each day.
"""
from __future__ import absolute_import
from docopt import docopt
from pprint import PrettyPrinter
from six.moves import configparser
from misfit import __version__
from misfit.auth import MisfitAuth
from misfit.misfit import Misfit
[docs]class MisfitCli:
def __init__(self, arguments):
"""
Runs the command specified as an argument with the options specified
"""
self.config_file = arguments['--config']
self.config = configparser.ConfigParser()
self.client_id = None
self.client_secret = None
self.access_token = None
if arguments['authorize']:
self.client_id = arguments['--client_id']
self.client_secret = arguments['--client_secret']
self.authorize()
elif not arguments['--version'] and not arguments['--help']:
try:
# Fail if config file doesn't exist or is missing information
self.read_config()
except (IOError, configparser.NoOptionError,
configparser.NoSectionError):
print('Missing config information, please run '
'"misfit authorize"')
else:
# Everything is good! Get the requested resource(s)
self.get_resource(arguments)
[docs] def read_config(self):
""" Read credentials from the config file """
with open(self.config_file) as cfg:
try:
self.config.read_file(cfg)
except AttributeError: # Not python 3.X fallback
self.config.readfp(cfg)
self.client_id = self.config.get('misfit', 'client_id')
self.client_secret = self.config.get('misfit', 'client_secret')
self.access_token = self.config.get('misfit', 'access_token')
[docs] def write_config(self, access_token):
""" Write credentials to the config file """
self.config.add_section('misfit')
self.config.set('misfit', 'client_id', self.client_id)
self.config.set('misfit', 'client_secret', self.client_secret)
self.config.set('misfit', 'access_token', access_token)
with open(self.config_file, 'w') as cfg:
self.config.write(cfg)
print('Credentials written to %s' % self.config_file)
[docs] def get_resource(self, arguments):
""" Gets the resource requested in the arguments """
user_id = arguments['--user_id']
object_id = arguments['--object_id']
start_date = arguments['--start_date']
end_date = arguments['--end_date']
detail = arguments['--detail']
misfit = Misfit(self.client_id, self.client_secret, self.access_token,
user_id)
if arguments['profile']:
result = misfit.profile(object_id)
elif arguments['device']:
result = misfit.device(object_id)
elif arguments['goal']:
result = misfit.goal(start_date, end_date, object_id)
elif arguments['summary']:
result = misfit.summary(start_date, end_date, detail)
elif arguments['session']:
result = misfit.session(start_date, end_date, object_id)
elif arguments['sleep']:
result = misfit.sleep(start_date, end_date, object_id)
pp = PrettyPrinter(indent=4)
if isinstance(result, list):
pp.pprint([res.data for res in result])
else:
pp.pprint(result.data)
[docs] def authorize(self):
"""
Authorize a user using the browser and a CherryPy server, and write
the resulting credentials to a config file.
"""
# Thanks to the magic of docopts, I can be guaranteed to have a
# a client_id and client_secret
auth = MisfitAuth(self.client_id, self.client_secret)
auth.browser_authorize()
# Write the authentication information to a config file for later use
if auth.token:
self.write_config(auth.token['access_token'])
else:
print('ERROR: We were unable to authorize to use the Misfit API.')
def main():
""" Parse the arguments and use them to create a MisfitCli object """
version = 'Python Misfit %s' % __version__
arguments = docopt(__doc__, version=version)
MisfitCli(arguments)
if __name__ == '__main__':
""" Makes this file runnable with "python -m misfit.cli" """
main()