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.
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