adafruit-io 2.0.0.beta.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4e361c9a85392c933fe7c35fda6bfd98f6f80cd
4
- data.tar.gz: 9a68f813bfff5fedee4511bb6fcd7b940ebfb1e4
3
+ metadata.gz: c9d6fead5f73917e3333bd69c70965d1e4d23c31
4
+ data.tar.gz: 1cef173f825142a4ca7c7c4c3eeaf44d11fc1b7d
5
5
  SHA512:
6
- metadata.gz: 730d7000307a9569797d6904f7fa5fba72e7cf6ec507b753fdad266584b1fed8bfdfbe29ae569f2d8b00fe129cf42f93687d1d202816a2944f457121a94f65a2
7
- data.tar.gz: a61eb95bc77ff2aaab6d5893f9d16779e4d60acf1ab9612ba186e395bb73ab93c2e98af86f2f4fcbe518a44fa5f44c863ca12ac2fa3ed8a64ffd99a81ff2d75b
6
+ metadata.gz: ea27ad2d2ef07fcbcbde215ace2d8e2e46960eb8f05d9fc5d26d0186f9ee10519e80b832237f7793b472e7e8f26a3d760a440613fed3f7b78d05d0c8e7c9d57c
7
+ data.tar.gz: fbf7c7ef1880a396ceb5aa2e54e1bea2b345a8b610482f35bf3afab6db2c97615fb5e14a8b0f04c8f141dce71d6474dd00d64559c0798be70140bfc2856f6924
data/README.md CHANGED
@@ -32,20 +32,22 @@ It is our goal to eventually support all API V2 methods, but that will happen in
32
32
  - [x] Activities `2.0.0.beta.5`
33
33
  - [x] Permissions `2.0.0.beta.5`
34
34
  - [x] Triggers `2.0.0.beta.6`
35
+ - [x] Feeds `2.0.0`
36
+ - [x] Data `2.0.0`
37
+ - [x] Tokens `2.0.0`
38
+ - [x] Blocks `2.0.0`
39
+ - [x] Dashboards `2.0.0`
40
+ - [x] Groups `2.0.0`
41
+ - [x] Activities `2.0.0`
42
+ - [x] Permissions `2.0.0`
43
+ - [x] Triggers `2.0.0`
35
44
 
36
45
  Still needing complete tests:
37
46
 
38
- - [x] Feeds
39
- - [x] Data
40
- - [x] Tokens
41
- - [x] Blocks
42
- - [ ] Dashboards *has pending*
43
- - [ ] Groups *has pending*
44
- - [ ] Activities
45
- - [ ] Permissions
46
- - [ ] Triggers
47
47
  - [ ] MQTT
48
48
 
49
+
50
+
49
51
  ## Installation
50
52
 
51
53
  Add this line to your application's Gemfile:
@@ -60,9 +62,12 @@ Or install it yourself as:
60
62
 
61
63
  $ gem install adafruit-io
62
64
 
65
+
66
+
63
67
  ## Basic Usage
64
68
 
65
- Each time you use the library, you'll want to pass your [AIO Key][4] to the client.
69
+ Each time you use the library, you'll have to pass your [Adafruit IO Key][4] to the client.
70
+
66
71
 
67
72
  ```ruby
68
73
  require 'adafruit/io'
@@ -73,6 +78,7 @@ aio = Adafruit::IO::Client.new key: 'KEY'
73
78
 
74
79
  Since every API request requires a username, you can also pass a username to the client initializer to use it for every request.
75
80
 
81
+
76
82
  ```ruby
77
83
  require 'adafruit/io'
78
84
 
@@ -80,15 +86,50 @@ require 'adafruit/io'
80
86
  aio = Adafruit::IO::Client.new key: 'KEY', username: 'USERNAME'
