activite 0.1.0 → 0.2.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/README.md +3 -7
- data/lib/activite/client.rb +56 -3
- data/lib/activite/http/oauth.rb +4 -3
- data/lib/activite/http/request.rb +33 -7
- data/lib/activite/notification.rb +4 -0
- data/lib/activite/response.rb +13 -0
- data/lib/activite/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5acc9c4ef6a8ab53a295b64452a46565c9dddf15
|
4
|
+
data.tar.gz: 46be771ce03ba475e7a051f2264da1a058f2b5ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bc688ecea0f2ec2c218898516d64b45a7827ea7ac796d2494f41b73b35e24dac8819652e7543f847e4a8dd8a16f118e0f481bbc4cd0d8dbba1d71f6445a9356
|
7
|
+
data.tar.gz: a1b991504b8afb86f74aee85d107bca4e6ecc4c82eb8727f5678464f14b540e3ac47a7bec0ff98ae8c4ec69af3ae7395f39794c408bf7783f77350bcd897c195
|
data/README.md
CHANGED
@@ -4,20 +4,16 @@
|
|
4
4
|
[][codeclimate]
|
5
5
|
[][coverage]
|
6
6
|
[][gemnasium]
|
7
|
+
[][gemversion]
|
7
8
|
|
8
9
|
This gem provides access to data collected by [Withings](http://withings.com/) devices through
|
9
10
|
their [HTTP API](https://oauth.withings.com/api/doc).
|
10
11
|
|
11
|
-
NOTE: This gem is a work in progress. It is not yet available via RubyGems.
|
12
|
-
|
13
12
|
[travis]: https://travis-ci.org/paulosman/activite
|
14
13
|
[codeclimate]: https://codeclimate.com/github/paulosman/activite
|
15
14
|
[coverage]: https://codeclimate.com/github/paulosman/activite
|
16
15
|
[gemnasium]: https://gemnasium.com/paulosman/activite
|
17
|
-
|
18
|
-
### TODO
|
19
|
-
|
20
|
-
* Notifications
|
16
|
+
[gemversion]: https://badge.fury.io/rb/activite
|
21
17
|
|
22
18
|
## Installation
|
23
19
|
|
@@ -133,7 +129,7 @@ sleep_details = client.sleep_series(user_id, {
|
|
133
129
|
|
134
130
|
## Development
|
135
131
|
|
136
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
132
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
137
133
|
|
138
134
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
139
135
|
|
data/lib/activite/client.rb
CHANGED
@@ -2,15 +2,17 @@ require 'activite/error'
|
|
2
2
|
require 'activite/http/request'
|
3
3
|
require 'activite/activity'
|
4
4
|
require 'activite/measurement_group'
|
5
|
+
require 'activite/notification'
|
5
6
|
require 'activite/sleep_series'
|
6
7
|
require 'activite/sleep_summary'
|
8
|
+
require 'activite/response'
|
7
9
|
|
8
10
|
module Activite
|
9
11
|
class Client
|
10
12
|
include Activite::HTTP::OAuthClient
|
11
13
|
|
12
14
|
attr_writer :user_agent
|
13
|
-
|
15
|
+
|
14
16
|
# Initializes a new Client object used to communicate with the Withings API.
|
15
17
|
#
|
16
18
|
# An authenticated Client can be created with an access token and access token
|
@@ -109,7 +111,7 @@ module Activite
|
|
109
111
|
#
|
110
112
|
# NOTE: user_id isn't actually used in this API call (so I assume it is
|
111
113
|
# derived from the OAuth credentials) but I was uncomfortable introducing
|
112
|
-
# this
|
114
|
+
# this inconsistency into this gem.
|
113
115
|
#
|
114
116
|
# @param user_id [Intger]
|
115
117
|
# @param options [Hash]
|
@@ -121,6 +123,55 @@ module Activite
|
|
121
123
|
}.merge(options))
|
122
124
|
end
|
123
125
|
|
126
|
+
# Register a webhook / notification with the Withings API. This allows
|
127
|
+
# you to be notified when new data is available for a user.
|
128
|
+
#
|
129
|
+
# @param user_id [Integer]
|
130
|
+
# @param options [Hash]
|
131
|
+
#
|
132
|
+
# @return [Activite::Response]
|
133
|
+
def create_notification(user_id, options = {})
|
134
|
+
perform_request(:post, '/notify', Activite::Response, nil, {
|
135
|
+
action: 'subscribe'
|
136
|
+
}.merge(options))
|
137
|
+
end
|
138
|
+
|
139
|
+
# Get information about a specific webhook / notification.
|
140
|
+
#
|
141
|
+
# @param user_id [Integer]
|
142
|
+
# @param options [Hash]
|
143
|
+
#
|
144
|
+
# @return [Activite::Notification]
|
145
|
+
def get_notification(user_id, options = {})
|
146
|
+
perform_request(:get, '/notify', Activite::Notification, nil, {
|
147
|
+
action: 'get'
|
148
|
+
}.merge(options))
|
149
|
+
end
|
150
|
+
|
151
|
+
# Return a list of registered webhooks / notifications.
|
152
|
+
#
|
153
|
+
# @param user_id [Integer]
|
154
|
+
# @param options [Hash]
|
155
|
+
#
|
156
|
+
# @return [Array<Activite::Notification>]
|
157
|
+
def list_notifications(user_id, options = {})
|
158
|
+
perform_request(:get, '/notify', Activite::Notification, 'profiles', {
|
159
|
+
action: 'list'
|
160
|
+
}.merge(options))
|
161
|
+
end
|
162
|
+
|
163
|
+
# Revoke previously subscribed webhook / notification.
|
164
|
+
#
|
165
|
+
# @param user_id [Integer]
|
166
|
+
# @param options [Hash]
|
167
|
+
#
|
168
|
+
# @return [Activite::Response]
|
169
|
+
def revoke_notification(user_id, options = {})
|
170
|
+
perform_request(:get, '/notify', Activite::Response, nil, {
|
171
|
+
action: 'revoke'
|
172
|
+
}.merge(options))
|
173
|
+
end
|
174
|
+
|
124
175
|
private
|
125
176
|
|
126
177
|
# Helper function that handles all API requests
|
@@ -139,7 +190,9 @@ module Activite
|
|
139
190
|
options = Activite::Utils.normalize_date_params(options)
|
140
191
|
request = Activite::HTTP::Request.new(@access_token, { 'User-Agent' => user_agent })
|
141
192
|
response = request.send(http_method, path, options)
|
142
|
-
if
|
193
|
+
if key.nil?
|
194
|
+
klass.new(response)
|
195
|
+
elsif response.has_key? key
|
143
196
|
response[key].collect do |element|
|
144
197
|
klass.new(element)
|
145
198
|
end
|
data/lib/activite/http/oauth.rb
CHANGED
@@ -4,6 +4,7 @@ module Activite
|
|
4
4
|
module HTTP
|
5
5
|
module OAuthClient
|
6
6
|
attr_accessor :consumer_key, :consumer_secret, :token, :secret
|
7
|
+
attr_writer :consumer
|
7
8
|
|
8
9
|
DEFAULT_OPTIONS = {
|
9
10
|
site: 'https://oauth.withings.com',
|
@@ -13,7 +14,7 @@ module Activite
|
|
13
14
|
access_token_path: '/account/access_token',
|
14
15
|
scheme: :query_string
|
15
16
|
}
|
16
|
-
|
17
|
+
|
17
18
|
def request_token(options = {})
|
18
19
|
consumer.get_request_token(options)
|
19
20
|
end
|
@@ -34,13 +35,13 @@ module Activite
|
|
34
35
|
def existing_access_token(token, secret)
|
35
36
|
OAuth::AccessToken.new(consumer, token, secret)
|
36
37
|
end
|
37
|
-
|
38
|
+
|
38
39
|
def connected?
|
39
40
|
!@access_token.nil?
|
40
41
|
end
|
41
42
|
|
42
43
|
private
|
43
|
-
|
44
|
+
|
44
45
|
def consumer
|
45
46
|
@consumer ||= OAuth::Consumer.new(@consumer_key, @consumer_secret, DEFAULT_OPTIONS)
|
46
47
|
end
|
@@ -13,22 +13,48 @@ module Activite
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def get(path, options = {})
|
16
|
+
request(:get, path, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def post(path, options = {})
|
20
|
+
request(:post, path, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def hash_to_query(hash)
|
26
|
+
return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
|
27
|
+
end
|
28
|
+
|
29
|
+
def request_with_body(method, path, options = {})
|
30
|
+
body = hash_to_query(options)
|
31
|
+
uri = "#{BASE_URI}#{path}"
|
32
|
+
@access_token.send(method, uri, body, @headers)
|
33
|
+
end
|
34
|
+
|
35
|
+
def request_with_query_string(method, path, options = {})
|
16
36
|
uri = "#{BASE_URI}#{path}?#{hash_to_query(options)}"
|
17
|
-
|
37
|
+
@access_token.send(method, uri, @headers)
|
38
|
+
end
|
39
|
+
|
40
|
+
def request(method, path, options = {})
|
41
|
+
if [:post, :put].include? method
|
42
|
+
response = request_with_body(method, path, options)
|
43
|
+
else
|
44
|
+
response = request_with_query_string(method, path, options)
|
45
|
+
end
|
46
|
+
|
18
47
|
if response.code.to_i < 200 or response.code.to_i >= 400
|
19
48
|
raise Activite::Error::ClientConfigurationError, response.body
|
20
49
|
end
|
50
|
+
|
21
51
|
body = JSON.parse(response.body)
|
22
52
|
if body['status'].to_i != 0
|
23
53
|
raise Activite::Error::InvalidResponseError, "#{body['status']} - #{body['error']}"
|
24
54
|
end
|
25
|
-
body['body']
|
26
|
-
end
|
27
|
-
|
28
|
-
protected
|
29
55
|
|
30
|
-
|
31
|
-
|
56
|
+
body['body'] ||= body
|
57
|
+
body['body']
|
32
58
|
end
|
33
59
|
end
|
34
60
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Activite
|
2
|
+
|
3
|
+
# A Response is used to represent an empty API response with a status
|
4
|
+
# code and no additional information.
|
5
|
+
class Response
|
6
|
+
# @return [Integer]
|
7
|
+
attr_reader :status
|
8
|
+
|
9
|
+
def initialize(attrs = {})
|
10
|
+
@status = attrs['status'].to_i if attrs.has_key? 'status'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/activite/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Osman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth
|
@@ -93,6 +93,8 @@ files:
|
|
93
93
|
- lib/activite/http/request.rb
|
94
94
|
- lib/activite/measurement_group.rb
|
95
95
|
- lib/activite/measures.rb
|
96
|
+
- lib/activite/notification.rb
|
97
|
+
- lib/activite/response.rb
|
96
98
|
- lib/activite/sleep_series.rb
|
97
99
|
- lib/activite/sleep_summary.rb
|
98
100
|
- lib/activite/utils.rb
|