fitbyte 0.3.0 → 0.4.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/CHANGELOG.md +7 -0
- data/README.md +8 -9
- data/lib/fitbyte/client.rb +17 -10
- data/lib/fitbyte/helpers.rb +35 -0
- data/lib/fitbyte/version.rb +1 -1
- metadata +3 -4
- data/lib/fitbyte/fitstruct.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f683b1fe97c314e07e53a983be399fff5ea30787
|
4
|
+
data.tar.gz: 8d9701b9aa3f08a74a05f76a81dfcbe212387dfa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cb40bea88a84370e8af28cc981750274f67521bfba24b84380435679b58b6de03cc3ccc02f045441e9012c6240d2af850131f4f98b75d5e02fe3fe675d7cb83
|
7
|
+
data.tar.gz: e19b133f2d0d4ed7276ca7e116e0e2934739c08e2a5e7b849a24977fa24760b2c29ab7e911ed98503a6ef33999d25d300b83e0a3bd2229479d7aff676f21d4d2
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
0.4.0
|
2
|
+
-----
|
3
|
+
- Remove FitStruct objects
|
4
|
+
- The response's hash keys can now be transformed using the following options:
|
5
|
+
- `snake_case` - if set to true, all keys are formatted to snake_case
|
6
|
+
- `symbolize_keys` - if set to true, all keys are converted to symbols
|
7
|
+
|
1
8
|
0.3.0
|
2
9
|
-----
|
3
10
|
- API endpoint support for the following actions:
|
data/README.md
CHANGED
@@ -5,8 +5,6 @@
|
|
5
5
|
|
6
6
|
This gem allows interaction with [Fitbit's REST API](https://dev.fitbit.com/docs/basics/).
|
7
7
|
|
8
|
-
**NOTE:** Fitbit's API is currently in beta, and is in active development. Breaking changes to certain endpoints may be introduced during early development of this gem, until Fitbit's API solidifies.
|
9
|
-
|
10
8
|
## Installation
|
11
9
|
|
12
10
|
To install the latest release:
|
@@ -48,16 +46,14 @@ You're now authenticated and can make calls to Fitbit's API:
|
|
48
46
|
|
49
47
|
```ruby
|
50
48
|
client.food_logs Date.today
|
51
|
-
# =>
|
49
|
+
# => { "foods" => [{ "isFavorite" => true, "logDate" => "2015-06-26", "logId" => 1820, "loggedFood" => { "accessLevel" => "PUBLIC", "amount" => 132.57, "brand" => "", "calories" => 752, ...}] }
|
52
50
|
```
|
53
51
|
|
54
|
-
|
55
|
-
|
56
|
-
To return the original JSON, `raw: true` can be specified as an option:
|
52
|
+
To return the hash keys in snake_case format, the `snake_case: true` option can be specified:
|
57
53
|
|
58
54
|
```ruby
|
59
|
-
client.food_logs Date.today,
|
60
|
-
# => {
|
55
|
+
client.food_logs Date.today, snake_case: true
|
56
|
+
# => { "foods" => [{ "is_favorite" => true, "log_date" => "2015-06-26", "log_id" => 1820, "logged_food" => { "access_level" => "PUBLIC", "amount" => 132.57, "brand" => "", "calories" => 752, ...}] }
|
61
57
|
```
|
62
58
|
|
63
59
|
### Options
|
@@ -76,7 +72,10 @@ When initializing a `Fitbyte::Client` instance, you're given access to a handful
|
|
76
72
|
- `:scope` - A space-delimited list of the permissions you are requesting (default: "activity nutrition profile settings sleep social weight" | available: "activity", "heartrate", "location", "nutrition", "profile", "settings" "sleep", "social" and "weight")
|
77
73
|
|
78
74
|
---
|
79
|
-
- `:
|
75
|
+
- `:snake_case` - Transform returned object's keys to snake case format (default: false)
|
76
|
+
|
77
|
+
---
|
78
|
+
- `:symbolize_keys` - Transform returned object's keys to symbols (default: false)
|
80
79
|
|
81
80
|
---
|
82
81
|
|
data/lib/fitbyte/client.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "fitbyte/fitstruct"
|
2
1
|
require "fitbyte/helpers"
|
3
2
|
require "fitbyte/activities"
|
4
3
|
require "fitbyte/goals"
|
@@ -13,7 +12,7 @@ require "fitbyte/water"
|
|
13
12
|
|
14
13
|
module Fitbyte
|
15
14
|
class Client
|
16
|
-
attr_accessor :api_version, :unit_system, :locale, :scope, :
|
15
|
+
attr_accessor :api_version, :unit_system, :locale, :scope, :snake_case, :symbolize_keys
|
17
16
|
|
18
17
|
def initialize(opts)
|
19
18
|
missing_args = [:client_id, :client_secret, :redirect_uri] - opts.keys
|
@@ -34,7 +33,8 @@ module Fitbyte
|
|
34
33
|
@scope = format_scope(opts[:scope])
|
35
34
|
|
36
35
|
@api_version = opts[:api_version]
|
37
|
-
@
|
36
|
+
@snake_case = opts[:snake_case]
|
37
|
+
@symbolize_keys = opts[:symbolize_keys]
|
38
38
|
|
39
39
|
@client = OAuth2::Client.new(@client_id, @client_secret, site: @site_url,
|
40
40
|
authorize_url: @authorize_url, token_url: @token_url)
|
@@ -71,21 +71,27 @@ module Fitbyte
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def get(path, opts={})
|
74
|
-
raw = opts[:raw].nil? ? @raw_response : opts[:raw]
|
75
74
|
response = token.get(("#{@api_version}/" + path), headers: request_headers).response
|
76
|
-
MultiJson.load(response.body
|
75
|
+
object = MultiJson.load(response.body) unless response.status == 204
|
76
|
+
process_keys!(object, opts)
|
77
77
|
end
|
78
78
|
|
79
79
|
def post(path, opts={})
|
80
|
-
raw = opts[:raw].nil? ? @raw_response : opts[:raw]
|
81
80
|
response = token.post(("#{@api_version}/" + path), body: opts, headers: request_headers).response
|
82
|
-
MultiJson.load(response.body
|
81
|
+
object = MultiJson.load(response.body) unless response.status == 204
|
82
|
+
process_keys!(object, opts)
|
83
83
|
end
|
84
84
|
|
85
85
|
def delete(path, opts={})
|
86
|
-
raw = opts[:raw].nil? ? @raw_response : opts[:raw]
|
87
86
|
response = token.delete(("#{@api_version}/" + path), headers: request_headers).response
|
88
|
-
MultiJson.load(response.body
|
87
|
+
object = MultiJson.load(response.body) unless response.status == 204
|
88
|
+
process_keys!(object, opts)
|
89
|
+
end
|
90
|
+
|
91
|
+
def process_keys!(object, opts={})
|
92
|
+
deep_keys_to_snake_case!(object) if (opts[:snake_case] || snake_case)
|
93
|
+
deep_symbolize_keys!(object) if (opts[:symbolize_keys] || symbolize_keys)
|
94
|
+
return object
|
89
95
|
end
|
90
96
|
|
91
97
|
def defaults
|
@@ -97,7 +103,8 @@ module Fitbyte
|
|
97
103
|
unit_system: "en_US",
|
98
104
|
locale: "en_US",
|
99
105
|
api_version: "1",
|
100
|
-
|
106
|
+
snake_case: false,
|
107
|
+
symbolize_keys: false
|
101
108
|
}
|
102
109
|
end
|
103
110
|
end
|
data/lib/fitbyte/helpers.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Fitbyte
|
2
2
|
class Client
|
3
|
+
|
3
4
|
def format_date(date)
|
4
5
|
if [Date, Time, DateTime].include?(date.class)
|
5
6
|
date.strftime("%Y-%m-%d")
|
@@ -17,5 +18,39 @@ module Fitbyte
|
|
17
18
|
def format_scope(scope)
|
18
19
|
scope.is_a?(Array) ? scope.join(" ") : scope
|
19
20
|
end
|
21
|
+
|
22
|
+
# Borrowing from Rails
|
23
|
+
|
24
|
+
def deep_keys_to_snake_case!(object)
|
25
|
+
deep_transform_keys!(object) { |key| to_snake_case(key) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def deep_symbolize_keys!(object)
|
29
|
+
deep_transform_keys!(object) { |key| key.to_sym rescue key }
|
30
|
+
end
|
31
|
+
|
32
|
+
def deep_transform_keys!(object, &block)
|
33
|
+
case object
|
34
|
+
when Hash
|
35
|
+
object.keys.each do |key|
|
36
|
+
value = object.delete(key)
|
37
|
+
object[yield(key)] = deep_transform_keys!(value) { |key| yield(key) }
|
38
|
+
end
|
39
|
+
object
|
40
|
+
when Array
|
41
|
+
object.map! { |e| deep_transform_keys!(e) { |key| yield(key) } }
|
42
|
+
else
|
43
|
+
object
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_snake_case(word)
|
48
|
+
word = word.to_s.dup
|
49
|
+
return word.downcase if word.match(/\A[A-Z]+\z/)
|
50
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
51
|
+
word.gsub!(/([a-z])([A-Z])/, '\1_\2')
|
52
|
+
word.downcase
|
53
|
+
end
|
54
|
+
|
20
55
|
end
|
21
56
|
end
|
data/lib/fitbyte/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fitbyte
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zoran Pesic
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth2
|
@@ -90,7 +90,6 @@ files:
|
|
90
90
|
- lib/fitbyte/body.rb
|
91
91
|
- lib/fitbyte/client.rb
|
92
92
|
- lib/fitbyte/devices.rb
|
93
|
-
- lib/fitbyte/fitstruct.rb
|
94
93
|
- lib/fitbyte/food.rb
|
95
94
|
- lib/fitbyte/friends.rb
|
96
95
|
- lib/fitbyte/goals.rb
|
@@ -119,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
118
|
version: '0'
|
120
119
|
requirements: []
|
121
120
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
121
|
+
rubygems_version: 2.5.1
|
123
122
|
signing_key:
|
124
123
|
specification_version: 4
|
125
124
|
summary: This gem allows interaction with Fitbit's REST API.
|
data/lib/fitbyte/fitstruct.rb
DELETED