fitbit_api 0.9.1 → 0.10.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: '099467bf4273b82b5a9cc9ad11d96b7e36bb856d9dbaf81735e7d5b913ff09eb'
4
- data.tar.gz: fd5d0e33608dd71e071436e9619b57bc2ba9ccb27c92e67f2e1dd763ab6b2727
3
+ metadata.gz: 303b1eda2135541723313d505d4c34292e94b473c2a87cff32119bd8de97b0ea
4
+ data.tar.gz: c526445b8815cbe19ce92f6b762036aae9bbf57cfccea2cba9131ed63788307e
5
5
  SHA512:
6
- metadata.gz: 7aeafc676dd87ad01dceed46fe7f4f741fdce3fea3f62852f3a0df7c4fbf8269f7d2d86471ea1b6866fbc9e2cb1af6be344fb42f8250289f25f4eef428df95c2
7
- data.tar.gz: 47ea79fc3e1bd68d026622a8fe6404c134a635ca65b6cdeb740fdf5a1245722ec65b0d53a38579897a8dd8631ae75a1519bc96a302fa85e6648fece0e4e9a5af
6
+ metadata.gz: d7cc3ae62f509e40a0c58bc31f5ffc75865909d482e862401afa0737fc6138ea226c3a9909721903b86f00febd1a8eea46ac01b1d93d2c9dbd0d706b6c201938
7
+ data.tar.gz: d0d6328a931c8d3fe931f6e31b283681092b31d4b50d5186aeb1a7b8efe885dbf828d0c058a5296c4a4abe9b7e8b13b183482d1f6dc6102aac38a98284d9f3ec
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ 0.10.0
2
+ ------
3
+ - Add `auto_refresh_token` config to make token auto-refreshing configurable (defaults to true).
4
+ - Add `on_token_refresh` config to specify callback to execute on token refresh (optional).
5
+ - Bump `bundler` development dependency
6
+ - Clean up documentation formatting
7
+
1
8
  0.9.1
2
9
  -----
