fitbit_api 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c18d864ec416bee1e27c1b468d524bb8404e63076ba7652917270271d1eea58
4
- data.tar.gz: 6487033355317ece6cbac6eb43a2b744e975d48b524d88dd4c4378221b96e7e8
3
+ metadata.gz: c6ad0b176146542cb288467849f95e477cd0345b3eb500a83ca13a47423d8ac2
4
+ data.tar.gz: dd8e47b54fc7210cc30ad347664c8e67ed555e1a64597e5cd012d896e31769d3
5
5
  SHA512:
6
- metadata.gz: 3146e0990d97885808beb6db94a877003af2ed3847ee135ceea082199d8623fdb54301fd66218e5e7b52629d513d70e53231a0a3deb23e229e98af0ce762b1fb
7
- data.tar.gz: 0b94b009192e261dde7ba9e98119dbc942290b12792113d858af621b34158a96f7f206d9cb35b0ba2334dc7f4cfd0b836e30c59102ce4e12d38e14c71bfc18a0
6
+ metadata.gz: 6c313975d4d22141af31553b129dfcbcf901847bc92191e2e5d559c633f245e5522ae72de893bf67fe0b6ebf3179ae0b3edabdf416da937a31d4025112f89e9c
7
+ data.tar.gz: 5d4c95b142fbe3ba5f7561c1c08e821a64c0dbd7fdafe3d5070b876363a0b2af1f5df1c1359bb54262ac5850ffc8104ca0c63e040e87dee9c45edbeade64d123
@@ -1,3 +1,9 @@
1
+ 0.9.0
2
+ -----
3
+ - Rework client to accept existing access tokens.
4
+ - Fix argument parsing in `FitbitAPI::Client` to respect fallback values passed to `#configure`.
5
+ - Add `byebug` as development dependency.
6
+
1
7
  0.8.3
2
8
  -----
3
9
  - Fix bug regarding optional `params` parsing for GET requests.
