fitgem_oauth2 1.1.2 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/fitgem_oauth2.gemspec +2 -2
- data/lib/fitgem_oauth2.rb +1 -0
- data/lib/fitgem_oauth2/activity.rb +10 -3
- data/lib/fitgem_oauth2/body_measurements.rb +0 -0
- data/lib/fitgem_oauth2/client.rb +5 -4
- data/lib/fitgem_oauth2/devices.rb +0 -0
- data/lib/fitgem_oauth2/errors.rb +3 -0
- data/lib/fitgem_oauth2/food.rb +14 -144
- data/lib/fitgem_oauth2/food/collection.rb +51 -0
- data/lib/fitgem_oauth2/food/metadata.rb +63 -0
- data/lib/fitgem_oauth2/food/series.rb +55 -0
- data/lib/fitgem_oauth2/friends.rb +0 -0
- data/lib/fitgem_oauth2/heartrate.rb +55 -27
- data/lib/fitgem_oauth2/sleep.rb +8 -4
- data/lib/fitgem_oauth2/subscriptions.rb +5 -5
- data/lib/fitgem_oauth2/users.rb +1 -1
- data/lib/fitgem_oauth2/utils.rb +16 -10
- data/lib/fitgem_oauth2/version.rb +1 -1
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d549d93c4f0c6e8c6c217f6d18ad69b11f5b90ed3ee42e39fe19ed25ca12a27a
|
4
|
+
data.tar.gz: 0d5d8ecf9c0bb6563cd1ecba8d65f1458076113f2ba79d2e3d98b54fc5b0ed3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13211f94cbf789323aa48718019c6831022dd099e8926c20f3cd5c1fcb1382b61e111d3403253399bbce0d8a75b2f69ce8860c2002f810f9e95095fac44186b8
|
7
|
+
data.tar.gz: 26ef31364d04f7fc7c8c218ffd669952712271204d415492d5d72650ada09a5cf3ba2542eb011c71f6cbec06a66a7d1603813f374da1612e9b655796f90ef1b5
|
data/fitgem_oauth2.gemspec
CHANGED
@@ -14,9 +14,9 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.homepage = 'http://rubygems.org/gems/fitgem_oauth2'
|
15
15
|
s.license = 'MIT'
|
16
16
|
|
17
|
-
s.add_runtime_dependency 'faraday', '~> 0.
|
17
|
+
s.add_runtime_dependency 'faraday', '~> 1.0.1'
|
18
18
|
|
19
|
-
s.add_development_dependency 'rake', '~>
|
19
|
+
s.add_development_dependency 'rake', '~> 13.0.1'
|
20
20
|
s.add_development_dependency 'rspec', '~> 3.4'
|
21
21
|
s.add_development_dependency 'factory_girl', '~> 4.5'
|
22
22
|
end
|
data/lib/fitgem_oauth2.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
module FitgemOauth2
|
2
2
|
class Client
|
3
3
|
|
4
|
-
ACTIVITY_RESOURCES = %w
|
5
|
-
|
6
|
-
|
4
|
+
ACTIVITY_RESOURCES = %w[
|
5
|
+
calories caloriesBMR steps distance floors elevation minutesSedentary
|
6
|
+
minutesLightlyActive minutesFairlyActive minutesVeryActive
|
7
|
+
activityCaloriestracker/calories tracker/steps tracker/distance
|
8
|
+
tracker/floors tracker/elevation tracker/minutesSedentary
|
9
|
+
tracker/minutesLightlyActive tracker/minutesFairlyActive
|
10
|
+
tracker/minutesVeryActive tracker/activityCalories
|
11
|
+
].freeze
|
12
|
+
|
13
|
+
ACTIVITY_PERIODS = %w[1d 7d 30d 1w 1m 3m 6m 1y max].freeze
|
7
14
|
|
8
15
|
# retrieves daily activity summary for a date
|
9
16
|
# @param date the date for which the summary is retrieved
|
File without changes
|
data/lib/fitgem_oauth2/client.rb
CHANGED
@@ -107,10 +107,11 @@ module FitgemOauth2
|
|
107
107
|
},
|
108
108
|
201 => lambda { },
|
109
109
|
204 => lambda { },
|
110
|
-
400 => lambda { raise FitgemOauth2::BadRequestError
|
111
|
-
401 => lambda { raise FitgemOauth2::UnauthorizedError
|
112
|
-
403 => lambda { raise FitgemOauth2::ForbiddenError
|
113
|
-
404 => lambda { raise FitgemOauth2::NotFoundError
|
110
|
+
400 => lambda { raise FitgemOauth2::BadRequestError },
|
111
|
+
401 => lambda { raise FitgemOauth2::UnauthorizedError },
|
112
|
+
403 => lambda { raise FitgemOauth2::ForbiddenError },
|
113
|
+
404 => lambda { raise FitgemOauth2::NotFoundError },
|
114
|
+
429 => lambda { raise FitgemOauth2::ApiLimitError },
|
114
115
|
500..599 => lambda { raise FitgemOauth2::ServerError }
|
115
116
|
}
|
116
117
|
|
File without changes
|
data/lib/fitgem_oauth2/errors.rb
CHANGED
data/lib/fitgem_oauth2/food.rb
CHANGED
@@ -1,157 +1,27 @@
|
|
1
|
+
require 'fitgem_oauth2/food/collection.rb'
|
2
|
+
require 'fitgem_oauth2/food/series.rb'
|
3
|
+
require 'fitgem_oauth2/food/metadata.rb'
|
4
|
+
|
1
5
|
module FitgemOauth2
|
2
6
|
class Client
|
3
7
|
|
4
|
-
FOOD_SERIES_RESOURCES = %w
|
5
|
-
FOOD_SERIES_PERIODS = %w
|
6
|
-
|
7
|
-
|
8
|
-
# ==================================
|
9
|
-
# Food or Water Series
|
10
|
-
# ==================================
|
8
|
+
FOOD_SERIES_RESOURCES = %w[caloriesIn water].freeze
|
9
|
+
FOOD_SERIES_PERIODS = %w[1d 7d 30d 1w 1m 3m 6m 1y max].freeze
|
11
10
|
|
11
|
+
private
|
12
12
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
raise FitgemOauth2::InvalidArgumentError, "Invalid resource: #{resource}. Specify a valid resource from #{FOOD_SERIES_RESOURCES}"
|
13
|
+
def validate_food_series_period(period)
|
14
|
+
unless FOOD_SERIES_PERIODS.include?(period)
|
15
|
+
raise FitgemOauth2::InvalidArgumentError, "Invalid period: #{period}. Specify a valid period from #{FOOD_SERIES_PERIODS}"
|
17
16
|
end
|
18
|
-
|
19
|
-
if end_date && period
|
20
|
-
raise FitgemOauth2::InvalidArgumentError, 'Provide only one of end_date and period.'
|
21
|
-
end
|
22
|
-
|
23
|
-
if !end_date && !period
|
24
|
-
raise FitgemOauth2::InvalidArgumentError, 'Provide at least one of end_date and period.'
|
25
|
-
end
|
26
|
-
|
27
|
-
url = ['user', user_id, 'foods/log', resource, 'date', start_date].join('/')
|
28
|
-
|
29
|
-
if period
|
30
|
-
unless FOOD_SERIES_PERIODS.include?(period)
|
31
|
-
raise FitgemOauth2::InvalidArgumentError, "Invalid period: #{period}. Specify a valid period from #{FOOD_SERIES_PERIODS}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
second = period || format_date(end_date)
|
36
|
-
url = [url, second].join('/')
|
37
|
-
|
38
|
-
get_call(url + '.json')
|
39
|
-
end
|
40
|
-
|
41
|
-
# ==================================
|
42
|
-
# Collection data
|
43
|
-
# ==================================
|
44
|
-
|
45
|
-
def food_goals
|
46
|
-
get_call("user/#{user_id}/foods/log/goal.json")
|
47
|
-
end
|
48
|
-
|
49
|
-
def food_logs(date)
|
50
|
-
get_call("user/#{user_id}/foods/log/date/#{format_date(date)}.json")
|
51
|
-
end
|
52
|
-
|
53
|
-
def water_logs(date)
|
54
|
-
get_call("user/#{user_id}/foods/log/water/date/#{format_date(date)}.json")
|
55
|
-
end
|
56
|
-
|
57
|
-
def water_goal
|
58
|
-
get_call("user/#{user_id}/foods/log/water/goal.json")
|
59
|
-
end
|
60
|
-
|
61
|
-
def log_food(params)
|
62
|
-
post_call("user/#{user_id}/foods/log.json", params)
|
63
|
-
end
|
64
|
-
|
65
|
-
def update_food_log(food_log_id, params)
|
66
|
-
post_call("user/#{user_id}/foods/log/#{food_log_id}.json", params)
|
67
|
-
end
|
68
|
-
|
69
|
-
def log_water(params)
|
70
|
-
post_call("user/#{user_id}/foods/log/water.json", params)
|
71
|
-
end
|
72
|
-
|
73
|
-
def update_food_goal(params)
|
74
|
-
post_call("user/#{user_id}/foods/log/goal.json", params)
|
75
|
-
end
|
76
|
-
|
77
|
-
def update_water_goal(params)
|
78
|
-
post_call("user/#{user_id}/foods/log/water/goal.json", params)
|
79
|
-
end
|
80
|
-
|
81
|
-
def delete_food_log(food_log_id)
|
82
|
-
delete_call("user/#{user_id}/foods/log/#{food_log_id}.json")
|
83
|
-
end
|
84
|
-
|
85
|
-
def update_water_log(water_log_id, params)
|
86
|
-
post_call("user/#{user_id}/foods/log/water/#{water_log_id}.json", params)
|
87
|
-
end
|
88
|
-
|
89
|
-
def delete_water_log(water_log_id)
|
90
|
-
delete_call("user/#{user_id}/foods/log/water/#{water_log_id}.json")
|
91
|
-
end
|
92
|
-
|
93
|
-
# ==================================
|
94
|
-
# Collection Metadata
|
95
|
-
# ==================================
|
96
|
-
|
97
|
-
def add_favorite_food(food_id)
|
98
|
-
post_call("user/#{user_id}/foods/log/favorite/#{food_id}.json")
|
99
|
-
end
|
100
|
-
|
101
|
-
def delete_favorite_food(food_id)
|
102
|
-
delete_call("user/#{user_id}/foods/log/favorite/#{food_id}.json")
|
103
|
-
end
|
104
|
-
|
105
|
-
def recent_foods
|
106
|
-
get_call("user/#{user_id}/foods/recent.json")
|
107
|
-
end
|
108
|
-
|
109
|
-
def favorite_foods
|
110
|
-
get_call("user/#{user_id}/foods/log/favorite.json")
|
111
|
-
end
|
112
|
-
|
113
|
-
def frequent_foods
|
114
|
-
get_call("user/#{user_id}/foods/log/frequent.json")
|
115
|
-
end
|
116
|
-
|
117
|
-
def meals
|
118
|
-
get_call("user/#{user_id}/meals.json")
|
119
|
-
end
|
120
|
-
|
121
|
-
def create_meal(params)
|
122
|
-
post_call("user/#{user_id}/meals.json", params)
|
123
|
-
end
|
124
|
-
|
125
|
-
def meal(meal_id)
|
126
|
-
get_call("user/#{user_id}/meals/#{meal_id}.json")
|
127
|
-
end
|
128
|
-
|
129
|
-
def update_meal(meal_id, params)
|
130
|
-
post_call("user/#{user_id}/meals/#{meal_id}.json", params)
|
131
|
-
end
|
132
|
-
|
133
|
-
def delete_meal(meal_id)
|
134
|
-
delete_call("user/#{user_id}/meals/#{meal_id}.json")
|
135
|
-
end
|
136
|
-
|
137
|
-
def create_food(params)
|
138
|
-
post_call("user/#{user_id}/foods.json", params)
|
139
|
-
end
|
140
|
-
|
141
|
-
def delete_food(food_id)
|
142
|
-
delete_call("user/#{user_id}/foods/#{food_id}.json")
|
143
|
-
end
|
144
|
-
|
145
|
-
def food(id)
|
146
|
-
get_call("foods/#{id}.json")
|
147
17
|
end
|
148
18
|
|
149
|
-
def
|
150
|
-
|
19
|
+
def food_series_url(user_id, start_date, end_date_or_period)
|
20
|
+
['user', user_id, 'foods/log/caloriesIn', 'date', start_date, end_date_or_period].join('/') + '.json'
|
151
21
|
end
|
152
22
|
|
153
|
-
def
|
154
|
-
|
23
|
+
def water_series_url(user_id, start_date, end_date_or_period)
|
24
|
+
['user', user_id, 'foods/log/water', 'date', start_date, end_date_or_period].join('/') + '.json'
|
155
25
|
end
|
156
26
|
end
|
157
27
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module FitgemOauth2
|
2
|
+
class Client
|
3
|
+
def food_goals
|
4
|
+
get_call("user/#{user_id}/foods/log/goal.json")
|
5
|
+
end
|
6
|
+
|
7
|
+
def food_logs(date)
|
8
|
+
get_call("user/#{user_id}/foods/log/date/#{format_date(date)}.json")
|
9
|
+
end
|
10
|
+
|
11
|
+
def water_logs(date)
|
12
|
+
get_call("user/#{user_id}/foods/log/water/date/#{format_date(date)}.json")
|
13
|
+
end
|
14
|
+
|
15
|
+
def water_goal
|
16
|
+
get_call("user/#{user_id}/foods/log/water/goal.json")
|
17
|
+
end
|
18
|
+
|
19
|
+
def log_food(params)
|
20
|
+
post_call("user/#{user_id}/foods/log.json", params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_food_log(food_log_id, params)
|
24
|
+
post_call("user/#{user_id}/foods/log/#{food_log_id}.json", params)
|
25
|
+
end
|
26
|
+
|
27
|
+
def log_water(params)
|
28
|
+
post_call("user/#{user_id}/foods/log/water.json", params)
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_food_goal(params)
|
32
|
+
post_call("user/#{user_id}/foods/log/goal.json", params)
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_water_goal(params)
|
36
|
+
post_call("user/#{user_id}/foods/log/water/goal.json", params)
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete_food_log(food_log_id)
|
40
|
+
delete_call("user/#{user_id}/foods/log/#{food_log_id}.json")
|
41
|
+
end
|
42
|
+
|
43
|
+
def update_water_log(water_log_id, params)
|
44
|
+
post_call("user/#{user_id}/foods/log/water/#{water_log_id}.json", params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete_water_log(water_log_id)
|
48
|
+
delete_call("user/#{user_id}/foods/log/water/#{water_log_id}.json")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module FitgemOauth2
|
2
|
+
class Client
|
3
|
+
def add_favorite_food(food_id)
|
4
|
+
post_call("user/#{user_id}/foods/log/favorite/#{food_id}.json")
|
5
|
+
end
|
6
|
+
|
7
|
+
def delete_favorite_food(food_id)
|
8
|
+
delete_call("user/#{user_id}/foods/log/favorite/#{food_id}.json")
|
9
|
+
end
|
10
|
+
|
11
|
+
def recent_foods
|
12
|
+
get_call("user/#{user_id}/foods/recent.json")
|
13
|
+
end
|
14
|
+
|
15
|
+
def favorite_foods
|
16
|
+
get_call("user/#{user_id}/foods/log/favorite.json")
|
17
|
+
end
|
18
|
+
|
19
|
+
def frequent_foods
|
20
|
+
get_call("user/#{user_id}/foods/log/frequent.json")
|
21
|
+
end
|
22
|
+
|
23
|
+
def meals
|
24
|
+
get_call("user/#{user_id}/meals.json")
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_meal(params)
|
28
|
+
post_call("user/#{user_id}/meals.json", params)
|
29
|
+
end
|
30
|
+
|
31
|
+
def meal(meal_id)
|
32
|
+
get_call("user/#{user_id}/meals/#{meal_id}.json")
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_meal(meal_id, params)
|
36
|
+
post_call("user/#{user_id}/meals/#{meal_id}.json", params)
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete_meal(meal_id)
|
40
|
+
delete_call("user/#{user_id}/meals/#{meal_id}.json")
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_food(params)
|
44
|
+
post_call("user/#{user_id}/foods.json", params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete_food(food_id)
|
48
|
+
delete_call("user/#{user_id}/foods/#{food_id}.json")
|
49
|
+
end
|
50
|
+
|
51
|
+
def food(id)
|
52
|
+
get_call("foods/#{id}.json")
|
53
|
+
end
|
54
|
+
|
55
|
+
def food_units
|
56
|
+
get_call('foods/units.json')
|
57
|
+
end
|
58
|
+
|
59
|
+
def search_foods(params)
|
60
|
+
post_call('foods/search.json', params)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module FitgemOauth2
|
2
|
+
class Client
|
3
|
+
def food_series_for_date_range(start_date, end_date)
|
4
|
+
validate_start_date(start_date)
|
5
|
+
validate_end_date(end_date)
|
6
|
+
get_call(food_series_url(user_id, format_date(start_date), format_date(end_date)))
|
7
|
+
end
|
8
|
+
|
9
|
+
def food_series_for_period(start_date, period)
|
10
|
+
validate_start_date(start_date)
|
11
|
+
validate_food_series_period(period)
|
12
|
+
get_call(food_series_url(user_id, format_date(start_date), period))
|
13
|
+
end
|
14
|
+
|
15
|
+
def water_series_for_date_range(start_date, end_date)
|
16
|
+
validate_start_date(start_date)
|
17
|
+
validate_end_date(end_date)
|
18
|
+
get_call(water_series_url(user_id, format_date(start_date), format_date(end_date)))
|
19
|
+
end
|
20
|
+
|
21
|
+
def water_series_for_period(start_date, period)
|
22
|
+
validate_start_date(start_date)
|
23
|
+
validate_food_series_period(period)
|
24
|
+
get_call(water_series_url(user_id, format_date(start_date), period))
|
25
|
+
end
|
26
|
+
|
27
|
+
def food_series(resource: nil, start_date: nil, end_date: nil, period: nil)
|
28
|
+
warn '[DEPRECATED] use `food_series_for_date_range`, `food_series_for_period`, `water_series_for_date_range`, or `water_series_for_period` instead.'
|
29
|
+
unless FOOD_SERIES_RESOURCES.include?(resource)
|
30
|
+
raise FitgemOauth2::InvalidArgumentError, "Invalid resource: #{resource}. Specify a valid resource from #{FOOD_SERIES_RESOURCES}"
|
31
|
+
end
|
32
|
+
|
33
|
+
if end_date && period
|
34
|
+
raise FitgemOauth2::InvalidArgumentError, 'Provide only one of end_date and period.'
|
35
|
+
end
|
36
|
+
|
37
|
+
if !end_date && !period
|
38
|
+
raise FitgemOauth2::InvalidArgumentError, 'Provide at least one of end_date and period.'
|
39
|
+
end
|
40
|
+
|
41
|
+
url = ['user', user_id, 'foods/log', resource, 'date', start_date].join('/')
|
42
|
+
|
43
|
+
if period
|
44
|
+
unless FOOD_SERIES_PERIODS.include?(period)
|
45
|
+
raise FitgemOauth2::InvalidArgumentError, "Invalid period: #{period}. Specify a valid period from #{FOOD_SERIES_PERIODS}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
second = period || format_date(end_date)
|
50
|
+
url = [url, second].join('/')
|
51
|
+
|
52
|
+
get_call(url + '.json')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
File without changes
|
@@ -1,26 +1,34 @@
|
|
1
1
|
module FitgemOauth2
|
2
2
|
class Client
|
3
3
|
|
4
|
-
HR_PERIODS = %w
|
5
|
-
HR_DETAIL_LEVELS = %w
|
4
|
+
HR_PERIODS = %w[1d 7d 30d 1w 1m].freeze
|
5
|
+
HR_DETAIL_LEVELS = %w[1sec 1min].freeze
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
raise FitgemOauth2::InvalidArgumentError, 'Start date not provided.'
|
11
|
-
end
|
7
|
+
def hr_series_for_date_range(start_date, end_date)
|
8
|
+
validate_start_date(start_date)
|
9
|
+
validate_end_date(end_date)
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
url = ['user', user_id, 'activities/heart/date', format_date(start_date), format_date(end_date)].join('/')
|
12
|
+
get_call(url + '.json')
|
13
|
+
end
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
def hr_series_for_period(start_date, period)
|
16
|
+
validate_start_date(start_date)
|
17
|
+
validate_hr_period(period)
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
url = ['user', user_id, 'activities/heart/date', format_date(start_date), period].join('/')
|
20
|
+
get_call(url + '.json')
|
21
|
+
end
|
22
|
+
|
23
|
+
# retrieve heartrate time series
|
24
|
+
def heartrate_time_series(start_date: nil, end_date: nil, period: nil)
|
25
|
+
warn '[DEPRECATION] `heartrate_time_series` is deprecated. Please use `hr_series_for_date_range` or `hr_series_for_period` instead.'
|
26
|
+
|
27
|
+
regular_time_series_guard(
|
28
|
+
start_date: start_date,
|
29
|
+
end_date: end_date,
|
30
|
+
period: period
|
31
|
+
)
|
24
32
|
|
25
33
|
second = period || format_date(end_date)
|
26
34
|
|
@@ -31,27 +39,47 @@ module FitgemOauth2
|
|
31
39
|
|
32
40
|
# retrieve intraday series for heartrate
|
33
41
|
def intraday_heartrate_time_series(start_date: nil, end_date: nil, detail_level: nil, start_time: nil, end_time: nil)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
42
|
+
intraday_series_guard(
|
43
|
+
start_date: start_date,
|
44
|
+
end_date: end_date,
|
45
|
+
detail_level: detail_level,
|
46
|
+
start_time: start_time,
|
47
|
+
end_time: end_time
|
48
|
+
)
|
41
49
|
|
42
50
|
end_date = format_date(end_date) || '1d'
|
43
51
|
|
44
52
|
url = ['user', user_id, 'activities/heart/date', format_date(start_date), end_date, detail_level].join('/')
|
45
53
|
|
46
|
-
if (start_time && !end_time) || (end_time && !start_time)
|
47
|
-
raise FitgemOauth2::InvalidArgumentError, 'Either specify both the start_time and end_time or specify neither.'
|
48
|
-
end
|
49
|
-
|
50
54
|
if start_time && end_time
|
51
55
|
url = [url, 'time', format_time(start_time), format_time(end_time)].join('/')
|
52
56
|
end
|
53
57
|
|
54
58
|
get_call(url + '.json')
|
55
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def validate_hr_period(period)
|
64
|
+
raise FitgemOauth2::InvalidArgumentError, "Invalid period: #{period}. Valid periods are #{HR_PERIODS}." unless period && HR_PERIODS.include?(period)
|
65
|
+
end
|
66
|
+
|
67
|
+
def regular_time_series_guard(start_date:, end_date:, period:)
|
68
|
+
validate_start_date(start_date)
|
69
|
+
|
70
|
+
raise FitgemOauth2::InvalidArgumentError, 'Both end_date and period specified. Specify only one.' if end_date && period
|
71
|
+
|
72
|
+
raise FitgemOauth2::InvalidArgumentError, 'Neither end_date nor period specified. Specify at least one.' if !end_date && !period
|
73
|
+
|
74
|
+
validate_hr_period(period) if period
|
75
|
+
end
|
76
|
+
|
77
|
+
def intraday_series_guard(start_date:, end_date:, detail_level:, start_time:, end_time:)
|
78
|
+
raise FitgemOauth2::InvalidArgumentError, 'Start date not provided.' unless start_date
|
79
|
+
|
80
|
+
raise FitgemOauth2::InvalidArgumentError, "Please specify the defail level. Detail level should be one of #{HR_DETAIL_LEVELS}." unless detail_level && HR_DETAIL_LEVELS.include?(detail_level)
|
81
|
+
|
82
|
+
raise FitgemOauth2::InvalidArgumentError, 'Either specify both the start_time and end_time or specify neither.' if (start_time && !end_time) || (end_time && !start_time)
|
83
|
+
end
|
56
84
|
end
|
57
85
|
end
|
data/lib/fitgem_oauth2/sleep.rb
CHANGED
@@ -2,8 +2,12 @@ module FitgemOauth2
|
|
2
2
|
|
3
3
|
class Client
|
4
4
|
|
5
|
-
SLEEP_RESOURCES = %w
|
6
|
-
|
5
|
+
SLEEP_RESOURCES = %w[
|
6
|
+
startTime timeInBed minutesAsleep awakeningsCount minutesAwake
|
7
|
+
minutesToFallAsleep minutesAfterWakeup efficiency
|
8
|
+
].freeze
|
9
|
+
|
10
|
+
SLEEP_PERIODS = %w[1d 7d 30d 1w 1m 3m 6m 1y max].freeze
|
7
11
|
|
8
12
|
# retrieve sleep logs for a date
|
9
13
|
# @param date date for which sleep logs needs to be accessed
|
@@ -17,9 +21,9 @@ module FitgemOauth2
|
|
17
21
|
|
18
22
|
def sleep_logs_list(date, sort, limit)
|
19
23
|
date_param = format_date(date)
|
20
|
-
if sort ==
|
24
|
+
if sort == 'asc'
|
21
25
|
date_param = "afterDate=#{date_param}"
|
22
|
-
elsif sort ==
|
26
|
+
elsif sort == 'desc'
|
23
27
|
date_param = "beforeDate=#{date_param}"
|
24
28
|
else
|
25
29
|
raise FitgemOauth2::InvalidArgumentError, "sort can either be asc or desc"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module FitgemOauth2
|
2
2
|
class Client
|
3
3
|
|
4
|
-
SUBSCRIBABLE_TYPES = [
|
4
|
+
SUBSCRIBABLE_TYPES = %i[sleep body activities foods all].freeze
|
5
5
|
|
6
6
|
def subscriptions(opts)
|
7
7
|
get_call(subscription_url(opts))
|
@@ -18,15 +18,15 @@ module FitgemOauth2
|
|
18
18
|
protected
|
19
19
|
|
20
20
|
def subscription_url(opts)
|
21
|
-
type = opts[
|
21
|
+
type = opts[:type] || :all
|
22
22
|
subscription_id = opts[:subscription_id]
|
23
23
|
|
24
|
-
url = [
|
24
|
+
url = ['user', user_id]
|
25
25
|
url << type unless type == :all
|
26
26
|
url << 'apiSubscriptions'
|
27
27
|
url << subscription_id if subscription_id
|
28
28
|
|
29
|
-
|
29
|
+
url.join('/') + '.json'
|
30
30
|
end
|
31
31
|
end
|
32
|
-
end
|
32
|
+
end
|
data/lib/fitgem_oauth2/users.rb
CHANGED
data/lib/fitgem_oauth2/utils.rb
CHANGED
@@ -1,19 +1,16 @@
|
|
1
1
|
module FitgemOauth2
|
2
2
|
class Client
|
3
|
-
|
4
3
|
def format_date(date)
|
5
4
|
|
6
|
-
if
|
7
|
-
return nil
|
8
|
-
end
|
5
|
+
return nil if date.nil?
|
9
6
|
|
10
|
-
valid_semantic_date = %w
|
11
|
-
valid_date_string = (
|
7
|
+
valid_semantic_date = %w[today yesterday].include? date
|
8
|
+
valid_date_string = (date =~ /\d{4}\-\d{2}\-\d{2}/) == 0
|
12
9
|
if valid_date_string
|
13
10
|
date
|
14
11
|
elsif valid_semantic_date
|
15
12
|
date_from_semantic(date)
|
16
|
-
elsif Date
|
13
|
+
elsif date.is_a?(Date) || date.is_a?(Time) || date.is_a?(DateTime)
|
17
14
|
date.strftime('%Y-%m-%d')
|
18
15
|
else
|
19
16
|
raise FitgemOauth2::InvalidDateArgument, "Date used must be a date/time object or a string in the format YYYY-MM-DD; supplied argument is a #{date.class}"
|
@@ -21,19 +18,28 @@ module FitgemOauth2
|
|
21
18
|
end
|
22
19
|
|
23
20
|
def format_time(time)
|
24
|
-
if (
|
21
|
+
if (time =~ /\d{2}:\d{2}/) == 0
|
25
22
|
time
|
26
|
-
elsif DateTime
|
23
|
+
elsif time.is_a?(DateTime) || time.is_a?(Time)
|
27
24
|
time.strftime('%H:%M')
|
28
25
|
else
|
29
26
|
raise FitgemOauth2::InvalidTimeArgument, "Time used must be a DateTime/Time object or a string in the format hh:mm; supplied argument is a #{time.class}"
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
30
|
+
def validate_start_date(start_date)
|
31
|
+
raise FitgemOauth2::InvalidArgumentError, 'Please specify a valid start date.' unless start_date
|
32
|
+
end
|
33
|
+
|
34
|
+
def validate_end_date(end_date)
|
35
|
+
raise FitgemOauth2::InvalidArgumentError, 'Please specify a valid end date.' unless end_date
|
36
|
+
end
|
37
|
+
|
33
38
|
private
|
39
|
+
|
34
40
|
def date_from_semantic(semantic)
|
35
41
|
if semantic === 'yesterday'
|
36
|
-
(Date.today-1).strftime('%Y-%m-%d')
|
42
|
+
(Date.today - 1).strftime('%Y-%m-%d')
|
37
43
|
elsif semantic == 'today'
|
38
44
|
Date.today.strftime('%Y-%m-%d')
|
39
45
|
end
|
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: 2.2.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: 2020-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.0.1
|
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: 1.0.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 13.0.1
|
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: 13.0.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,9 @@ files:
|
|
80
80
|
- lib/fitgem_oauth2/devices.rb
|
81
81
|
- lib/fitgem_oauth2/errors.rb
|
82
82
|
- lib/fitgem_oauth2/food.rb
|
83
|
+
- lib/fitgem_oauth2/food/collection.rb
|
84
|
+
- lib/fitgem_oauth2/food/metadata.rb
|
85
|
+
- lib/fitgem_oauth2/food/series.rb
|
83
86
|
- lib/fitgem_oauth2/friends.rb
|
84
87
|
- lib/fitgem_oauth2/heartrate.rb
|
85
88
|
- lib/fitgem_oauth2/sleep.rb
|
@@ -106,10 +109,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
109
|
- !ruby/object:Gem::Version
|
107
110
|
version: '0'
|
108
111
|
requirements: []
|
109
|
-
|
110
|
-
rubygems_version: 2.4.6
|
112
|
+
rubygems_version: 3.0.3
|
111
113
|
signing_key:
|
112
114
|
specification_version: 4
|
113
115
|
summary: Fitbit API client library
|
114
116
|
test_files: []
|
115
|
-
has_rdoc:
|