jawbone 0.3.0 → 0.4
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.
- data/README.md +45 -0
- data/lib/client.rb +44 -121
- metadata +17 -46
data/README.md
CHANGED
@@ -1,6 +1,51 @@
|
|
1
1
|
Ruby wrapper for the [Jawbone UP API](https://jawbone.com/up/developer/).
|
2
2
|
|
3
|
+
Install with
|
4
|
+
|
5
|
+
gem install jawbone
|
6
|
+
|
3
7
|
Once you've set up your app and have a token for your user:
|
4
8
|
|
5
9
|
client = Jawbone::Client.new "your_token"
|
6
10
|
|
11
|
+
Then you can do things like:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
> client.user
|
15
|
+
=> {
|
16
|
+
"meta" => {
|
17
|
+
"user_xid" => "bacseY7NGC0",
|
18
|
+
"message" => "OK",
|
19
|
+
"code" => 200,
|
20
|
+
"time" => 1379626539
|
21
|
+
},
|
22
|
+
"data" => {
|
23
|
+
"xid" => "jd7m17NGC0",
|
24
|
+
"image" => "",
|
25
|
+
"last" => "Brett",
|
26
|
+
"first" => "Andy"
|
27
|
+
}
|
28
|
+
}
|
29
|
+
```
|
30
|
+
|
31
|
+
There are three instance methods on `client` directly related to the user and nothing else: `user`, `friends`, and `trends`.
|
32
|
+
|
33
|
+
In addition, Jawbone makes the following object types available:
|
34
|
+
|
35
|
+
`"move", "body_event", "workout", "sleep", "meal", "cardiac_event", "generic_event", "mood"`
|
36
|
+
|
37
|
+
This gem takes each of those types and provides methods for:
|
38
|
+
|
39
|
+
- getting all of the objects, e.g `client.workouts`
|
40
|
+
- getting a single object, e.g. `client.workout("xid")` where the xid is the xid returned by `client.workouts`.
|
41
|
+
- getting a graph for that object, e.g. `client.workout_graph("xid")`
|
42
|
+
- getting a detailed report on that object, e.g. `client.workout_intensity("xid")`
|
43
|
+
- creating a new object, e.g. `client.create_workout(params)`
|
44
|
+
|
45
|
+
Jawbone does not necessarily support all of these methods on all objects. For example, there's no endpoint to create a new "move" object. Calling these methods will return an error message.
|
46
|
+
|
47
|
+
See [https://jawbone.com/up/developer/endpoints](https://jawbone.com/up/developer/endpoints) for the full documentation.
|
48
|
+
|
49
|
+
By default, an application only gets `basic_read` permission from Jawbone. You have to specify additional scopes when you send the user to Jawbone to grant your app permissions to read their account.
|
50
|
+
|
51
|
+
I've also got an [omniauth strategy for Jawbone](https://github.com/andrewpbrett/omniauth-jawbone) right here, special price for special friends of Rick.
|
data/lib/client.rb
CHANGED
@@ -7,6 +7,7 @@ module Jawbone
|
|
7
7
|
attr_accessor :token
|
8
8
|
|
9
9
|
API_VERSION = "1.0"
|
10
|
+
BASE_URL = "https://jawbone.com/nudge/api/v.1.0"
|
10
11
|
|
11
12
|
include HTTParty
|
12
13
|
|
@@ -15,145 +16,67 @@ module Jawbone
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def user
|
18
|
-
|
19
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
20
|
-
response.parsed_response
|
19
|
+
get_helper("users/@me", {})
|
21
20
|
end
|
22
21
|
|
23
22
|
def friends
|
24
|
-
|
25
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
26
|
-
response.parsed_response
|
23
|
+
get_helper("users/@me/friends", {})
|
27
24
|
end
|
28
25
|
|
29
|
-
def trends
|
30
|
-
|
31
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
32
|
-
response.parsed_response
|
26
|
+
def trends(params={})
|
27
|
+
get_helper("users/@me/trends", params)
|
33
28
|
end
|
34
29
|
|
35
|
-
|
36
|
-
|
37
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
38
|
-
response.parsed_response
|
39
|
-
end
|
30
|
+
base_strings = ["move", "body_event", "workout", "sleep", "meal",
|
31
|
+
"cardiac_event", "generic_event", "mood"]
|
40
32
|
|
41
|
-
|
42
|
-
|
43
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
44
|
-
response.parsed_response
|
45
|
-
end
|
33
|
+
base_strings.each do |base|
|
34
|
+
plural = base + "s"
|
46
35
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
36
|
+
define_method plural do |*args|
|
37
|
+
get_helper("users/@me/#{plural}", args.first || {})
|
38
|
+
end
|
39
|
+
|
40
|
+
define_method base do |id|
|
41
|
+
get_helper("#{plural}/#{id}", {})
|
42
|
+
end
|
52
43
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
response.parsed_response
|
57
|
-
end
|
44
|
+
define_method "#{base}_graph" do |id|
|
45
|
+
get_helper("#{plural}/#{id}/image", {})
|
46
|
+
end
|
58
47
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
response.parsed_response
|
63
|
-
end
|
64
|
-
|
65
|
-
def workout(workout_id)
|
66
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/workouts/#{workout_id}",
|
67
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
68
|
-
response.parsed_response
|
69
|
-
end
|
70
|
-
|
71
|
-
def workout_graph(workout_id)
|
72
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/workouts/#{workout_id}/image",
|
73
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
74
|
-
response.parsed_response
|
75
|
-
end
|
48
|
+
define_method "#{base}_intensity" do |id|
|
49
|
+
get_helper("#{plural}/#{id}/snapshot", {})
|
50
|
+
end
|
76
51
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
52
|
+
define_method "create_#{base}" do |params|
|
53
|
+
post_plural = base == "mood" ? base : plural
|
54
|
+
post_helper("users/@me/#{post_plural}", params)
|
55
|
+
end
|
81
56
|
end
|
82
57
|
|
83
|
-
|
84
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/sleeps",
|
85
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
86
|
-
response.parsed_response
|
87
|
-
end
|
88
|
-
|
89
|
-
def sleep(sleep_id)
|
90
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/sleeps/#{sleep_id}",
|
91
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
92
|
-
response.parsed_response
|
93
|
-
end
|
58
|
+
private
|
94
59
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
response.
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
response.parsed_response
|
105
|
-
end
|
106
|
-
|
107
|
-
def meals
|
108
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/meals",
|
109
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
110
|
-
response.parsed_response
|
111
|
-
end
|
112
|
-
|
113
|
-
def meal(meal_id)
|
114
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/meals/#{meal_id}",
|
115
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
116
|
-
response.parsed_response
|
117
|
-
end
|
118
|
-
|
119
|
-
def body_events
|
120
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/body_events",
|
121
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
122
|
-
response.parsed_response
|
123
|
-
end
|
124
|
-
|
125
|
-
def body_event(event_id)
|
126
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/body_event/#{event_id}",
|
127
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
128
|
-
response.parsed_response
|
129
|
-
end
|
130
|
-
|
131
|
-
def cardiac_events
|
132
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/cardiac_events",
|
133
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
134
|
-
response.parsed_response
|
135
|
-
end
|
136
|
-
|
137
|
-
def cardiac_event(event_id)
|
138
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/cardiac_event/#{event_id}",
|
139
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
140
|
-
response.parsed_response
|
141
|
-
end
|
142
|
-
|
143
|
-
def generic_events
|
144
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/generic_events",
|
145
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
146
|
-
response.parsed_response
|
147
|
-
end
|
148
|
-
|
149
|
-
def mood
|
150
|
-
response = self.class.get "https://jawbone.com/nudge/api/users/@me/mood",
|
151
|
-
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
60
|
+
def post_helper(path, params)
|
61
|
+
path = "/" + path unless path[0] == '/'
|
62
|
+
url = BASE_URL + path
|
63
|
+
response = self.class.post url,
|
64
|
+
{ :headers =>
|
65
|
+
{ "Authorization" => "Bearer #{token}",
|
66
|
+
"Content-Type" => "application/x-www-form-urlencoded" },
|
67
|
+
:body => params
|
68
|
+
}
|
152
69
|
response.parsed_response
|
153
70
|
end
|
154
71
|
|
155
|
-
def
|
156
|
-
|
72
|
+
def get_helper(path, params={})
|
73
|
+
path = "/" + path unless path[0] == '/'
|
74
|
+
url = BASE_URL + path
|
75
|
+
stringified_params = params.collect do |k, v|
|
76
|
+
"#{k}=#{v}"
|
77
|
+
end.sort * '&'
|
78
|
+
full_url = url + "?" + stringified_params
|
79
|
+
response = self.class.get full_url,
|
157
80
|
{ :headers => { "Authorization" => "Bearer #{token}" } }
|
158
81
|
response.parsed_response
|
159
82
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jawbone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70253008260940 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.11.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.11.0
|
24
|
+
version_requirements: *70253008260940
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: json
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &70253008260520 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ! '>='
|
@@ -37,15 +32,10 @@ dependencies:
|
|
37
32
|
version: '0'
|
38
33
|
type: :development
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
35
|
+
version_requirements: *70253008260520
|
46
36
|
- !ruby/object:Gem::Dependency
|
47
37
|
name: rake
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirement: &70252999457480 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
40
|
requirements:
|
51
41
|
- - ! '>='
|
@@ -53,15 +43,10 @@ dependencies:
|
|
53
43
|
version: '0'
|
54
44
|
type: :development
|
55
45
|
prerelease: false
|
56
|
-
version_requirements:
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
46
|
+
version_requirements: *70252999457480
|
62
47
|
- !ruby/object:Gem::Dependency
|
63
48
|
name: rspec
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirement: &70252999457040 !ruby/object:Gem::Requirement
|
65
50
|
none: false
|
66
51
|
requirements:
|
67
52
|
- - ! '>='
|
@@ -69,15 +54,10 @@ dependencies:
|
|
69
54
|
version: '0'
|
70
55
|
type: :development
|
71
56
|
prerelease: false
|
72
|
-
version_requirements:
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ! '>='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
57
|
+
version_requirements: *70252999457040
|
78
58
|
- !ruby/object:Gem::Dependency
|
79
59
|
name: simplecov
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirement: &70252999456520 !ruby/object:Gem::Requirement
|
81
61
|
none: false
|
82
62
|
requirements:
|
83
63
|
- - ! '>='
|
@@ -85,15 +65,10 @@ dependencies:
|
|
85
65
|
version: '0'
|
86
66
|
type: :development
|
87
67
|
prerelease: false
|
88
|
-
version_requirements:
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
68
|
+
version_requirements: *70252999456520
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: yard
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirement: &70252999455980 !ruby/object:Gem::Requirement
|
97
72
|
none: false
|
98
73
|
requirements:
|
99
74
|
- - ! '>='
|
@@ -101,12 +76,7 @@ dependencies:
|
|
101
76
|
version: '0'
|
102
77
|
type: :development
|
103
78
|
prerelease: false
|
104
|
-
version_requirements:
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
79
|
+
version_requirements: *70252999455980
|
110
80
|
description: A Ruby wrapper for the Jawbone UP API.
|
111
81
|
email:
|
112
82
|
- andy@andybrett.com
|
@@ -121,7 +91,8 @@ files:
|
|
121
91
|
- lib/jawbone.rb
|
122
92
|
- lib/version.rb
|
123
93
|
homepage: https://github.com/andrewpbrett/jawbone-up-api
|
124
|
-
licenses:
|
94
|
+
licenses:
|
95
|
+
- MIT
|
125
96
|
post_install_message:
|
126
97
|
rdoc_options: []
|
127
98
|
require_paths:
|
@@ -140,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
111
|
version: '0'
|
141
112
|
requirements: []
|
142
113
|
rubyforge_project:
|
143
|
-
rubygems_version: 1.8.
|
114
|
+
rubygems_version: 1.8.13
|
144
115
|
signing_key:
|
145
116
|
specification_version: 3
|
146
117
|
summary: Jawbone UP API wrapper
|