data/README.md CHANGED
@@ -27,12 +27,15 @@ You can reference the [fitbit_api_rails](https://github.com/zokioki/fitbit_api_r
27
27
 
28
28
  ### Quickstart
29
29
 
30
- If you already have access to a user's stored refresh token, you can instantiate a client instance like so:
30
+ If you already have a user's token data and Fitbit user_id:
31
31
 
32
32
  ```ruby
33
33
  client = FitbitAPI::Client.new(client_id: 'XXXXXX',
34
34
  client_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
35
- refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
35
+ access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
36
+ refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
37
+ expires_at: 1234567890,
38
+ user_id: 'XXXXXX')
36
39
  ```
37
40
 
38
41
  ### OAuth 2.0 Authorization Flow
@@ -62,14 +65,14 @@ You're now authorized and can make calls to Fitbit's API.
62
65
 
63
66
  ### Interacting with the API
64
67
 
65
- Once a valid token has been generated, you're able to make API calls from the client object, like so:
68
+ Once a valid token has been generated, you're able to make API calls via the client object:
66
69
 
67
70
  ```ruby
68
71
  client.food_logs Date.today
69
72
  # => { "foods" => [{ "isFavorite" => true, "logDate" => "2015-06-26", "logId" => 1820, "loggedFood" => { "accessLevel" => "PUBLIC", "amount" => 132.57, "brand" => "", "calories" => 752, ...}] }
70
73
  ```
71
74
 
72
- To make responses more easily suited for attribute-assignment, they can be parsed to return a hash whose keys are in snake_case format. This can be done by setting the client's `snake_case_keys` option to `true`, like so:
75
+ To make responses more easily suited for attribute-assignment, they can be parsed to return a hash whose keys are in snake_case format. This can be done by setting the client's `snake_case_keys` option to `true`:
73
76
 
74
77
  ```ruby
75
78
  client.snake_case_keys = true
@@ -104,6 +107,19 @@ When initializing a `FitbitAPI::Client` instance, you're given access to a handf
104
107
 
105
108
  - `:symbolize_keys` - Transform returned object's keys to symbols (default: false)
106
109
 
110
+ If using this library in Rails, you can configure your options using an initializer:
111
+
112
+ ```ruby
113
+ # config/initializers/fitbit_api.rb
114
+
115
+ FitbitAPI.configure do |config|
116
+ config.client_id = 'XXXX'
117
+ config.client_secret = 'xxxx'
118
+ config.snake_case_keys = true
119
+ config.symbolize_keys = true
120
+ end
121
+ ```
122
+
107
123
  ## License
108
124
 
109
125
  This gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_runtime_dependency 'oauth2', '~> 1.0'
23
23
 
24
+ spec.add_development_dependency 'byebug'
24
25
  spec.add_development_dependency 'bundler', '~> 1.10'
25
26
  spec.add_development_dependency 'rake', '~> 10.0'
26
27
  spec.add_development_dependency 'rspec'
@@ -13,22 +13,15 @@ require 'fitbit_api/water'
13
13
 
14
14
  module FitbitAPI
15
15
  class Client
16
- attr_accessor :api_version, :unit_system, :locale, :scope, :snake_case_keys, :symbolize_keys
16
+ attr_accessor :api_version, :unit_system, :locale, :scope,
17
+ :snake_case_keys, :symbolize_keys
17
18
  attr_reader :user_id
18
19
 
19
- def initialize(opts)
20
- missing_args = [:client_id, :client_secret] - opts.keys
21
- raise FitbitAPI::InvalidArgumentError, "Required arguments: #{missing_args.join(', ')}" if missing_args.size > 0
22
-
23
- %w(client_id client_secret redirect_uri site_url authorize_url token_url
24
- unit_system locale scope api_version snake_case_keys symbolize_keys).each do |attr|
25
- instance_variable_set("@#{attr}", (opts[attr.to_sym] || FitbitAPI.send(attr)))
26
- end
27
-
28
- @client = OAuth2::Client.new(@client_id, @client_secret, site: @site_url,
29
- authorize_url: @authorize_url, token_url: @token_url)
30
-
31
- restore_token(opts[:refresh_token]) if opts[:refresh_token]
20
+ def initialize(opts={})
21
+ validate_args(opts)
22
+ assign_attrs(opts)
23
+ set_client
24
+ establish_token(opts)
32
25
  end
33
26
 
34
27
  def auth_url
@@ -36,23 +29,23 @@ module FitbitAPI
36
29
  end
37
30
 
38
31
  def get_token(auth_code)
39
- @token = @client.auth_code.get_token(auth_code, redirect_uri: @redirect_uri, headers: auth_header)
40
- @user_id = @token.params['user_id']
41
- return @token
42
- end
43
-
44
- def restore_token(refresh_token)
45
- @token = OAuth2::AccessToken.from_hash(@client, refresh_token: refresh_token).refresh!(headers: auth_header)
32
+ @token = @client.auth_code.get_token(
33
+ auth_code,
34
+ redirect_uri: @redirect_uri,
35
+ headers: auth_header
36
+ )
46
37
  @user_id = @token.params['user_id']
47
- return @token
38
+ @token
48
39
  end
49
40
 
50
41
  def token
51
- @token.expired? ? refresh_token : @token
42
+ @token.expired? ? refresh_token! : @token
52
43
  end
53
44
 
54
- def refresh_token
45
+ def refresh_token!
55
46
  @token = @token.refresh!(headers: auth_header)
47
+ @user_id ||= @token.params['user_id']
48
+ @token
56
49
  end
57
50
 
58
51
  def auth_header
@@ -91,5 +84,60 @@ module FitbitAPI
91
84
  deep_symbolize_keys!(object) if (opts[:symbolize_keys] || symbolize_keys)
92
85
  return object
93
86
  end
87
+
88
+ private
89
+
90
+ def validate_args(opts)
91
+ required_args = %i[client_id client_secret].freeze
92
+ missing_args = []
93
+
94
+ required_args.each do |arg|
95
+ missing_args << arg if (opts[arg] || FitbitAPI.send(arg)).nil?
96
+ end
97
+
98
+ return if missing_args.empty?
99
+ raise FitbitAPI::InvalidArgumentError,
100
+ "Required arguments: #{missing_args.join(', ')}"
101
+ end
102
+
103
+ def assign_attrs(opts)
104
+ attrs = %i[client_id client_secret redirect_uri site_url
105
+ authorize_url token_url unit_system locale scope
106
+ api_version snake_case_keys symbolize_keys].freeze
107
+
108
+ attrs.each do |attr|
109
+ instance_variable_set("@#{attr}", (opts[attr] || FitbitAPI.send(attr)))
110
+ end
111
+
112
+ @user_id = opts[:user_id]
113
+ end
114
+
115
+ def set_client
116
+ @client = OAuth2::Client.new(
117
+ @client_id,
118
+ @client_secret,
119
+ site: @site_url,
120
+ authorize_url: @authorize_url,
121
+ token_url: @token_url
122
+ )
123
+ end
124
+
125
+ def establish_token(opts)
126
+ return unless opts[:access_token] || opts[:refresh_token]
127
+
128
+ if opts[:access_token] && !opts[:user_id]
129
+ raise FitbitAPI::InvalidArgumentError,
130
+ 'user_id is required if using existing access token'
131
+ end
132
+
133
+ @token = OAuth2::AccessToken.new(
134
+ @client,
135
+ opts[:access_token],
136
+ refresh_token: opts[:refresh_token],
137
+ expires_at: opts[:expires_at]
138
+ )
139
+
140
+ refresh_token! if @token.token.empty?
141
+ end
94
142
  end
95
143
  end
@@ -1,7 +1,7 @@
1
1
  module FitbitAPI
2
2
  class Client
3
3
 
4
- PERIODS = %w(1d 7d 30d 1w 1m 3m 6m 1y max)
4
+ PERIODS = %w(1d 7d 30d 1w 1m 3m 6m 1y max).freeze
5
5
 
6
6
  def format_date(date)
7
7
  if [Date, Time, DateTime].include?(date.class)
@@ -1,4 +1,4 @@
1
1
  module FitbitAPI
2
- VERSION = '0.8.3'
2
+ VERSION = '0.9.0'
3
3
  REPO_URL = 'https://github.com/zokioki/fitbit_api'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fitbit_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zoran
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-17 00:00:00.000000000 Z
11
+ date: 2018-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oauth2
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement