adafruit-io 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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.
@@ -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
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :test => :spec
7
+ task :default => :spec
@@ -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
@@ -0,0 +1,8 @@
1
+ require "adafruit/io/client"
2
+ require "adafruit/io/version"
3
+
4
+ module Adafruit
5
+ module IO
6
+
7
+ end
8
+ end
@@ -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
@@ -0,0 +1,5 @@
1
+ module Adafruit
2
+ module IO
3
+ VERSION = "1.0.0"
4
+ end
5
+ 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: []