adafruit-io 1.0.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 +7 -0
- data/LICENSE.md +23 -0
- data/README.md +369 -0
- data/Rakefile +7 -0
- data/adafruit-io.gemspec +31 -0
- data/lib/adafruit/io.rb +8 -0
- data/lib/adafruit/io/client.rb +78 -0
- data/lib/adafruit/io/client/data.rb +73 -0
- data/lib/adafruit/io/client/feed.rb +56 -0
- data/lib/adafruit/io/client/group.rb +87 -0
- data/lib/adafruit/io/client/io_object.rb +81 -0
- data/lib/adafruit/io/client/request_handler.rb +40 -0
- data/lib/adafruit/io/version.rb +5 -0
- metadata +154 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 469f5de81e902750a65842ebf58cd54abff10d84
|
4
|
+
data.tar.gz: 583ef3d58e09935d0dc5b483d91117fca57828d8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1ae802cec298e079d95c1c7686dd897ec218cb8424bd70563dcbeeb862f340337733028fef6bc85e66c085c138175656a59756138fdf42b2e4a29d28f87c6daf
|
7
|
+
data.tar.gz: b8bd127e38339b74a6929d9c827a1569fcb1e8a9afa60f2c147a425ad7c3e97ddefc8cb8e969432292d8f4571ad7c8023336aa096f18b3f04e80ba3b892d4acb
|
data/LICENSE.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Copyright (c) 2014 Adafruit
|
2
|
+
Author: Justin Cooper
|
3
|
+
|
4
|
+
MIT License
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
"Software"), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be
|
15
|
+
included in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,369 @@
|
|
1
|
+
# adafruit-io
|
2
|
+
|
3
|
+
A [Ruby][1] client for use with with [io.adafruit.com][2].
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'adafruit-io'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install adafruit-io
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Each time you use the library, you'll want to pass your [AIO Key][4] to the client.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
|
25
|
+
require 'adafruit/io'
|
26
|
+
|
27
|
+
# create an instance
|
28
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
29
|
+
|
30
|
+
```
|
31
|
+
|
32
|
+
## Table of Contents
|
33
|
+
|
34
|
+
* [Feeds](#feeds)
|
35
|
+
* [Create](#feed-creation)
|
36
|
+
* [Read](#feed-retrieval)
|
37
|
+
* [Update](#feed-updating)
|
38
|
+
* [Delete](#feed-deletion)
|
39
|
+
* [Data](#data)
|
40
|
+
* [Create](#data-creation)
|
41
|
+
* [Read](#data-retrieval)
|
42
|
+
* [Update](#data-updating)
|
43
|
+
* [Delete](#data-deletion)
|
44
|
+
* [Helper Methods](#helper-methods)
|
45
|
+
* [Send](#send)
|
46
|
+
* [Next](#next)
|
47
|
+
* [Last](#last)
|
48
|
+
* [Previous](#previous)
|
49
|
+
* [Readable](#readable-data)
|
50
|
+
* [Writable](#writable-data)
|
51
|
+
* [Groups](#groups)
|
52
|
+
* [Create](#group-creation)
|
53
|
+
* [Read](#group-retrieval)
|
54
|
+
* [Update](#group-updating)
|
55
|
+
* [Delete](#group-deletion)
|
56
|
+
|
57
|
+
### Feeds
|
58
|
+
|
59
|
+
Feeds are the core of the Adafruit IO system. The feed holds metadata about data that gets pushed, and you will
|
60
|
+
have one feed for each type of data you send to the system. You can have separate feeds for each
|
61
|
+
sensor in a project, or you can use one feed to contain JSON encoded data for all of your sensors.
|
62
|
+
|
63
|
+
#### Feed Creation
|
64
|
+
|
65
|
+
You have two options here, you can create a feed by passing a feed name, or you can pass an object if you would
|
66
|
+
like to define more properties. If you would like to find information about what properties are available, please
|
67
|
+
visit the [Adafruit IO feed API docs][3].
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
require 'adafruit/io'
|
71
|
+
|
72
|
+
# create an instance
|
73
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
74
|
+
|
75
|
+
puts aio.feeds.create({:name => "Temperature"})
|
76
|
+
```
|
77
|
+
|
78
|
+
#### Feed Retrieval
|
79
|
+
|
80
|
+
You can get a list of your feeds by using the `aio.feeds.retrieve` method.
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
require 'adafruit/io'
|
84
|
+
|
85
|
+
# create an instance
|
86
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
87
|
+
|
88
|
+
#get all feeds
|
89
|
+
puts aio.feeds.retrieve
|
90
|
+
```
|
91
|
+
|
92
|
+
You can also get a specific feed by ID, key, or name by using the `aio.feeds.retrieve(id)` method.
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
require 'adafruit/io'
|
96
|
+
|
97
|
+
# create an instance
|
98
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
99
|
+
|
100
|
+
#get a single feed
|
101
|
+
feed = aio.feeds.retrieve("Temperature")
|
102
|
+
puts feed.name
|
103
|
+
puts feed.last_value
|
104
|
+
```
|
105
|
+
#### Feed Updating
|
106
|
+
|
107
|
+
You can update [feed properties][3] by retrieving a feed, and subsequently calling the save method.
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
require 'adafruit/io'
|
111
|
+
|
112
|
+
# create an instance
|
113
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
114
|
+
|
115
|
+
#get the feed
|
116
|
+
feed = aio.feeds.retrieve("Temperature")
|
117
|
+
feed.name = "adsfsdff"
|
118
|
+
feed.description = "hey hey"
|
119
|
+
feed.save
|
120
|
+
```
|
121
|
+
#### Feed Deletion
|
122
|
+
|
123
|
+
You can delete a feed by ID, key, or name by retrieving a feed, and subsequently calling the delete method.
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
require 'adafruit/io'
|
127
|
+
|
128
|
+
# create an instance
|
129
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
130
|
+
|
131
|
+
feed = aio.feeds.retrieve("Temperature")
|
132
|
+
puts feed.delete
|
133
|
+
```
|
134
|
+
|
135
|
+
### Data
|
136
|
+
|
137
|
+
Data represents the data contained in feeds. You can read, add, modify, and delete data. There are also
|
138
|
+
a few convienient methods for sending data to feeds and selecting certain pieces of data.
|
139
|
+
|
140
|
+
#### Data Creation
|
141
|
+
|
142
|
+
Data can be created [after you create a feed](#data-creation), by using the
|
143
|
+
`aio.feeds(id).data.create(value)` method.
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
require 'adafruit/io'
|
147
|
+
|
148
|
+
# create an instance
|
149
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
150
|
+
|
151
|
+
data = aio.feeds("Temperature").data.create({:value => 11})
|
152
|
+
puts data.inspect
|
153
|
+
```
|
154
|
+
|
155
|
+
#### Data Retrieval
|
156
|
+
|
157
|
+
You can get all of the data data by using the `aio.feeds(187).data.retrieve` method. The
|
158
|
+
callback will be called with errors and the data array as arguments.
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
require 'adafruit/io'
|
162
|
+
|
163
|
+
# create an instance
|
164
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
165
|
+
|
166
|
+
data = aio.feeds(187).data.retrieve
|
167
|
+
puts data.inspect
|
168
|
+
```
|
169
|
+
|
170
|
+
You can also get a specific value by ID by using the `aio.feeds(id).data.retrieve(id)` method.
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
require 'adafruit/io'
|
174
|
+
|
175
|
+
# create an instance
|
176
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
177
|
+
|
178
|
+
data = aio.feeds(187).data.retrieve(288718)
|
179
|
+
puts data.inspect
|
180
|
+
```
|
181
|
+
|
182
|
+
#### Data Updating
|
183
|
+
|
184
|
+
Values can be updated by retrieving the data, updating the property, and subsequently calling the save method.
|
185
|
+
|
186
|
+
```ruby
|
187
|
+
require 'adafruit/io'
|
188
|
+
|
189
|
+
# create an instance
|
190
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
191
|
+
|
192
|
+
#get the feed
|
193
|
+
data = aio.feeds("Temperature").data.last
|
194
|
+
data.value = "adsfsdff"
|
195
|
+
data.save
|
196
|
+
```
|
197
|
+
|
198
|
+
#### Data Deletion
|
199
|
+
|
200
|
+
Values can be deleted by retrieving the data, and calling the delete method.
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
require 'adafruit/io'
|
204
|
+
|
205
|
+
# create an instance
|
206
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
207
|
+
|
208
|
+
data = aio.feeds(187).data.retrieve(288718)
|
209
|
+
puts data.delete
|
210
|
+
```
|
211
|
+
|
212
|
+
#### Helper Methods
|
213
|
+
|
214
|
+
There are a few helper methods that can make interacting with data a bit easier.
|
215
|
+
|
216
|
+
##### Send
|
217
|
+
|
218
|
+
You can use the `aio.feeds(id).data.send_data(value)` method to find or create the feed based on the name passed,
|
219
|
+
and also save the value passed.
|
220
|
+
|
221
|
+
```ruby
|
222
|
+
require 'adafruit/io'
|
223
|
+
|
224
|
+
# create an instance
|
225
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
226
|
+
|
227
|
+
data = aio.feeds("Test").data.send_data({value: 5})
|
228
|
+
puts data.inspect
|
229
|
+
```
|
230
|
+
|
231
|
+
##### Last
|
232
|
+
|
233
|
+
You can get the last inserted value by using the `aio.feeds(id).data.last` method.
|
234
|
+
|
235
|
+
```ruby
|
236
|
+
require 'adafruit/io'
|
237
|
+
|
238
|
+
# create an instance
|
239
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
240
|
+
|
241
|
+
data = aio.feeds(187).data.last
|
242
|
+
puts data.inspect
|
243
|
+
```
|
244
|
+
|
245
|
+
##### Next
|
246
|
+
|
247
|
+
You can get the first inserted value that has not been processed by using the `aio.feeds(id).data.next` method.
|
248
|
+
|
249
|
+
```ruby
|
250
|
+
require 'adafruit/io'
|
251
|
+
|
252
|
+
# create an instance
|
253
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
254
|
+
|
255
|
+
data = aio.feeds(187).data.next
|
256
|
+
puts data.inspect
|
257
|
+
```
|
258
|
+
|
259
|
+
##### Previous
|
260
|
+
|
261
|
+
You can get the the last record that has been processed by using the `aio.feeds(id).data.previous` method.
|
262
|
+
|
263
|
+
```ruby
|
264
|
+
require 'adafruit/io'
|
265
|
+
|
266
|
+
# create an instance
|
267
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
268
|
+
|
269
|
+
data = aio.feeds(187).data.previous
|
270
|
+
puts data.inspect
|
271
|
+
```
|
272
|
+
|
273
|
+
### Groups
|
274
|
+
|
275
|
+
Groups allow you to update and retrieve multiple feeds with one request. You can add feeds
|
276
|
+
to multiple groups.
|
277
|
+
|
278
|
+
#### Group Creation
|
279
|
+
|
280
|
+
You can create a group by passing an object of group properties. If you would like to find
|
281
|
+
information about what properties are available, please visit the [Adafruit IO group API docs][5].
|
282
|
+
|
283
|
+
```ruby
|
284
|
+
require 'adafruit/io'
|
285
|
+
|
286
|
+
# create an instance
|
287
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
288
|
+
|
289
|
+
puts aio.groups.create({:name => "Greenhouse"})
|
290
|
+
```
|
291
|
+
|
292
|
+
#### Group Retrieval
|
293
|
+
|
294
|
+
You can get a list of your groups by using the `aio.groups.retrieve` method.
|
295
|
+
|
296
|
+
```ruby
|
297
|
+
require 'adafruit/io'
|
298
|
+
|
299
|
+
# create an instance
|
300
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
301
|
+
|
302
|
+
#get all groups
|
303
|
+
#puts aio.groups.retrieve
|
304
|
+
```
|
305
|
+
|
306
|
+
You can also get a specific group by ID, key, or name by using the `aio.groups.retrieve(id)` method.
|
307
|
+
|
308
|
+
```ruby
|
309
|
+
require 'adafruit/io'
|
310
|
+
|
311
|
+
# create an instance
|
312
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
313
|
+
|
314
|
+
#get a single group
|
315
|
+
group = aio.groups.retrieve("First Group")
|
316
|
+
puts group.name
|
317
|
+
puts group.inspect
|
318
|
+
```
|
319
|
+
#### Group Updating
|
320
|
+
|
321
|
+
You can update [group properties][5] by retrieving a group, updating the object, and using the save method.
|
322
|
+
|
323
|
+
```ruby
|
324
|
+
require 'adafruit/io'
|
325
|
+
|
326
|
+
# create an instance
|
327
|
+
aio = Adafruit::IO::Client.new :key => '463c8fc334cfb19318eAIO_KEY_HEREa0a17c01f5b985f77f545'
|
328
|
+
|
329
|
+
#get the group
|
330
|
+
group = aio.groups.retrieve("Greenhouse")
|
331
|
+
group.name = "Gymnasium"
|
332
|
+
group.description = "hey hey"
|
333
|
+
group.save
|
334
|
+
|
335
|
+
group.name = "Greenhouse"
|
336
|
+
group.description = "new description"
|
337
|
+
group.save
|
338
|
+
```
|
339
|
+
|
340
|
+
#### Group Deletion
|
341
|
+
|
342
|
+
You can delete a group by ID, key, or name by retrieving the group, and subsequently calling the delete method.
|
343
|
+
|
344
|
+
```ruby
|
345
|
+
require 'adafruit/io'
|
346
|
+
|
347
|
+
# create an instance
|
348
|
+
aio = Adafruit::IO::Client.new :key => 'AIO_KEY_HERE'
|
349
|
+
|
350
|
+
group = aio.groups.retrieve("Greenhouse")
|
351
|
+
puts group.delete
|
352
|
+
```
|
353
|
+
|
354
|
+
## License
|
355
|
+
Copyright (c) 2014 Adafruit Industries. Licensed under the MIT license.
|
356
|
+
|
357
|
+
## Contributing
|
358
|
+
|
359
|
+
1. Fork it ( http://github.com/adafruit/io-client-ruby/fork )
|
360
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
361
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
362
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
363
|
+
5. Create new Pull Request
|
364
|
+
|
365
|
+
[1]: https://www.ruby-lang.org
|
366
|
+
[2]: https://io.adafruit.com
|
367
|
+
[3]: https://learn.adafruit.com/adafruit-io/feeds
|
368
|
+
[4]: https://learn.adafruit.com/adafruit-io/api-key
|
369
|
+
[5]: https://learn.adafruit.com/adafruit-io/groups
|
data/Rakefile
ADDED
data/adafruit-io.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'adafruit/io/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "adafruit-io"
|
8
|
+
spec.version = Adafruit::IO::VERSION
|
9
|
+
spec.authors = ["Justin Cooper"]
|
10
|
+
spec.email = ["justin@adafruit.com"]
|
11
|
+
spec.summary = %q{Adafruit IO API Client Library}
|
12
|
+
spec.description = %q{API Client Library for the Adafruit IO product}
|
13
|
+
spec.homepage = "https://github.com/adafruit/io-client-ruby"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = %w(LICENSE.md README.md Rakefile adafruit-io.gemspec)
|
17
|
+
spec.files += Dir.glob("lib/**/*.rb")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
spec.licenses = ['MIT']
|
22
|
+
|
23
|
+
spec.add_dependency "faraday", "~> 0.8"
|
24
|
+
spec.add_dependency "faraday_middleware", "~> 0.9"
|
25
|
+
spec.add_dependency "activesupport", "~> 4.2"
|
26
|
+
spec.add_dependency "multi_xml", "~> 0.5"
|
27
|
+
spec.add_dependency "addressable", "~> 2.3"
|
28
|
+
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
30
|
+
spec.add_development_dependency "rake", "~> 10.4"
|
31
|
+
end
|
data/lib/adafruit/io.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
require 'faraday'
|
3
|
+
require 'faraday_middleware'
|
4
|
+
require 'faraday_middleware/response/mashify'
|
5
|
+
require 'json'
|
6
|
+
require 'adafruit/io/client/feed'
|
7
|
+
require 'adafruit/io/client/group'
|
8
|
+
require 'adafruit/io/client/data'
|
9
|
+
require 'adafruit/io/client/request_handler'
|
10
|
+
|
11
|
+
module Adafruit
|
12
|
+
module IO
|
13
|
+
class Client
|
14
|
+
|
15
|
+
include Adafruit::IO::Client::RequestHandler
|
16
|
+
|
17
|
+
def initialize(options)
|
18
|
+
@key = options[:key]
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(url, options = {})
|
22
|
+
request :handle_get, url
|
23
|
+
end
|
24
|
+
|
25
|
+
def post(url, data, options = {})
|
26
|
+
request :handle_post, url, data, options
|
27
|
+
end
|
28
|
+
|
29
|
+
def put(url, data, options = {})
|
30
|
+
request :handle_put, url, data, options
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(url, options = {})
|
34
|
+
request :handle_delete, url
|
35
|
+
end
|
36
|
+
|
37
|
+
def last_response
|
38
|
+
@last_response
|
39
|
+
end
|
40
|
+
|
41
|
+
def feeds(id_or_key = nil)
|
42
|
+
Adafruit::IO::Feed.new(self, id_or_key)
|
43
|
+
end
|
44
|
+
|
45
|
+
def groups(id_or_key = nil)
|
46
|
+
Adafruit::IO::Group.new(self, id_or_key)
|
47
|
+
end
|
48
|
+
|
49
|
+
def data(feed_id_or_key = nil, id_or_key = nil)
|
50
|
+
Adafruit::IO::Data.new(self, feed_id_or_key, id_or_key)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def conn
|
56
|
+
Faraday.new(:url => 'http://localhost:3002') do |c|
|
57
|
+
#connection = Faraday.new(:url => 'https://io.adafruit.com') do |c|
|
58
|
+
c.headers['X-AIO-Key'] = @key
|
59
|
+
c.headers['Accept'] = 'application/json'
|
60
|
+
c.request :json
|
61
|
+
|
62
|
+
c.response :xml, :content_type => /\bxml$/
|
63
|
+
#c.response :mashify, :content_type => /\bjson$/
|
64
|
+
#c.response :json
|
65
|
+
|
66
|
+
c.use :instrumentation
|
67
|
+
c.adapter Faraday.default_adapter
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def request(method, url, data = nil, options = nil)
|
72
|
+
@last_response = response = send(method, url, data)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'adafruit/io/client/io_object'
|
2
|
+
require 'adafruit/io/client/feed'
|
3
|
+
|
4
|
+
module Adafruit
|
5
|
+
module IO
|
6
|
+
class Data < IOObject
|
7
|
+
def initialize(client = nil, feed = nil, id_or_key = nil)
|
8
|
+
@client = client
|
9
|
+
@feed = feed
|
10
|
+
@id_or_key = id_or_key
|
11
|
+
@unsaved_values = Set.new
|
12
|
+
@values = {}
|
13
|
+
@base_url = "feeds/#{@feed.id_or_key}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(options = {})
|
17
|
+
response = @client.post "#{@base_url}/data", options
|
18
|
+
return process_response(response)
|
19
|
+
end
|
20
|
+
|
21
|
+
def retrieve(id_or_key = nil, options = {})
|
22
|
+
if id_or_key
|
23
|
+
@id_or_key = id_or_key
|
24
|
+
response = @client.get "#{@base_url}/data/#{id_or_key}", options
|
25
|
+
else
|
26
|
+
response = @client.get '#{@base_url}/data', options
|
27
|
+
end
|
28
|
+
|
29
|
+
return process_response(response)
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete
|
33
|
+
response = @client.delete "#{@base_url}/data/#{self.id}"
|
34
|
+
if response == 200
|
35
|
+
{"delete" => true, "id" => self.id}
|
36
|
+
else
|
37
|
+
{"delete" => false, "id" => self.id}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def save
|
42
|
+
response = @client.put "#{@base_url}/data/#{self.id}", serialize_params(self)
|
43
|
+
@unsaved_values.clear
|
44
|
+
|
45
|
+
return process_response(response)
|
46
|
+
end
|
47
|
+
|
48
|
+
def send_data(data)
|
49
|
+
response = @client.post "#{@base_url}/data/send", {:value => data}
|
50
|
+
return process_response(response)
|
51
|
+
end
|
52
|
+
|
53
|
+
def receive
|
54
|
+
response = @client.get "#{@base_url}/data/last"
|
55
|
+
return process_response(response)
|
56
|
+
end
|
57
|
+
|
58
|
+
def last
|
59
|
+
receive
|
60
|
+
end
|
61
|
+
|
62
|
+
def next
|
63
|
+
response = @client.get "#{@base_url}/data/next"
|
64
|
+
return process_response(response)
|
65
|
+
end
|
66
|
+
|
67
|
+
def previous(feed_name)
|
68
|
+
response = @client.get "#{@base_url}/data/previous"
|
69
|
+
return process_response(response)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'adafruit/io/client/io_object'
|
2
|
+
require 'adafruit/io/client/data'
|
3
|
+
|
4
|
+
module Adafruit
|
5
|
+
module IO
|
6
|
+
|
7
|
+
class Feed < IOObject
|
8
|
+
attr_accessor :unsaved_values, :id_or_key
|
9
|
+
|
10
|
+
def initialize(client = nil, id_or_key = nil)
|
11
|
+
@client = client
|
12
|
+
@id_or_key = id_or_key
|
13
|
+
@unsaved_values = Set.new
|
14
|
+
@values = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def create(options = {})
|
18
|
+
response = @client.post 'feeds', options
|
19
|
+
return process_response(response)
|
20
|
+
end
|
21
|
+
|
22
|
+
def retrieve(id_or_key = nil, options = {})
|
23
|
+
if id_or_key
|
24
|
+
@id_or_key = id_or_key
|
25
|
+
response = @client.get "feeds/#{id_or_key}", options
|
26
|
+
else
|
27
|
+
response = @client.get 'feeds', options
|
28
|
+
end
|
29
|
+
|
30
|
+
return process_response(response)
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete
|
34
|
+
response = @client.delete "feeds/#{self.id}"
|
35
|
+
if response == 200
|
36
|
+
{"delete" => true, "id" => self.id}
|
37
|
+
else
|
38
|
+
{"delete" => false, "id" => self.id}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def save
|
43
|
+
response = @client.put "feeds/#{self.id}", serialize_params(self)
|
44
|
+
@unsaved_values.clear
|
45
|
+
|
46
|
+
return process_response(response)
|
47
|
+
end
|
48
|
+
|
49
|
+
def data(id_or_key = nil)
|
50
|
+
Adafruit::IO::Data.new(@client, self, id_or_key)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'adafruit/io/client/io_object'
|
2
|
+
|
3
|
+
module Adafruit
|
4
|
+
module IO
|
5
|
+
class Group < IOObject
|
6
|
+
def initialize(client = nil, id_or_key = nil)
|
7
|
+
@client = client
|
8
|
+
@id_or_key = id_or_key
|
9
|
+
@unsaved_values = Set.new
|
10
|
+
@values = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def create(options = {})
|
14
|
+
response = @client.post 'groups', options
|
15
|
+
return process_response(response)
|
16
|
+
end
|
17
|
+
|
18
|
+
def retrieve(id_or_key = nil, options = {})
|
19
|
+
if id_or_key
|
20
|
+
@id_or_key = id_or_key
|
21
|
+
response = @client.get "groups/#{id_or_key}", options
|
22
|
+
else
|
23
|
+
response = @client.get 'groups', options
|
24
|
+
end
|
25
|
+
|
26
|
+
return process_response(response)
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete
|
30
|
+
response = @client.delete "groups/#{self.id}"
|
31
|
+
if response == 200
|
32
|
+
{"delete" => true, "id" => self.id}
|
33
|
+
else
|
34
|
+
{"delete" => false, "id" => self.id}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def save
|
39
|
+
response = @client.put "groups/#{self.id}", serialize_params(self)
|
40
|
+
@unsaved_values.clear
|
41
|
+
|
42
|
+
return process_response(response)
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def send_group(group_name, data)
|
47
|
+
if group_name
|
48
|
+
group_name = URI::escape(group_name)
|
49
|
+
post "groups/#{group_name}/send", {:value => data}
|
50
|
+
else
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def receive_group(group_name)
|
56
|
+
if group_name
|
57
|
+
group_name = URI::escape(group_name)
|
58
|
+
get "groups/#{group_name}/last"
|
59
|
+
else
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def receive_next_group(group_name)
|
65
|
+
if group_name
|
66
|
+
group_name = URI::escape(group_name)
|
67
|
+
get "groups/#{group_name}/next"
|
68
|
+
else
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def groups(feed_id_or_key, output_id=nil, options = {})
|
74
|
+
if input_id
|
75
|
+
get "groups/#{feed_id_or_key}/#{input_id}", options
|
76
|
+
else
|
77
|
+
get "groups/#{feed_id_or_key}", options
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def create_group(feed_id_or_key, options = {})
|
82
|
+
post "groups/#{feed_id_or_key}", options
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'adafruit/io/client'
|
3
|
+
require 'adafruit/io/client/io_object'
|
4
|
+
require 'active_model'
|
5
|
+
require 'active_support/core_ext/object/instance_variables'
|
6
|
+
|
7
|
+
module Adafruit
|
8
|
+
module IO
|
9
|
+
class IOObject
|
10
|
+
|
11
|
+
protected
|
12
|
+
#serialize_params derived from stripe-ruby library, MIT License, Copyright (c) 2011- Stripe, Inc. (https://stripe.com)
|
13
|
+
#https://github.com/stripe/stripe-ruby/blob/9cf5089dc15534b7ed581e0ce4d84fa82f592efb/lib/stripe/api_operations/update.rb#L37
|
14
|
+
def serialize_params(obj)
|
15
|
+
return '' if obj.nil?
|
16
|
+
|
17
|
+
unsaved_keys = obj.instance_variable_get(:@unsaved_values)
|
18
|
+
obj_values = obj.instance_variable_get(:@values)
|
19
|
+
update_hash = {}
|
20
|
+
|
21
|
+
unsaved_keys.each do |k|
|
22
|
+
update_hash[k] = obj_values[k]
|
23
|
+
end
|
24
|
+
|
25
|
+
update_hash
|
26
|
+
end
|
27
|
+
|
28
|
+
def process_response(response)
|
29
|
+
response = JSON.parse(response, :symbolize_names => true)
|
30
|
+
puts response
|
31
|
+
|
32
|
+
if response.is_a?(Array)
|
33
|
+
obj_list = []
|
34
|
+
response.each do |r|
|
35
|
+
if @feed.present?
|
36
|
+
obj_list.push(self.class.new(@client, @feed, @id_or_key).parse(r))
|
37
|
+
else
|
38
|
+
obj_list.push(self.class.new(@client, @id_or_key).parse(r))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
if @feed.present?
|
43
|
+
obj_list = self.class.new(@client, @feed, @id_or_key).parse(response)
|
44
|
+
else
|
45
|
+
obj_list = self.class.new(@client, @id_or_key).parse(response)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
return obj_list
|
50
|
+
end
|
51
|
+
|
52
|
+
def parse(o)
|
53
|
+
o.each do |k, v|
|
54
|
+
singleton_class.class_eval do; attr_accessor_with_changes "#{k}"; end
|
55
|
+
send("#{k}=", v)
|
56
|
+
@unsaved_values.delete(k.to_s)
|
57
|
+
end
|
58
|
+
|
59
|
+
return self
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.attr_accessor_with_changes(attr_name)
|
63
|
+
attr_name = attr_name.to_s
|
64
|
+
|
65
|
+
#getter
|
66
|
+
self.class_eval("def #{attr_name};@#{attr_name};end")
|
67
|
+
|
68
|
+
#setter
|
69
|
+
self.class_eval %Q{
|
70
|
+
def #{attr_name}=(val)
|
71
|
+
key = __callee__.to_s.chomp("=")
|
72
|
+
@unsaved_values.add(key)
|
73
|
+
@values[key] = val
|
74
|
+
@#{attr_name} = val
|
75
|
+
end
|
76
|
+
}
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Adafruit
|
4
|
+
module IO
|
5
|
+
class Client
|
6
|
+
module RequestHandler
|
7
|
+
def handle_get(url, data = nil, options = {})
|
8
|
+
response = conn.get do |req|
|
9
|
+
req.url URI::encode("api/#{url}")
|
10
|
+
#req.params['limit'] = 100
|
11
|
+
end
|
12
|
+
return response.body
|
13
|
+
end
|
14
|
+
|
15
|
+
def handle_post(url, data, options = {})
|
16
|
+
response = conn.post do |req|
|
17
|
+
req.url URI::encode("api/#{url}")
|
18
|
+
req.body = data
|
19
|
+
end
|
20
|
+
return response.body
|
21
|
+
end
|
22
|
+
|
23
|
+
def handle_put(url, data, options = {})
|
24
|
+
response = conn.put do |req|
|
25
|
+
req.url URI::encode("api/#{url}")
|
26
|
+
req.body = data
|
27
|
+
end
|
28
|
+
return response.body
|
29
|
+
end
|
30
|
+
|
31
|
+
def handle_delete(url, options = {})
|
32
|
+
response = conn.delete do |req|
|
33
|
+
req.url URI::encode("api/#{url}")
|
34
|
+
end
|
35
|
+
return response.status
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: adafruit-io
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Justin Cooper
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday_middleware
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.9'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '4.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '4.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: multi_xml
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.5'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.5'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: addressable
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.3'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.5'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.5'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '10.4'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '10.4'
|
111
|
+
description: API Client Library for the Adafruit IO product
|
112
|
+
email:
|
113
|
+
- justin@adafruit.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- LICENSE.md
|
119
|
+
- README.md
|
120
|
+
- Rakefile
|
121
|
+
- adafruit-io.gemspec
|
122
|
+
- lib/adafruit/io.rb
|
123
|
+
- lib/adafruit/io/client.rb
|
124
|
+
- lib/adafruit/io/client/data.rb
|
125
|
+
- lib/adafruit/io/client/feed.rb
|
126
|
+
- lib/adafruit/io/client/group.rb
|
127
|
+
- lib/adafruit/io/client/io_object.rb
|
128
|
+
- lib/adafruit/io/client/request_handler.rb
|
129
|
+
- lib/adafruit/io/version.rb
|
130
|
+
homepage: https://github.com/adafruit/io-client-ruby
|
131
|
+
licenses:
|
132
|
+
- MIT
|
133
|
+
metadata: {}
|
134
|
+
post_install_message:
|
135
|
+
rdoc_options: []
|
136
|
+
require_paths:
|
137
|
+
- lib
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
requirements: []
|
149
|
+
rubyforge_project:
|
150
|
+
rubygems_version: 2.2.2
|
151
|
+
signing_key:
|
152
|
+
specification_version: 4
|
153
|
+
summary: Adafruit IO API Client Library
|
154
|
+
test_files: []
|