From 1e44d831ee4a9bbba61a402d4b36a9822f20d162 Mon Sep 17 00:00:00 2001 From: Brad Pitcher Date: Tue, 24 Jan 2017 13:48:22 -0800 Subject: [PATCH 1/4] add change log for 0.3.0 --- CHANGELOG.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a7be7ab..db75618 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,8 @@ +0.3.0 (2017-01-24) +================== +* Surface errors better +* Use requests-oauthlib auto refresh to automatically refresh tokens if possible + 0.2.4 (2016-11-10) ================== * Call a hook if it exists when tokens are refreshed From 63204a2e1494b564e27c782244b1e6ab081a3429 Mon Sep 17 00:00:00 2001 From: Brad Pitcher Date: Tue, 24 Jan 2017 13:48:37 -0800 Subject: [PATCH 2/4] hide private methods, document curried methods --- docs/index.rst | 83 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index d773a73..34963c8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -40,9 +40,90 @@ either ``None`` or a ``date`` or ``datetime`` object as ``%Y-%m-%d``. .. autoclass:: fitbit.Fitbit - :private-members: :members: + .. method:: body(date=None, user_id=None, data=None) + + Get body data: https://dev.fitbit.com/docs/body/ + + .. method:: activities(date=None, user_id=None, data=None) + + Get body data: https://dev.fitbit.com/docs/activity/ + + .. method:: foods_log(date=None, user_id=None, data=None) + + Get food logs data: https://dev.fitbit.com/docs/food-logging/#get-food-logs + + .. method:: foods_log_water(date=None, user_id=None, data=None) + + Get water logs data: https://dev.fitbit.com/docs/food-logging/#get-water-logs + + .. method:: sleep(date=None, user_id=None, data=None) + + Get sleep data: https://dev.fitbit.com/docs/sleep/ + + .. method:: heart(date=None, user_id=None, data=None) + + Get heart rate data: https://dev.fitbit.com/docs/heart-rate/ + + .. method:: bp(date=None, user_id=None, data=None) + + Get blood pressure data: https://dev.fitbit.com/docs/heart-rate/ + + .. method:: delete_body(log_id) + + Delete a body log, given a log id + + .. method:: delete_activities(log_id) + + Delete an activity log, given a log id + + .. method:: delete_foods_log(log_id) + + Delete a food log, given a log id + + .. method:: delete_foods_log_water(log_id) + + Delete a water log, given a log id + + .. method:: delete_sleep(log_id) + + Delete a sleep log, given a log id + + .. method:: delete_heart(log_id) + + Delete a heart log, given a log id + + .. method:: delete_bp(log_id) + + Delete a blood pressure log, given a log id + + .. method:: recent_foods(user_id=None, qualifier='') + + Get recently logged foods: https://dev.fitbit.com/docs/food-logging/#get-recent-foods + + .. method:: frequent_foods(user_id=None, qualifier='') + + Get frequently logged foods: https://dev.fitbit.com/docs/food-logging/#get-frequent-foods + + .. method:: favorite_foods(user_id=None, qualifier='') + + Get favorited foods: https://dev.fitbit.com/docs/food-logging/#get-favorite-foods + + .. method:: recent_activities(user_id=None, qualifier='') + + Get recently logged activities: https://dev.fitbit.com/docs/activity/#get-recent-activity-types + + .. method:: frequent_activities(user_id=None, qualifier='') + + Get frequently logged activities: https://dev.fitbit.com/docs/activity/#get-frequent-activities + + .. method:: favorite_activities(user_id=None, qualifier='') + + Get favorited foods: https://dev.fitbit.com/docs/activity/#get-favorite-activities + + + Indices and tables ================== From 6a395c6895e6ab6c0c8fb900bd1ddfd9ba612591 Mon Sep 17 00:00:00 2001 From: Brad Pitcher Date: Tue, 24 Jan 2017 14:16:57 -0800 Subject: [PATCH 3/4] document the finer practical points of usage --- fitbit/api.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/fitbit/api.py b/fitbit/api.py index b7e92e5..ca928c3 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -162,6 +162,27 @@ def refresh_token(self): class Fitbit(object): + """ + Before using this class, create a Fitbit app + `here `_. There you will get the client id + and secret needed to instantiate this class. When first authorizing a user, + make sure to pass the `redirect_uri` keyword arg so fitbit will know where + to return to when the authorization is complete. See + `gather_keys_oauth2.py `_ + for a reference implementation of the authorization process. You should + save ``access_token``, ``refresh_token``, and ``expires_at`` from the + returned token for each user you authorize. + + When instantiating this class for use with an already authorized user, pass + in the ``access_token``, ``refresh_token``, and ``expires_at`` keyword + arguments. We also strongly recommend passing in a ``refresh_cb`` keyword + argument, which should be a function taking one argument: a token dict. + When that argument is present, we will automatically refresh the access + token when needed and call this function so that you can save the updated + token data. If you don't save the updated information, then you could end + up with invalid access and refresh tokens, and the only way to recover from + that is to reauthorize the user. + """ US = 'en_US' METRIC = 'en_UK' @@ -187,7 +208,9 @@ class Fitbit(object): 'frequent', ] - def __init__(self, client_id, client_secret, system=US, **kwargs): + def __init__(self, client_id, client_secret, access_token=None, + refresh_token=None, expires_at=None, refresh_cb=None, + redirect_uri=None, system=US, **kwargs): """ Fitbit(, , access_token=, refresh_token=) """ From 3f57e1791e8c18bd0e8e6d683e110d4d99e0529e Mon Sep 17 00:00:00 2001 From: Brad Pitcher Date: Tue, 24 Jan 2017 15:05:32 -0800 Subject: [PATCH 4/4] fix tests --- fitbit/api.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fitbit/api.py b/fitbit/api.py index ca928c3..14c33dc 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -215,7 +215,16 @@ def __init__(self, client_id, client_secret, access_token=None, Fitbit(, , access_token=, refresh_token=) """ self.system = system - self.client = FitbitOauth2Client(client_id, client_secret, **kwargs) + self.client = FitbitOauth2Client( + client_id, + client_secret, + access_token=access_token, + refresh_token=refresh_token, + expires_at=expires_at, + refresh_cb=refresh_cb, + redirect_uri=redirect_uri, + **kwargs + ) # All of these use the same patterns, define the method for accessing # creating and deleting records once, and use curry to make individual