fitgem_oauth2 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/fitgem_oauth2.gemspec +6 -3
- data/lib/fitgem_oauth2/activity.rb +14 -11
- data/lib/fitgem_oauth2/body_measurements.rb +16 -14
- data/lib/fitgem_oauth2/client.rb +32 -26
- data/lib/fitgem_oauth2/food.rb +9 -8
- data/lib/fitgem_oauth2/heartrate.rb +14 -13
- data/lib/fitgem_oauth2/sleep.rb +7 -6
- data/lib/fitgem_oauth2/subscriptions.rb +1 -1
- data/lib/fitgem_oauth2/utils.rb +10 -8
- data/lib/fitgem_oauth2/version.rb +1 -1
- data/lib/fitgem_oauth2.rb +1 -1
- metadata +12 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb6abab3890862d921de4c7f36128afc601bbb2579382f67164929cbd4deba3e
|
|
4
|
+
data.tar.gz: 740cb87e8fdfdae9a3437b59d63486e85bb58567cdad1d22cdb5a90e7daa2b55
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 94a1a3f44eef697b5de5a67a992322995e3184fd5142b9896b8e2827d97abf5949aaa5bd07dd88503787bc13defad8ae1215460bfd3a026bcbf3cb41504fd2b8
|
|
7
|
+
data.tar.gz: c85fab5f3b82b37fca9302fcf55f36c1e0f0b83be4f00a743919caafe879d97a1dd9d5df94c4336de221d063b2bd5923ccd08b654a6a01b30f4fa41d6ca9ab8b
|
data/fitgem_oauth2.gemspec
CHANGED
|
@@ -13,10 +13,13 @@ Gem::Specification.new do |s|
|
|
|
13
13
|
s.files = %w[fitgem_oauth2.gemspec] + `git ls-files -z`.split("\x0").select {|f| f.start_with?('lib/') }
|
|
14
14
|
s.homepage = 'http://rubygems.org/gems/fitgem_oauth2'
|
|
15
15
|
s.license = 'MIT'
|
|
16
|
+
s.metadata = {'rubygems_mfa_required' => 'true'}
|
|
16
17
|
|
|
17
|
-
s.
|
|
18
|
+
s.required_ruby_version = '>= 3.2.0'
|
|
18
19
|
|
|
19
|
-
s.
|
|
20
|
-
|
|
20
|
+
s.add_dependency 'faraday', '~> 2.0'
|
|
21
|
+
|
|
22
|
+
s.add_development_dependency 'factory_bot', '~> 6.0'
|
|
23
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
|
21
24
|
s.add_development_dependency 'rspec', '~> 3.4'
|
|
22
25
|
end
|
|
@@ -26,12 +26,13 @@ module FitgemOauth2
|
|
|
26
26
|
# retrieves activity time series, based on the arguments provided
|
|
27
27
|
# @param resource the resource for which the series needs to be retrieved. one of ALLOWED_RESOURCES
|
|
28
28
|
# @param start_date the start date for the series
|
|
29
|
-
# @param end_date the end date for the series.
|
|
30
|
-
# @param period the period starting from start_date for which the series
|
|
31
|
-
#
|
|
29
|
+
# @param end_date the end date for the series. do not specify period
|
|
30
|
+
# @param period the period starting from start_date for which the series
|
|
31
|
+
# needs to be retrieved. If specifying period, do not use end_date
|
|
32
32
|
def activity_time_series(resource: nil, start_date: nil, end_date: nil, period: nil)
|
|
33
33
|
unless resource && ACTIVITY_RESOURCES.include?(resource)
|
|
34
|
-
raise FitgemOauth2::InvalidArgumentError,
|
|
34
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
35
|
+
"Invalid resource: #{resource}. Valid resources are #{ACTIVITY_RESOURCES}."
|
|
35
36
|
end
|
|
36
37
|
|
|
37
38
|
raise FitgemOauth2::InvalidArgumentError, 'Start date must be specified.' unless start_date
|
|
@@ -47,26 +48,27 @@ module FitgemOauth2
|
|
|
47
48
|
first = format_date(start_date)
|
|
48
49
|
second = period || format_date(end_date)
|
|
49
50
|
url = ['user', user_id, 'activities', resource, 'date', first, second].join('/')
|
|
50
|
-
get_call(url
|
|
51
|
+
get_call("#{url}.json")
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
# retrieves intraday activity time series.
|
|
54
|
-
# @param resource (required) for which the intrady series is retrieved.
|
|
55
|
+
# @param resource (required) for which the intrady series is retrieved.
|
|
56
|
+
# one of 'calories', 'steps', 'distance', 'floors', 'elevation'
|
|
55
57
|
# @param start_date (required) start date for the series
|
|
56
58
|
# @param end_date (optional) end date for the series, if not specified, the series is for 1 day
|
|
57
59
|
# @param detail_level (required) level of detail for the series
|
|
58
60
|
# @param start_time (optional)start time for the series
|
|
59
61
|
# @param end_time the (optional)end time for the series. specify both start_time and end_time, if using either
|
|
62
|
+
# rubocop:disable Metrics/ParameterLists
|
|
60
63
|
def intraday_activity_time_series(resource: nil, start_date: nil, end_date: nil, detail_level: nil,
|
|
61
64
|
start_time: nil, end_time: nil)
|
|
62
|
-
|
|
63
65
|
# converting to symbol to allow developer to use either 'calories' or :calories
|
|
64
66
|
resource = resource.to_sym
|
|
65
67
|
|
|
66
68
|
unless %i[calories steps distance floors elevation].include?(resource)
|
|
67
69
|
raise FitgemOauth2::InvalidArgumentError,
|
|
68
|
-
'Must specify resource to fetch intraday time series data for.'\
|
|
69
|
-
'
|
|
70
|
+
'Must specify resource to fetch intraday time series data for. ' \
|
|
71
|
+
'One of (:calories, :steps, :distance, :floors, or :elevation) is required.'
|
|
70
72
|
end
|
|
71
73
|
|
|
72
74
|
unless start_date
|
|
@@ -78,8 +80,8 @@ module FitgemOauth2
|
|
|
78
80
|
|
|
79
81
|
unless detail_level && %w[1min 15min].include?(detail_level)
|
|
80
82
|
raise FitgemOauth2::InvalidArgumentError,
|
|
81
|
-
'Must specify the data resolution to fetch intraday time series data for.'\
|
|
82
|
-
'
|
|
83
|
+
'Must specify the data resolution to fetch intraday time series data for. ' \
|
|
84
|
+
'One of (\"1d\" or \"15min\") is required.'
|
|
83
85
|
end
|
|
84
86
|
|
|
85
87
|
resource_path = [
|
|
@@ -95,6 +97,7 @@ module FitgemOauth2
|
|
|
95
97
|
end
|
|
96
98
|
get_call("#{resource_path}.json")
|
|
97
99
|
end
|
|
100
|
+
# rubocop:enable Metrics/ParameterLists
|
|
98
101
|
|
|
99
102
|
# ======================================
|
|
100
103
|
# Activity Logging Methods
|
|
@@ -23,11 +23,12 @@ module FitgemOauth2
|
|
|
23
23
|
url = [url, format_date(end_date)].join('/') if end_date
|
|
24
24
|
|
|
25
25
|
if period
|
|
26
|
-
|
|
27
|
-
url = [url, period].join('/')
|
|
28
|
-
else
|
|
26
|
+
unless FAT_PERIODS.include?(period)
|
|
29
27
|
raise FitgemOauth2::InvalidArgumentError, "period must be one in #{FAT_PERIODS}"
|
|
30
28
|
end
|
|
29
|
+
|
|
30
|
+
url = [url, period].join('/')
|
|
31
|
+
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
url += '.json'
|
|
@@ -58,7 +59,8 @@ module FitgemOauth2
|
|
|
58
59
|
# @param period (optional)period for the time series. valid periods are BODY_TIME_SERIES_PERIODS
|
|
59
60
|
def body_time_series(resource: nil, start_date: nil, end_date: nil, period: nil)
|
|
60
61
|
unless resource && start_date
|
|
61
|
-
raise FitgemOauth2::InvalidArgumentError,
|
|
62
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
63
|
+
'resource and start_date are required parameters. Please specify both.'
|
|
62
64
|
end
|
|
63
65
|
|
|
64
66
|
url = ['user', user_id, 'body', resource, 'date', format_date(start_date)].join('/')
|
|
@@ -72,7 +74,8 @@ module FitgemOauth2
|
|
|
72
74
|
if BODY_TIME_SERIES_PERIODS.include?(period)
|
|
73
75
|
second = period
|
|
74
76
|
else
|
|
75
|
-
raise FitgemOauth2::InvalidArgumentError,
|
|
77
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
78
|
+
"Invalid Period. Body time series period must be in #{BODY_TIME_SERIES_PERIODS}"
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
|
|
@@ -80,7 +83,7 @@ module FitgemOauth2
|
|
|
80
83
|
|
|
81
84
|
url = [url, second].join('/')
|
|
82
85
|
|
|
83
|
-
get_call(url
|
|
86
|
+
get_call("#{url}.json")
|
|
84
87
|
end
|
|
85
88
|
|
|
86
89
|
# ======================================
|
|
@@ -90,11 +93,11 @@ module FitgemOauth2
|
|
|
90
93
|
# retrieves body goals based on the type specified
|
|
91
94
|
# @param type 'fat' or 'weight'
|
|
92
95
|
def body_goals(type)
|
|
93
|
-
|
|
94
|
-
get_call("user/#{user_id}/body/log/#{type}/goal.json")
|
|
95
|
-
else
|
|
96
|
+
unless type && BODY_GOALS.include?(type)
|
|
96
97
|
raise FitgemOauth2::InvalidArgumentError, "invalid goal type : #{type}. must be one of #{BODY_GOALS}"
|
|
97
98
|
end
|
|
99
|
+
|
|
100
|
+
get_call("user/#{user_id}/body/log/#{type}/goal.json")
|
|
98
101
|
end
|
|
99
102
|
|
|
100
103
|
# update body fat goal
|
|
@@ -124,10 +127,9 @@ module FitgemOauth2
|
|
|
124
127
|
raise FitgemOauth2::InvalidArgumentError, 'both end_date and period specified. please provide only one.'
|
|
125
128
|
end
|
|
126
129
|
|
|
127
|
-
if period
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
end
|
|
130
|
+
if period && !WEIGHT_PERIODS.include?(period)
|
|
131
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
132
|
+
"valid period not specified. please choose a period from #{WEIGHT_PERIODS}"
|
|
131
133
|
end
|
|
132
134
|
|
|
133
135
|
first = format_date(start_date)
|
|
@@ -137,7 +139,7 @@ module FitgemOauth2
|
|
|
137
139
|
url = [url, second].join('/')
|
|
138
140
|
end
|
|
139
141
|
|
|
140
|
-
get_call(url
|
|
142
|
+
get_call("#{url}.json")
|
|
141
143
|
end
|
|
142
144
|
|
|
143
145
|
# logs weight for the user
|
data/lib/fitgem_oauth2/client.rb
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'fitgem_oauth2/activity
|
|
4
|
-
require 'fitgem_oauth2/body_measurements
|
|
5
|
-
require 'fitgem_oauth2/devices
|
|
6
|
-
require 'fitgem_oauth2/errors
|
|
7
|
-
require 'fitgem_oauth2/food
|
|
8
|
-
require 'fitgem_oauth2/friends
|
|
9
|
-
require 'fitgem_oauth2/heartrate
|
|
10
|
-
require 'fitgem_oauth2/sleep
|
|
11
|
-
require 'fitgem_oauth2/subscriptions
|
|
12
|
-
require 'fitgem_oauth2/users
|
|
13
|
-
require 'fitgem_oauth2/utils
|
|
14
|
-
require 'fitgem_oauth2/version
|
|
3
|
+
require 'fitgem_oauth2/activity'
|
|
4
|
+
require 'fitgem_oauth2/body_measurements'
|
|
5
|
+
require 'fitgem_oauth2/devices'
|
|
6
|
+
require 'fitgem_oauth2/errors'
|
|
7
|
+
require 'fitgem_oauth2/food'
|
|
8
|
+
require 'fitgem_oauth2/friends'
|
|
9
|
+
require 'fitgem_oauth2/heartrate'
|
|
10
|
+
require 'fitgem_oauth2/sleep'
|
|
11
|
+
require 'fitgem_oauth2/subscriptions'
|
|
12
|
+
require 'fitgem_oauth2/users'
|
|
13
|
+
require 'fitgem_oauth2/utils'
|
|
14
|
+
require 'fitgem_oauth2/version'
|
|
15
15
|
|
|
16
16
|
require 'base64'
|
|
17
17
|
require 'faraday'
|
|
@@ -21,11 +21,7 @@ module FitgemOauth2
|
|
|
21
21
|
DEFAULT_USER_ID = '-'
|
|
22
22
|
API_VERSION = '1'
|
|
23
23
|
|
|
24
|
-
attr_reader :client_id
|
|
25
|
-
attr_reader :client_secret
|
|
26
|
-
attr_reader :token
|
|
27
|
-
attr_reader :user_id
|
|
28
|
-
attr_reader :unit_system
|
|
24
|
+
attr_reader :client_id, :client_secret, :token, :user_id, :unit_system
|
|
29
25
|
|
|
30
26
|
def initialize(opts)
|
|
31
27
|
missing = %i[client_id client_secret token] - opts.keys
|
|
@@ -34,7 +30,7 @@ module FitgemOauth2
|
|
|
34
30
|
@client_id = opts[:client_id]
|
|
35
31
|
@client_secret = opts[:client_secret]
|
|
36
32
|
@token = opts[:token]
|
|
37
|
-
@user_id =
|
|
33
|
+
@user_id = opts[:user_id] || DEFAULT_USER_ID
|
|
38
34
|
@unit_system = opts[:unit_system]
|
|
39
35
|
@connection = Faraday.new('https://api.fitbit.com')
|
|
40
36
|
end
|
|
@@ -50,6 +46,16 @@ module FitgemOauth2
|
|
|
50
46
|
JSON.parse(response.body)
|
|
51
47
|
end
|
|
52
48
|
|
|
49
|
+
def revoke_token(token)
|
|
50
|
+
response = connection.post('/oauth2/revoke') do |request|
|
|
51
|
+
encoded = Base64.strict_encode64("#{@client_id}:#{@client_secret}")
|
|
52
|
+
request.headers['Authorization'] = "Basic #{encoded}"
|
|
53
|
+
request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
54
|
+
request.params['token'] = token
|
|
55
|
+
end
|
|
56
|
+
JSON.parse(response.body)
|
|
57
|
+
end
|
|
58
|
+
|
|
53
59
|
def get_call(url)
|
|
54
60
|
url = "#{API_VERSION}/#{url}"
|
|
55
61
|
response = connection.get(url) {|request| set_headers(request) }
|
|
@@ -59,7 +65,7 @@ module FitgemOauth2
|
|
|
59
65
|
# This method is a helper method (like get_call) for 1.2 version of the API_VERSION
|
|
60
66
|
# This method is needed because Fitbit API supports both versions as of current
|
|
61
67
|
# date (Nov 5, 2017)
|
|
62
|
-
def
|
|
68
|
+
def get_call12(url)
|
|
63
69
|
url = "1.2/#{url}"
|
|
64
70
|
response = connection.get(url) {|request| set_headers(request) }
|
|
65
71
|
parse_response(response)
|
|
@@ -71,7 +77,7 @@ module FitgemOauth2
|
|
|
71
77
|
parse_response(response)
|
|
72
78
|
end
|
|
73
79
|
|
|
74
|
-
def
|
|
80
|
+
def post_call12(url, params={})
|
|
75
81
|
url = "1.2/#{url}"
|
|
76
82
|
response = connection.post(url, params) {|request| set_headers(request) }
|
|
77
83
|
parse_response(response)
|
|
@@ -87,11 +93,13 @@ module FitgemOauth2
|
|
|
87
93
|
|
|
88
94
|
attr_reader :connection
|
|
89
95
|
|
|
96
|
+
# rubocop:disable Naming/AccessorMethodName
|
|
90
97
|
def set_headers(request)
|
|
91
98
|
request.headers['Authorization'] = "Bearer #{token}"
|
|
92
99
|
request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
93
100
|
request.headers['Accept-Language'] = unit_system unless unit_system.nil?
|
|
94
101
|
end
|
|
102
|
+
# rubocop:enable Naming/AccessorMethodName
|
|
95
103
|
|
|
96
104
|
def parse_response(response)
|
|
97
105
|
headers_to_keep = %w[fitbit-rate-limit-limit fitbit-rate-limit-remaining fitbit-rate-limit-reset]
|
|
@@ -115,12 +123,10 @@ module FitgemOauth2
|
|
|
115
123
|
500..599 => -> { raise FitgemOauth2::ServerError }
|
|
116
124
|
}
|
|
117
125
|
|
|
118
|
-
fn = error_handler.find {|k, _| k
|
|
119
|
-
if fn.nil?
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
fn.last.call
|
|
123
|
-
end
|
|
126
|
+
fn = error_handler.find {|k, _| k == response.status }
|
|
127
|
+
raise StandardError, "Unexpected response status #{response.status}" if fn.nil?
|
|
128
|
+
|
|
129
|
+
fn.last.call
|
|
124
130
|
end
|
|
125
131
|
end
|
|
126
132
|
end
|
data/lib/fitgem_oauth2/food.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'fitgem_oauth2/food/collection
|
|
4
|
-
require 'fitgem_oauth2/food/series
|
|
5
|
-
require 'fitgem_oauth2/food/metadata
|
|
3
|
+
require 'fitgem_oauth2/food/collection'
|
|
4
|
+
require 'fitgem_oauth2/food/series'
|
|
5
|
+
require 'fitgem_oauth2/food/metadata'
|
|
6
6
|
|
|
7
7
|
module FitgemOauth2
|
|
8
8
|
class Client
|
|
@@ -12,17 +12,18 @@ module FitgemOauth2
|
|
|
12
12
|
private
|
|
13
13
|
|
|
14
14
|
def validate_food_series_period(period)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
return if FOOD_SERIES_PERIODS.include?(period)
|
|
16
|
+
|
|
17
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
18
|
+
"Invalid period: #{period}. Specify a valid period from #{FOOD_SERIES_PERIODS}"
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def food_series_url(user_id, start_date, end_date_or_period)
|
|
21
|
-
['user', user_id, 'foods/log/caloriesIn', 'date', start_date, end_date_or_period].join('/')
|
|
22
|
+
"#{['user', user_id, 'foods/log/caloriesIn', 'date', start_date, end_date_or_period].join('/')}.json"
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
def water_series_url(user_id, start_date, end_date_or_period)
|
|
25
|
-
['user', user_id, 'foods/log/water', 'date', start_date, end_date_or_period].join('/')
|
|
26
|
+
"#{['user', user_id, 'foods/log/water', 'date', start_date, end_date_or_period].join('/')}.json"
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
end
|
|
@@ -10,7 +10,7 @@ module FitgemOauth2
|
|
|
10
10
|
validate_end_date(end_date)
|
|
11
11
|
|
|
12
12
|
url = ['user', user_id, 'activities/heart/date', format_date(start_date), format_date(end_date)].join('/')
|
|
13
|
-
get_call(url
|
|
13
|
+
get_call("#{url}.json")
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def hr_series_for_period(start_date, period)
|
|
@@ -18,14 +18,14 @@ module FitgemOauth2
|
|
|
18
18
|
validate_hr_period(period)
|
|
19
19
|
|
|
20
20
|
url = ['user', user_id, 'activities/heart/date', format_date(start_date), period].join('/')
|
|
21
|
-
get_call(url
|
|
21
|
+
get_call("#{url}.json")
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
# retrieve intraday series for heartrate
|
|
25
|
-
def intraday_heartrate_time_series(start_date: nil, end_date: nil, detail_level: nil, start_time: nil,
|
|
25
|
+
def intraday_heartrate_time_series(start_date: nil, end_date: nil, detail_level: nil, start_time: nil,
|
|
26
|
+
end_time: nil)
|
|
26
27
|
intraday_series_guard(
|
|
27
28
|
start_date: start_date,
|
|
28
|
-
end_date: end_date,
|
|
29
29
|
detail_level: detail_level,
|
|
30
30
|
start_time: start_time,
|
|
31
31
|
end_time: end_time
|
|
@@ -37,27 +37,28 @@ module FitgemOauth2
|
|
|
37
37
|
|
|
38
38
|
url = [url, 'time', format_time(start_time), format_time(end_time)].join('/') if start_time && end_time
|
|
39
39
|
|
|
40
|
-
get_call(url
|
|
40
|
+
get_call("#{url}.json")
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
private
|
|
44
44
|
|
|
45
45
|
def validate_hr_period(period)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
return if period && HR_PERIODS.include?(period)
|
|
47
|
+
|
|
48
|
+
raise FitgemOauth2::InvalidArgumentError, "Invalid period: #{period}. Valid periods are #{HR_PERIODS}."
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
def intraday_series_guard(start_date:,
|
|
51
|
+
def intraday_series_guard(start_date:, detail_level:, start_time:, end_time:)
|
|
52
52
|
raise FitgemOauth2::InvalidArgumentError, 'Start date not provided.' unless start_date
|
|
53
53
|
|
|
54
54
|
unless detail_level && HR_DETAIL_LEVELS.include?(detail_level)
|
|
55
|
-
raise FitgemOauth2::InvalidArgumentError,
|
|
55
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
56
|
+
"Please specify the defail level. Detail level should be one of #{HR_DETAIL_LEVELS}."
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
return unless (start_time && !end_time) || (end_time && !start_time)
|
|
60
|
+
|
|
61
|
+
raise FitgemOauth2::InvalidArgumentError, 'Either specify both the start_time and end_time or specify neither.'
|
|
61
62
|
end
|
|
62
63
|
end
|
|
63
64
|
end
|
data/lib/fitgem_oauth2/sleep.rb
CHANGED
|
@@ -12,11 +12,11 @@ module FitgemOauth2
|
|
|
12
12
|
# retrieve sleep logs for a date
|
|
13
13
|
# @param date date for which sleep logs needs to be accessed
|
|
14
14
|
def sleep_logs(date)
|
|
15
|
-
|
|
15
|
+
get_call12("user/#{user_id}/sleep/date/#{format_date(date)}.json")
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def sleep_logs_by_date_range(start_date, end_date)
|
|
19
|
-
|
|
19
|
+
get_call12("user/#{user_id}/sleep/date/#{format_date(start_date)}/#{format_date(end_date)}.json")
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def sleep_logs_list(date, sort, limit)
|
|
@@ -28,7 +28,7 @@ module FitgemOauth2
|
|
|
28
28
|
else
|
|
29
29
|
raise FitgemOauth2::InvalidArgumentError, 'sort can either be asc or desc'
|
|
30
30
|
end
|
|
31
|
-
|
|
31
|
+
get_call12("user/#{user_id}/sleep/list.json?#{date_param}&offset=0&sort=#{sort}&limit=#{limit}")
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
# retrieve sleep goal for the user
|
|
@@ -51,7 +51,8 @@ module FitgemOauth2
|
|
|
51
51
|
raise FitgemOauth2::InvalidArgumentError, 'Start date not provided.' unless start_date
|
|
52
52
|
|
|
53
53
|
unless resource && SLEEP_RESOURCES.include?(resource)
|
|
54
|
-
raise FitgemOauth2::InvalidArgumentError,
|
|
54
|
+
raise FitgemOauth2::InvalidArgumentError,
|
|
55
|
+
"Invalid resource: #{resource}. Valid resources are #{SLEEP_RESOURCES}."
|
|
55
56
|
end
|
|
56
57
|
|
|
57
58
|
if period && end_date
|
|
@@ -66,13 +67,13 @@ module FitgemOauth2
|
|
|
66
67
|
|
|
67
68
|
url = ['user', user_id, 'sleep', resource, 'date', format_date(start_date), second].join('/')
|
|
68
69
|
|
|
69
|
-
get_call(url
|
|
70
|
+
get_call("#{url}.json")
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
# log sleep
|
|
73
74
|
# @param params POST params for creating sleep log
|
|
74
75
|
def log_sleep(params)
|
|
75
|
-
|
|
76
|
+
post_call12("user/#{user_id}/sleep.json", params)
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
# deleted sleep log
|
data/lib/fitgem_oauth2/utils.rb
CHANGED
|
@@ -5,26 +5,28 @@ module FitgemOauth2
|
|
|
5
5
|
def format_date(date)
|
|
6
6
|
return nil if date.nil?
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
valid_date_string = (date =~ /\d{4}\-\d{2}\-\d{2}/) == 0
|
|
10
|
-
if valid_date_string
|
|
8
|
+
if date.is_a?(String) && date.match?(/\A\d{4}-\d{2}-\d{2}\z/)
|
|
11
9
|
date
|
|
12
|
-
elsif
|
|
10
|
+
elsif date.is_a?(String) && %w[today yesterday].include?(date)
|
|
13
11
|
date_from_semantic(date)
|
|
14
12
|
elsif date.is_a?(Date) || date.is_a?(Time) || date.is_a?(DateTime)
|
|
15
13
|
date.strftime('%Y-%m-%d')
|
|
16
14
|
else
|
|
17
|
-
raise FitgemOauth2::InvalidDateArgument,
|
|
15
|
+
raise FitgemOauth2::InvalidDateArgument,
|
|
16
|
+
'Date used must be a date/time object or a string in the format YYYY-MM-DD; ' \
|
|
17
|
+
"supplied argument is a #{date.class}"
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def format_time(time)
|
|
22
|
-
if (
|
|
22
|
+
if time.is_a?(String) && time.match?(/\A\d{2}:\d{2}\z/)
|
|
23
23
|
time
|
|
24
24
|
elsif time.is_a?(DateTime) || time.is_a?(Time)
|
|
25
25
|
time.strftime('%H:%M')
|
|
26
26
|
else
|
|
27
|
-
raise FitgemOauth2::InvalidTimeArgument,
|
|
27
|
+
raise FitgemOauth2::InvalidTimeArgument,
|
|
28
|
+
'Time used must be a DateTime/Time object or a string in the format hh:mm; ' \
|
|
29
|
+
"supplied argument is a #{time.class}"
|
|
28
30
|
end
|
|
29
31
|
end
|
|
30
32
|
|
|
@@ -39,7 +41,7 @@ module FitgemOauth2
|
|
|
39
41
|
private
|
|
40
42
|
|
|
41
43
|
def date_from_semantic(semantic)
|
|
42
|
-
if semantic
|
|
44
|
+
if semantic == 'yesterday'
|
|
43
45
|
(Date.today - 1).strftime('%Y-%m-%d')
|
|
44
46
|
elsif semantic == 'today'
|
|
45
47
|
Date.today.strftime('%Y-%m-%d')
|
data/lib/fitgem_oauth2.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fitgem_oauth2
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 4.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ankit Gupta
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-02-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
@@ -16,42 +16,42 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: '2.0'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: '2.0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: factory_bot
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '6.0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '6.0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rake
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 13.0
|
|
47
|
+
version: '13.0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 13.0
|
|
54
|
+
version: '13.0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: rspec
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -93,7 +93,8 @@ files:
|
|
|
93
93
|
homepage: http://rubygems.org/gems/fitgem_oauth2
|
|
94
94
|
licenses:
|
|
95
95
|
- MIT
|
|
96
|
-
metadata:
|
|
96
|
+
metadata:
|
|
97
|
+
rubygems_mfa_required: 'true'
|
|
97
98
|
post_install_message:
|
|
98
99
|
rdoc_options: []
|
|
99
100
|
require_paths:
|
|
@@ -102,14 +103,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
102
103
|
requirements:
|
|
103
104
|
- - ">="
|
|
104
105
|
- !ruby/object:Gem::Version
|
|
105
|
-
version:
|
|
106
|
+
version: 3.2.0
|
|
106
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
108
|
requirements:
|
|
108
109
|
- - ">="
|
|
109
110
|
- !ruby/object:Gem::Version
|
|
110
111
|
version: '0'
|
|
111
112
|
requirements: []
|
|
112
|
-
rubygems_version: 3.
|
|
113
|
+
rubygems_version: 3.4.10
|
|
113
114
|
signing_key:
|
|
114
115
|
specification_version: 4
|
|
115
116
|
summary: Fitbit API client library
|