81
87
  ```
82
88
 
83
- All return values are plain Ruby hashes based on the JSON response returned by the API. Most basic requests should get back a Hash with a `key` field. The key can be used in subsequent requests. API requests that return a list of objects will return a simple array of hashes. Feeds, Groups, and Dashboards all rely on the `key` value, other endpoints (Blocks, Permissions, Tokens, Triggers) use `id`.
89
+
90
+
91
+ ### Environment Variables
92
+
93
+ Whenever possible, we recommend you keep your Adafruit IO API credentials out of your application code by using environment variables. All the examples
94
+
95
+ [Others](http://blog.honeybadger.io/ruby-guide-environment-variables/) have written about using environment variables in Ruby, so we're not going to go into detail. We recommend the [dotenv](https://github.com/bkeepers/dotenv) gem if you're building a Ruby project.
96
+
97
+
98
+
99
+ ### API Response Values
100
+
101
+ All return values are **plain Ruby hashes** based on the JSON response returned by the API. Most basic requests should get back a Hash with a `key` field. The key can be used in subsequent requests. API requests that return a list of objects will return a simple array of hashes. Feeds, Groups, and Dashboards all rely on the `key` value, other endpoints (Blocks, Permissions, Tokens, Triggers) use `id`.
102
+
103
+ You can find the current API documentation at [https://io.adafruit.com/api/docs/](https://io.adafruit.com/api/docs/). This library implements v2 of the Adafruit IO API.
104
+
105
+
106
+
107
+ ### API Error Responses
108
+
109
+ As of **v2.0.0**, this library raises an `Adafruit::IO::RequestError` on any non HTTP 200 status responses. Generally, this means your code should wrap API calls in `begin...rescue...end` blocks.
110
+
111
+ ```ruby
112
+ require 'adafruit/io'
113
+
114
+ api_key = ENV['IO_KEY']
115
+ username = ENV['IO_USER']
116
+
117
+ api = Adafruit::IO::Client.new key: api_key, username: username
118
+
119
+
120
+
121
+ ```
122
+
123
+ ## Example
84
124
 
85
125
  Here's an example of creating, adding data to, and deleting a feed.
86
126
 
127
+
87
128
  ```ruby
88
129
  require 'adafruit/io'
89
130
 
90
- api_key = ENV['AIO_KEY']
91
- username = ENV['AIO_USER']
131
+ api_key = ENV['IO_KEY']
132
+ username = ENV['IO_USER']
92
133
 
93
134
  api = Adafruit::IO::Client.new key: api_key, username: username
94
135
 
@@ -120,19 +161,25 @@ puts "read?"
120
161
  puts api.feed(garbage['key']).inspect
