activite 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Code Climate](https://codeclimate.com/github/paulosman/activite/badges/gpa.svg)][codeclimate]
|
5
5
|
[![Test Coverage](https://codeclimate.com/github/paulosman/activite/badges/coverage.svg)][coverage]
|
6
6
|
[![Dependency Status](https://gemnasium.com/paulosman/activite.svg)][gemnasium]
|
7
|
+
[![Gem Version](https://badge.fury.io/rb/activite.svg)][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
|