3
10
  - Fix `sleep_time_series` endpoint
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/fitbit_api.svg)](https://badge.fury.io/rb/fitbit_api)
4
4
  [![Build Status](https://travis-ci.org/zokioki/fitbit_api.svg?branch=master)](https://travis-ci.org/zokioki/fitbit_api)
5
5
 
6
- FitbitAPI provides a Ruby interface to the [Fitbit Web API](https://dev.fitbit.com/reference/web-api/quickstart).
6
+ FitbitAPI provides a Ruby interface to the [Fitbit Web API](https://dev.fitbit.com/reference/web-api).
7
7
 
8
8
  ## Installation
9
9
 
@@ -95,19 +95,18 @@ client.log_activity activity_id: 12345, durationMillis: '683300'
95
95
 
96
96
  When initializing a `FitbitAPI::Client` instance, you're given access to a handful of options:
97
97
 
98
- - `:api_version` - API version to be used when making requests (default: "1")
99
-
100
- - `:unit_system` - The measurement unit system to use for response values (default: "en_US" | available: "en_US", "en_GB", and "any" for metric)
101
-
102
- - `:locale` - The locale to use for response values (default: "en_US" | available: "en_US", "fr_FR", "de_DE", "es_ES", "en_GB", "en_AU", "en_NZ" and "ja_JP")
103
-
104
- - `:scope` - A space-delimited list of the permissions you are requesting (default: "activity nutrition profile settings sleep social weight heartrate" | available: "activity", "heartrate", "location", "nutrition", "profile", "settings" "sleep", "social" and "weight")
105
-
106
- - `:snake_case_keys` - Transform returned object's keys to snake case format (default: false)
107
-
108
- - `:symbolize_keys` - Transform returned object's keys to symbols (default: false)
109
-
110
- If using this library in Rails, you can configure your options using an initializer:
98
+ | option | description |
99
+ | ------------------ | -----------------------------|
100
+ | api_version | API version to be used when making requests (default: "1") |
101
+ | unit_system | The measurement unit system to use for response values (default: "en_US") |
102
+ | locale | The locale to use for response values (default: "en_US") |
103
+ | scope | A space-delimited list of permissions being requested (default: "activity nutrition profile settings sleep social weight heartrate") |
104
+ | snake_case_keys | Transform response payload's keys to snake case format (default: false) |
105
+ | symbolize_keys | Transform response payload's keys to symbols (default: false) |
106
+ | auto_refresh_token | Automatically refreshes the access token once expired (default: true) |
107
+ | on_token_refresh | A callback to be invoked whenever the access token is refreshed (default: nil) |
108
+
109
+ If using this library in Rails, you can configure these options globally in an initializer:
111
110
 
112
111
  ```ruby
113
112
  # config/initializers/fitbit_api.rb
data/fitbit_api.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_runtime_dependency 'oauth2', '~> 1.0'
23
23
 
24
24
  spec.add_development_dependency 'byebug'
25
- spec.add_development_dependency 'bundler', '~> 2.0'
25
+ spec.add_development_dependency 'bundler', '~> 2.3'
26
26
  spec.add_development_dependency 'rake', '>= 12.3.3'
27
27
  spec.add_development_dependency 'rspec'
28
28
  end
@@ -14,15 +14,18 @@ module FitbitAPI
14
14
  # GET Activities
15
15
  # ==============
16
16
 
17
- # Retrieves a summary and list of a user's activities and activity log entries for a given day
18
- # in the format requested using units in the unit system which corresponds to the Accept-Language header provided.
17
+ # Retrieves a summary and list of a user's activities and activity log entries
18
+ # for a given day in the format requested using units in the unit system which
19
+ # corresponds to the Accept-Language header provided.
20
+ #
21
+ # @param date [Date] The date for which to retrieve the activity data.
19
22
 
20
23
  def daily_activity_summary(date=Date.today, opts={})
21
24
  get("user/#{user_id}/activities/date/#{format_date(date)}.json", opts)
22
25
  end
23
26
 
24
- # Retrieves a list of a user's frequent activities in the format requested using units
25
- # in the unit system which corresponds to the Accept-Language header provided.
27
+ # Retrieves a list of a user's frequent activities in the format requested using
28
+ # units in the unit system which corresponds to the Accept-Language header provided.
26
29
 
27
30
  def frequent_activities(opts={})
28
31
  get("user/#{user_id}/activities/frequent.json", opts)
@@ -38,22 +41,24 @@ module FitbitAPI
38
41
  get("user/#{user_id}/activities/favorite.json", opts)
39
42
  end
40
43
 
41
- # Gets a tree of all valid Fitbit public activities from
42
- # the activities catalog as well as private custom activities the user created.
44
+ # Gets a tree of all valid Fitbit public activities from the activities catalog
45
+ # as well as private custom activities the user created.
43
46
 
44
47
  def all_activities(opts={})
45
48
  get('activities.json', opts)
46
49
  end
47
50
 
48
- # Retrieves a list of a user's activity log entries before or after a given day with
49
- # offset and limit using units in the unit system which corresponds to the Accept-Language header provided.
50
-
51
- # ==== URL Parameters
52
- # * +:beforeDate+ - the date; formatted in yyyy-MM-ddTHH:mm:ss
53
- # * +:afterDate+ - the date; formatted in yyyy-MM-ddTHH:mm:ss
54
- # * +:sort+ - the sort order of entries by date (asc or desc)
55
- # * +:offset+ - the offset number of entries. Must always be 0
56
- # * +:limit+ - the max of the number of entries returned (max: 20)
51
+ # Retrieves a list of a user's activity log entries before or after a given day
52
+ # with offset and limit using units in the unit system which corresponds to the
53
+ # Accept-Language header provided.
54
+ #
55
+ # activity_logs_list(before_date: Date.parse('2021-05-24'), limit: 5)
56
+ #
57
+ # @option before_date [Date] Specify when filtering entries that occured before the given date
58
+ # @option after_date [Date] Specify when filtering entries that occured after the given date
59
+ # @option sort [String] the Sort order of entries by date (asc or desc)
60
+ # @option offset [Integer] The offset number of entries. Must always be 0
61
+ # @option limit [Integer] The max of the number of entries returned (max: 20)
57
62
 
58
63
  def activity_logs_list(opts={})
59
64
  opts[:params] = {}
@@ -68,16 +73,18 @@ module FitbitAPI
68
73
  end
69
74
 
70
75
  # Returns the details of a specific activity in the Fitbit activities database in the format requested.
71
- # If activity has levels, also returns a list of activity level details.
76
+ # If activity has levels, also returns a list of activity level details.
77
+ #
78
+ # @param activity_id [Integer, String] The ID of the desired activity to retrieve
72
79
 
73
80
  def activity(activity_id)
74
81
  get("activities/#{activity_id}.json")
75
82
  end
76
83
 
77
84
  # Retrieves the user's activity statistics in the format requested using units
78
- # in the unit system which corresponds to the Accept-Language header provided.
79
- # Activity statistics includes Lifetime and Best achievement values from the
80
- # My Achievements tile on the website dashboard.
85
+ # in the unit system which corresponds to the Accept-Language header provided.
86
+ # Activity statistics includes Lifetime and Best achievement values from the
87
+ # My Achievements tile on the website dashboard.
81
88
 
82
89
  def lifetime_stats(opts={})
83
90
  get("user/#{user_id}/activities.json", opts)
@@ -142,23 +149,26 @@ module FitbitAPI
142
149
  # ===============
143
150
 
144
151
  # Creates log entry for an activity or user's private custom activity using units
145
- # in the unit system which corresponds to the Accept-Language header provided.
146
-
147
- # ==== POST Parameters
148
- # * +:activityId+ - activity id
149
- # * +:activityName+ - custom activity name. Either activity ID or activityName must be provided
150
- # * +:manualCalories+ - calories burned, specified manually. Required with activityName, otherwise optional
151
- # * +:startTime+ - activity start time; formatted in HH:mm:ss
152
- # * +:durationMillis+ - duration in milliseconds
153
- # * +:date+ - log entry date; formatted in yyyy-MM-dd
154
- # * +:distance+ - distance; required for logging directory activity; formatted in X.XX
155
- # * +:distanceUnit+ - distance measurement unit
152
+ # in the unit system which corresponds to the Accept-Language header provided.
153
+ #
154
+ # log_activity(body: { activity_id: 90013, manual_calories: 300, duration_millis: 6000000 })
155
+ #
156
+ # @option activity_id [Integer, String] The activity ID
157
+ # @option activity_name [String] Custom activity name. Either activity ID or activity_name must be provided
158
+ # @option manual_calories [Integer] Calories burned, specified manually. Required with activity_name, otherwise optional
159
+ # @option start_time [String] Activity start time; formatted in HH:mm:ss
160
+ # @option duration_millis [Integer] Duration in milliseconds
161
+ # @option date [String] Log entry date; formatted in yyyy-MM-dd
162
+ # @option distance [Integer] Distance; required for logging directory activity
163
+ # @option distance_unit [String] Distance measurement unit
156
164
 
157
165
  def log_activity(opts)
158
166
  post("user/#{user_id}/activities.json", opts)
159
167
  end
160
168
 
161
169
  # Adds the activity with the given ID to user's list of favorite activities.
170
+ #
171
+ # @param activity_id [Integer] The activity ID
162
172
 
163
173
  def add_favorite_activity(activity_id)
164
174
  post("user/#{user_id}/activities/favorite/#{activity_id}.json")
@@ -168,12 +178,16 @@ module FitbitAPI
168
178
  # =================
169
179
 
170
180
  # Deletes a user's activity log entry with the given ID.
181
+ #
182
+ # @param activity_log_id [Integer] The ID of the activity log entry
171
183
 
172
184
  def delete_activity(activity_log_id)
173
185
  delete("user/#{user_id}/activities/#{activity_log_id}.json")
174
186
  end
175
187
 
176
188
  # Removes the activity with the given ID from a user's list of favorite activities.
189
+ #
190
+ # @param activity_id [Integer] The ID of the activity to be removed
177
191
 
178
192
  def delete_favorite_activity(activity_id)
179
193
  delete("user/#{user_id}/activities/favorite/#{activity_id}.json")
@@ -4,6 +4,8 @@ module FitbitAPI
4
4
  # ==========
5
5
 
6
6
  # Returns a list of the set alarms connected to a user's account.
7
+ #
8
+ # @params tracker_id [Integer] The ID of the tracker for which the data is returned
7
9
 
8
10
  def alarms(tracker_id, opts={})
9
11
  get("user/#{user_id}/devices/tracker/#{tracker_id}/alarms.json", opts)
@@ -13,28 +15,33 @@ module FitbitAPI
13
15
  # ===========
14
16
 
15
17
  # Adds the alarm settings to a given ID for a given device.
16
-
17
- # ==== POST Parameters
18
- # * +:time+ - time of day that the alarm vibrates with a UTC timezone offset, e.g. 07:15-08:00
19
- # * +:enabled+ - boolean; if false, alarm does not vibrate until enabled is set to true
20
- # * +:recurring+ - boolean; if false, the alarm is a single event
21
- # * +:weekDays+ - comma separated list of days of the week on which the alarm vibrates (MONDAY,TUESDAY)
18
+ #
19
+ # add_alarm(body: { time: "07:15-08:00", enabled: true, recurring: true, week_days: "MONDAY,FRIDAY,SATURDAY" })
20
+ #
21
+ # @param tracker_id [Integer] The ID of the tracker for which the alarm is created
22
+ #
23
+ # @option time [String] Time of day that the alarm vibrates with a UTC timezone offset, e.g. 07:15-08:00
24
+ # @option enabled [Boolean] If false, alarm does not vibrate until enabled is set to true
25
+ # @option recurring [Boolean] If false, the alarm is a single event
26
+ # @option week_days [String] Comma separated list of days of the week on which the alarm vibrates (MONDAY,TUESDAY)
22
27
 
23
28
  def add_alarm(tracker_id, opts={})
24
29
  post("user/#{user_id}/devices/tracker/#{tracker_id}/alarms.json", opts)
25
30
  end
26
31
 
27
32
  # Updates the alarm entry with a given ID for a given device.
28
-
29
- # ==== POST Parameters
30
- # * +:time+ - time of day that the alarm vibrates with a UTC timezone offset, e.g. 07:15-08:00
31
- # * +:enabled+ - boolean; if false, alarm does not vibrate until enabled is set to true
32
- # * +:recurring+ - boolean; if false, the alarm is a single event
33
- # * +:weekDays+ - comma separated list of days of the week on which the alarm vibrates (MONDAY,TUESDAY)
34
- # * +:snoozeLength+ - integer; minutes between alarms
35
- # * +:snoozeCount+ - integer; maximum snooze count
36
- # * +:label+ - string; label for alarm
37
- # * +:vibe+ - vibe pattern; only one value for now (DEFAULT)
33
+ #
34
+ # @param tracker_id [Integer] The ID of the tracker for which the alarm is created
35
+ # @param alarm_id [Integer] The ID of the alarm to be updated
36
+ #
37
+ # @option time [String] Time of day that the alarm vibrates with a UTC timezone offset, e.g. 07:15-08:00
38
+ # @option enabled [Boolean] If false, alarm does not vibrate until enabled is set to true
39
+ # @option recurring [Boolean] If false, the alarm is a single event
40
+ # @option week_days [String] Comma separated list of days of the week on which the alarm vibrates (MONDAY,TUESDAY)
41
+ # @option snooze_length [Integer] Minutes between alarms
42
+ # @option snooze_count [Integer] Maximum snooze count
43
+ # @option label [String] Label for alarm
44
+ # @option vibe [String] Vibe pattern; only one value for now (DEFAULT)
38
45
 
39
46
  def update_alarm(tracker_id, alarm_id, opts={})
40
47
  post("user/#{user_id}/devices/tracker/#{tracker_id}/alarms/#{alarm_id}.json", opts)
@@ -44,6 +51,9 @@ module FitbitAPI
44
51
  # =============
45
52
 
46
53
  # Deletes the user's device alarm entry with the given ID for a given device.
54
+ #
55
+ # @param tracker_id [Integer] The ID of the tracker for which the alarm is to be deleted
56
+ # @param alarm_id [Integer] The ID of the alarm to be deleted
47
57
 
48
58
  def delete_alarm(tracker_id, alarm_id, opts={})
49
59
  delete("user/#{user_id}/devices/tracker/#{tracker_id}/alarms/#{alarm_id}.json", opts)
@@ -21,4 +21,7 @@ module FitbitAPI
21
21
 
22
22
  define_setting :snake_case_keys, false
23
23
  define_setting :symbolize_keys, false
24
+
25
+ define_setting :auto_refresh_token, true
26
+ define_setting :on_token_refresh
24
27
  end
@@ -14,8 +14,8 @@ require 'fitbit_api/water'
14
14
  module FitbitAPI
15
15
  class Client
16
16
  attr_accessor :api_version, :unit_system, :locale, :scope,
17
- :snake_case_keys, :symbolize_keys
18
- attr_reader :user_id
17
+ :snake_case_keys, :symbolize_keys, :auto_refresh_token, :on_token_refresh
18
+ attr_reader :token, :user_id
19
19
 
20
20
  def initialize(opts={})
21
21
  validate_args(opts)
@@ -32,57 +32,30 @@ module FitbitAPI
32
32
  @token = @client.auth_code.get_token(
33
33
  auth_code,
34
34
  redirect_uri: @redirect_uri,
35
- headers: auth_header
35
+ headers: auth_headers
36
36
  )
37
37
  @user_id = @token.params['user_id']
38
38
  @token
39
39
  end
40
40
 
41
- def token
42
- @token.expired? ? refresh_token! : @token
43
- end
44
-
45
41
  def refresh_token!
46
- @token = @token.refresh!(headers: auth_header)
42
+ @token = @token.refresh!(headers: auth_headers)
47
43
  @user_id ||= @token.params['user_id']
48
- @token
49
- end
50
-
51
- def auth_header
52
- { 'Authorization' => ('Basic ' + Base64.encode64(@client_id + ':' + @client_secret)) }
53
- end
44
+ on_token_refresh.call(@token) if on_token_refresh.respond_to?(:call)
54
45
 
55
- def request_headers
56
- {
57
- 'User-Agent' => "fitbit_api gem (v#{FitbitAPI::VERSION})",
58
- 'Accept-Language' => @unit_system,
59
- 'Accept-Locale' => @locale
60
- }
46
+ @token
61
47
  end
62
48
 
63
49
  def get(path, opts={})
64
- params = opts.delete(:params) || {}
65
- response = token.get(("#{@api_version}/" + path), params: deep_keys_to_camel_case!(params), headers: request_headers).response
66
- object = MultiJson.load(response.body) unless response.status == 204
67
- process_keys!(object, opts)
50
+ request(:get, path, opts)
68
51
  end
69
52
 
70
53
  def post(path, opts={})
71
- response = token.post(("#{@api_version}/" + path), body: deep_keys_to_camel_case!(opts), headers: request_headers).response
72
- object = MultiJson.load(response.body) unless response.status == 204
73
- process_keys!(object, opts)
54
+ request(:post, path, opts)
74
55
  end
75
56
 
76
57
  def delete(path, opts={})
77
- response = token.delete(("#{@api_version}/" + path), headers: request_headers).response
78
- object = MultiJson.load(response.body) unless response.status == 204
79
- process_keys!(object, opts)
80
- end
81
-
82
- def process_keys!(object, opts={})
83
- deep_keys_to_snake_case!(object) if (opts[:snake_case_keys] || snake_case_keys)
84
- deep_symbolize_keys!(object) if (opts[:symbolize_keys] || symbolize_keys)
85
- return object
58
+ request(:delete, path, opts)
86
59
  end
87
60
 
88
61
  private
@@ -103,7 +76,8 @@ module FitbitAPI
103
76
  def assign_attrs(opts)
104
77
  attrs = %i[client_id client_secret redirect_uri site_url
105
78
  authorize_url token_url unit_system locale scope
106
- api_version snake_case_keys symbolize_keys].freeze
79
+ api_version snake_case_keys symbolize_keys
80
+ auto_refresh_token on_token_refresh].freeze
107
81
 
108
82
  attrs.each do |attr|
109
83
  instance_variable_set("@#{attr}", (opts[attr] || FitbitAPI.send(attr)))
@@ -139,5 +113,38 @@ module FitbitAPI
139
113
 
140
114
  refresh_token! if @token.token.empty?
141
115
  end
116
+
117
+ def request(verb, path, opts={})
118
+ request_path = "#{@api_version}/#{path}"
119
+ request_options = opts.merge(headers: request_headers)
120
+
121
+ deep_keys_to_camel_case!(request_options[:params])
122
+ deep_keys_to_camel_case!(request_options[:body])
123
+
124
+ refresh_token! if auto_refresh_token && token.expired?
125
+
126
+ response = token.public_send(verb, request_path, request_options).response
127
+ object = MultiJson.load(response.body) unless response.status == 204
128
+
129
+ process_keys!(object, opts)
130
+ end
131
+
132
+ def auth_headers
133
+ { 'Authorization' => ('Basic ' + Base64.encode64(@client_id + ':' + @client_secret)) }
134
+ end
135
+
136
+ def request_headers
137
+ {
138
+ 'User-Agent' => "fitbit_api gem (v#{FitbitAPI::VERSION})",
139
+ 'Accept-Language' => @unit_system,
140
+ 'Accept-Locale' => @locale
141
+ }
142
+ end
143
+
144
+ def process_keys!(object, opts={})
145
+ deep_keys_to_snake_case!(object) if (opts[:snake_case_keys] || snake_case_keys)
146
+ deep_symbolize_keys!(object) if (opts[:symbolize_keys] || symbolize_keys)
147
+ return object
148
+ end
142
149
  end
143
150
  end
@@ -31,28 +31,30 @@ module FitbitAPI
31
31
  # ==========
32
32
 
33
33
  # Creates or updates a user's daily activity goals and returns a response using units
34
- # in the unit system which corresponds to the Accept-Language header provided.
35
-
36
- # ==== POST Parameters
37
- # * +:caloriesOut+ - calories output goal value; integer
38
- # * +:activeMinutes+ - active minutes goal value; integer
39
- # * +:floors+ - floor goal value; integer
40
- # * +:distance+ - distance goal value; X.XX or integer
41
- # * +:steps+ - steps goal value; integer
34
+ # in the unit system which corresponds to the Accept-Language header provided.
35
+ #
36
+ # create_or_update_daily_goals(body: {calories_out: 2000, active_minutes: 90, floors: 5})
37
+ #
38
+ # @option calories_out [Integer] Calories output goal value
39
+ # @option active_minutes [Integer] Active minutes goal value
40
+ # @option floors [Integer] Floor goal value
41
+ # @option distance [Integer, Float] Distance goal value
42
+ # @option steps [Integer] Steps goal value
42
43
 
43
44
  def create_or_update_daily_goals(opts={})
44
45
  post("user/#{user_id}/activities/goals/daily.json", opts)
45
46
  end
46
47
 
47
48
  # Creates or updates a user's weekly activity goals and returns a response using units
48
- # in the unit system which corresponds to the Accept-Language header provided.
49
-
50
- # ==== POST Parameters
51
- # * +:caloriesOut+ - calories output goal value; integer
52
- # * +:activeMinutes+ - active minutes goal value; integer
53
- # * +:floors+ - floor goal value; integer
54
- # * +:distance+ - distance goal value; X.XX or integer
55
- # * +:steps+ - steps goal value; integer
49
+ # in the unit system which corresponds to the Accept-Language header provided.
50
+ #
51
+ # create_or_update_weekly_goals(body: { active_minutes: 300, floors: 20 })
52
+ #
53
+ # @option calories_out [Integer] Calories output goal value
54
+ # @option active_minutes [Integer] Active minutes goal value
55
+ # @option floors [Integer] Floor goal value
56
+ # @option distance [Integer, Float] Distance goal value
57
+ # @option steps [Integer] Steps goal value
56
58
 
57
59
  def create_or_update_weekly_goals(opts={})
58
60
  post("user/#{user_id}/activities/goals/weekly.json", opts)
@@ -1,25 +1,27 @@
1
- module Configuration
2
- def configure
3
- yield self
4
- end
1
+ module FitbitAPI
2
+ module Configuration
3
+ def configure
4
+ yield self
5
+ end
5
6
 
6
- def define_setting(name, default = nil)
7
- class_variable_set("@@#{name}", default)
7
+ def define_setting(name, default = nil)
8
+ class_variable_set("@@#{name}", default)
8
9
 
9
- define_class_method "#{name}=" do |value|
10
- class_variable_set("@@#{name}", value)
11
- end
10
+ define_class_method "#{name}=" do |value|
11
+ class_variable_set("@@#{name}", value)
12
+ end
12
13
 
13
- define_class_method name do
14
- class_variable_get("@@#{name}")
14
+ define_class_method name do
15
+ class_variable_get("@@#{name}")
16
+ end
15
17
  end
16
- end
17
18
 
18
- private
19
+ private
19
20
 
20
- def define_class_method(name, &block)
21
- (class << self; self; end).instance_eval do
22
- define_method name, &block
21
+ def define_class_method(name, &block)
22
+ (class << self; self; end).instance_eval do
23
+ define_method name, &block
24
+ end
23
25
  end
24
26
  end
25
27
  end
@@ -1,3 +1,3 @@
1
1
  module FitbitAPI
2
- VERSION = '0.9.1'
2
+ VERSION = '0.10.0'
3
3
  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.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zoran
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-05 00:00:00.000000000 Z
11
+ date: 2022-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oauth2
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: '2.3'
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: '2.0'
54
+ version: '2.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -132,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  - !ruby/object:Gem::Version
133
133
  version: '0'
134
134
  requirements: []
135
- rubygems_version: 3.2.3
135
+ rubygems_version: 3.3.13
136
136
  signing_key:
137
137
  specification_version: 4
138
138
  summary: A Ruby interface to the Fitbit Web API.