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.
@@ -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: []