jawbone 0.3.0 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.md +45 -0
  2. data/lib/client.rb +44 -121
  3. 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.
@@ -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
- response = self.class.get "https://jawbone.com/nudge/api/users/@me",
19
- { :headers => { "Authorization" => "Bearer #{token}" } }
20
- response.parsed_response
19
+ get_helper("users/@me", {})
21
20
  end
22
21
 
23
22
  def friends
24
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/friends",
25
- { :headers => { "Authorization" => "Bearer #{token}" } }
26
- response.parsed_response
23
+ get_helper("users/@me/friends", {})
27
24
  end
28
25
 
29
- def trends
30
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/trends",
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
- def moves
36
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/moves",
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
- def move(move_id)
42
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/moves/#{move_id}",
43
- { :headers => { "Authorization" => "Bearer #{token}" } }
44
- response.parsed_response
45
- end
33
+ base_strings.each do |base|
34
+ plural = base + "s"
46
35
 
47
- def move_graph(move_id)
48
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/moves/#{move_id}/image",
49
- { :headers => { "Authorization" => "Bearer #{token}" } }
50
- response.parsed_response
51
- end
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
- def move_intensity(move_id)
54
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/moves/#{move_id}/snapshot",
55
- { :headers => { "Authorization" => "Bearer #{token}" } }
56
- response.parsed_response
57
- end
44
+ define_method "#{base}_graph" do |id|
45
+ get_helper("#{plural}/#{id}/image", {})
46
+ end
58
47
 
59
- def workouts
60
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/workouts",
61
- { :headers => { "Authorization" => "Bearer #{token}" } }
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
- def workout_intensity(workout_id)
78
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/workouts/#{workout_id}/snapshot",
79
- { :headers => { "Authorization" => "Bearer #{token}" } }
80
- response.parsed_response
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
- def sleeps
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 sleep_graph(sleep_id)
96
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/sleeps/#{sleep_id}/image",
97
- { :headers => { "Authorization" => "Bearer #{token}" } }
98
- response.parsed_response
99
- end
100
-
101
- def sleep_intensity(sleep_id)
102
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/sleeps/#{sleep_id}/snapshot",
103
- { :headers => { "Authorization" => "Bearer #{token}" } }
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 mood_event(event_id)
156
- response = self.class.get "https://jawbone.com/nudge/api/users/@me/mood/#{event_id}",
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.3.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-09-19 00:00:00.000000000 Z
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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.25
114
+ rubygems_version: 1.8.13
144
115
  signing_key:
145
116
  specification_version: 3
146
117
  summary: Jawbone UP API wrapper