121
162
  ```
122
163
 
164
+
165
+ This code and more is available in [the examples/ directory](examples/).
166
+
123
167
  ## License
124
168
 
125
- Copyright (c) 2017 Adafruit Industries. Licensed under the MIT license.
169
+ Copyright (c) 2018 Adafruit Industries. Licensed under the MIT license.
126
170
 
127
171
  [Adafruit](https://adafruit.com) invests time and resources providing this open source code. Please support Adafruit and open-source hardware by purchasing products from [Adafruit](https://adafruit.com).
128
172
 
129
173
  ## Contributing
130
174
 
131
175
  1. Fork it ( http://github.com/adafruit/io-client-ruby/fork )
132
- 2. Create your feature branch (`git checkout -b my-new-feature`)
133
- 3. Commit your changes (`git commit -am 'Add some feature'`)
134
- 4. Push to the branch (`git push origin my-new-feature`)
135
- 5. Create new Pull Request
176
+ 1. Create your feature branch (`git checkout -b my-new-feature`)
177
+ 1. Write tests, write code, and run the tests (`bundle exec rspec`)
178
+ 1. Commit your changes (`git commit -am 'Add some feature'`)
179
+ 1. Push to the branch (`git push origin my-new-feature`)
180
+ 1. Create a new Pull Request
181
+
182
+ If you'd like to contribute and don't know where to start, [reach out on the Adafruit IO forum](https://forums.adafruit.com/viewforum.php?f=56) or in the [adafruit-io channel on our Discord server](https://discord.gg/adafruit).
136
183
 
137
184
  [1]: https://www.ruby-lang.org
138
185
  [2]: https://io.adafruit.com
@@ -40,6 +40,14 @@ module Adafruit
40
40
 
41
41
  put api_url(username, 'dashboards', dashboard_key), query
42
42
  end
43
+
44
+ def update_dashboard_layouts(*args)
45
+ username, arguments = extract_username(args)
46
+ dashboard_key = get_key_from_arguments(arguments)
47
+ query = get_query_from_arguments(arguments, %w(layouts))
48
+
49
+ post api_url(username, 'dashboards', dashboard_key, 'update_layouts'), query
50
+ end
43
51
  end
44
52
  end
45
53
  end
@@ -2,6 +2,7 @@ module Adafruit
2
2
  module IO
3
3
  class Client
4
4
  module Permissions
5
+ VALID_TYPES = %(feed group dashboard)
5
6
 
6
7
  # Get all permissions for a resource.
7
8
  #
@@ -9,40 +10,62 @@ module Adafruit
9
10
  def permissions(*args)
10
11
  username, arguments = extract_username(args)
11
12
 
12
- if arguments.size < 2
13
- raise 'permissions requires model type (string) and model key (string) values. valid types are feeds, groups, or dashboards'
14
- end
13
+ assert_argument_size(arguments, 2)
14
+ assert_resource_type(arguments[0])
15
15
 
16
- get api_url(username, arguments[0], arguments[1], 'acl')
16
+ get api_url(username, pluralize_type(arguments[0]), arguments[1], 'acl')
17
17
  end
18
18
 
19
19
  def permission(*args)
20
20
  username, arguments = extract_username(args)
21
21
 
22
- if arguments.size < 3
23
- raise 'permission requires model type (string), model key (string), and id (integer) values. valid types are feeds, groups, or dashboards'
24
- end
22
+ assert_argument_size(arguments, 3)
23
+ assert_resource_type(arguments[0])
25
24
 
26
- get api_url(username, arguments[0], arguments[1], 'acl', arguments[2])
25
+ get api_url(username, pluralize_type(arguments[0]), arguments[1], 'acl', arguments[2])
27
26
  end
28
27
 
29
28
  def create_permission(*args)
30
29
  username, arguments = extract_username(args)
31
- if arguments.size < 3
32
- raise 'permission requires model type (string), model key (string), and id (integer) values. valid types are feeds, groups, or dashboards'
33
- end
30
+
31
+ assert_argument_size(arguments, 2)
32
+ assert_resource_type(arguments[0])
33
+
34
34
  permission_attrs = arguments.pop
35
- post api_url(username, arguments[0], arguments[1], 'acl'), permission_attrs
35
+ post api_url(username, pluralize_type(arguments[0]), arguments[1], 'acl'), permission_attrs
36
36
  end
37
37
 
38
38
  def delete_permission(*args)
39
39
  username, arguments = extract_username(args)
40
40
 
41
- if arguments.size < 3
42
- raise 'permission requires model type (string), key (string), and id (integer) values. valid types are feeds, groups, or dashboards'
41
+ assert_argument_size(arguments, 3)
42
+ assert_resource_type(arguments[0])
43
+
44
+ delete api_url(username, pluralize_type(arguments[0]), arguments[1], 'acl', arguments[2])
45
+ end
46
+
47
+ private
48
+
49
+ def assert_resource_type(resource_type)
50
+ if !VALID_TYPES.include?(resource_type)
51
+ raise Adafruit::IO::Arguments::ArgumentError.new('permission resource type must be one of: feed, group, or dashboard')
52
+ end
53
+ end
54
+
55
+ def assert_argument_size(arguments, size)
56
+ if size === 3
57
+ if arguments.size < 3
58
+ raise Adafruit::IO::Arguments::ArgumentError.new('permission requires resource type (string), key (string), and permission id (integer) values. valid types are feeds, groups, or dashboards')
59
+ end
60
+ elsif size == 2
61
+ if arguments.size < size
62
+ raise Adafruit::IO::Arguments::ArgumentError.new('permissions requires resource type (string) and resource key (string) values. valid types are feed, group, or dashboard')
63
+ end
43
64
  end
65
+ end
44
66
 
45
- delete api_url(username, arguments[0], arguments[1], 'acl', arguments[2])
67
+ def pluralize_type(resource_type)
68
+ "#{resource_type}s"
46
69
  end
47
70
  end
48
71
  end
@@ -38,7 +38,7 @@ module Adafruit
38
38
  trigger_id = get_id_from_arguments(arguments)
39
39
  attrs = valid_trigger_attrs(arguments)
40
40
 
41
- put api_url(username, 'triggers', feed_key), query
41
+ put api_url(username, 'triggers', trigger_id), attrs
42
42
  end
43
43
 
44
44
  private
@@ -95,11 +95,18 @@ module Adafruit
95
95
 
96
96
  # Subscribe to the feed with the given key. Use .get to retrieve messages
97
97
  # from subscribed feeds.
98
- def subscribe(key)
98
+ #
99
+ # Include the { last_value: true } option if you'd like the feed to
100
+ # receive the last value immediately. (like MQTT retain)
101
+ def subscribe(key, options={})
99
102
  raise 'client is not connected' unless @client.connected?
100
103
 
101
104
  topic = key_to_feed_topic(key)
102
105
  @client.subscribe(topic)
106
+
107
+ if options[:last_value]
108
+ @client.publish(topic + '/get', '')
109
+ end
103
110
  end
104
111
 
105
112
  def unsubscribe(key)
@@ -143,15 +150,21 @@ module Adafruit
143
150
  # # do something
144
151
  # end
145
152
  #
146
- # NOTE: if a feed already has a value, subscribing and calling get will
147
- # immediately return the most recent value for the subscription,
148
- # regardless of when it was received by IO.
149
153
  def get(&block)
150
154
  @client.get(&block)
151
155
  end
152
156
 
153
157
  private
154
158
 
159
+ def encode_json(record)
160
+ begin
161
+ JSON.generate record
162
+ rescue JSON::GeneratorError => ex
163
+ puts "failed to generate JSON from record: #{record.inspect}"
164
+ raise ex
165
+ end
166
+ end
167
+
155
168
  def key_to_feed_topic(key)
156
169
  "%s/f/%s" % [@options[:username], key]
157
170
  end
@@ -169,7 +182,7 @@ module Adafruit
169
182
  end
170
183
  end
171
184
 
172
- JSON.generate payload
185
+ encode_json payload
173
186
  end
174
187
 
175
188
  def payload_from_values_with_location(values, location)
@@ -183,7 +196,7 @@ module Adafruit
183
196
  end
184
197
  end
185
198
 
186
- JSON.generate payload
199
+ encode_json payload
187
200
  end
188
201
 
189
202
  def indifferent_keys(hash)
@@ -2,6 +2,15 @@ require 'open-uri'
2
2
 
3
3
  module Adafruit
4
4
  module IO
5
+ class RequestError < StandardError
6
+ attr_reader :response
7
+
8
+ def initialize(message, response)
9
+ super(message)
10
+ @response = response
11
+ end
12
+ end
13
+
5
14
  module RequestHandler
6
15
 
7
16
  attr_reader :last_response, :pagination
@@ -70,11 +79,7 @@ module Adafruit
70
79
  update_pagination(response)
71
80
 
72
81
  if response.status < 200 || response.status > 299
73
- if response.status === 404
74
- nil
75
- else
76
- raise "GET error: #{ response.body }"
77
- end
82
+ raise Adafruit::IO::RequestError.new("GET error: #{ response.body }", response)
78
83
  else
79
84
  parsed_response response
80
85
  end
@@ -87,7 +92,7 @@ module Adafruit
87
92
  end
88
93
 
89
94
  if response.status < 200 || response.status > 299
90
- raise "POST error: #{ response.body }"
95
+ raise Adafruit::IO::RequestError.new("POST error: #{ response.body }", response)
91
96
  else
92
97
  parsed_response response
93
98
  end
@@ -100,7 +105,7 @@ module Adafruit
100
105
  end
101
106
 
102
107
  if response.status < 200 || response.status > 299
103
- raise "PUT error: #{ response.body }"
108
+ raise Adafruit::IO::RequestError.new("PUT error: #{ response.body }", response)
104
109
  else
105
110
  parsed_response response
106
111
  end
@@ -115,7 +120,7 @@ module Adafruit
115
120
  if response.status === 404
116
121
  nil
117
122
  else
118
- raise "DELETE error: #{ response.body }"
123
+ raise Adafruit::IO::RequestError.new("DELETE error: #{ response.body }", response)
119
124
  end
120
125
  else
121
126
  parsed_response response
@@ -1,5 +1,5 @@
1
1
  module Adafruit
2
2
  module IO
3
- VERSION = "2.0.0.beta.7"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adafruit-io
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta.7
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Cooper
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-04-02 00:00:00.000000000 Z
12
+ date: 2018-05-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -138,9 +138,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  required_rubygems_version: !ruby/object:Gem::Requirement
140
140
  requirements:
141
- - - ">"
141
+ - - ">="
142
142
  - !ruby/object:Gem::Version
143
- version: 1.3.1
143
+ version: '0'
144
144
  requirements: []
145
145
  rubyforge_project:
146
146
  rubygems_version: 2.5.2