helium-ruby 0.20.0 → 0.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +47 -0
- data/docs/Helium.html +6 -6
- data/docs/Helium/Client.html +62 -34
- data/docs/Helium/Client/Configurations.html +296 -0
- data/docs/Helium/Client/DeviceConfigurations.html +465 -0
- data/docs/Helium/Client/Elements.html +92 -18
- data/docs/Helium/Client/Http.html +86 -28
- data/docs/Helium/Client/Labels.html +29 -86
- data/docs/Helium/Client/Organizations.html +5 -75
- data/docs/Helium/Client/Sensors.html +147 -17
- data/docs/Helium/Client/Users.html +5 -9
- data/docs/Helium/ClientError.html +3 -3
- data/docs/Helium/Collection.html +1053 -0
- data/docs/Helium/Configuration.html +380 -0
- data/docs/Helium/Cursor.html +7 -3
- data/docs/Helium/DataPoint.html +16 -5
- data/docs/Helium/DeviceConfiguration.html +476 -0
- data/docs/Helium/Element.html +203 -43
- data/docs/Helium/Error.html +15 -5
- data/docs/Helium/InvalidApiKey.html +3 -3
- data/docs/Helium/Label.html +35 -36
- data/docs/Helium/Metadata.html +589 -0
- data/docs/Helium/Organization.html +236 -17
- data/docs/Helium/Resource.html +655 -161
- data/docs/Helium/Sensor.html +345 -111
- data/docs/Helium/Timeseries.html +354 -0
- data/docs/Helium/User.html +161 -18
- data/docs/Helium/Utils.html +56 -4
- data/docs/_index.html +72 -7
- data/docs/class_list.html +1 -1
- data/docs/css/style.css +8 -1
- data/docs/file.README.html +66 -6
- data/docs/frames.html +1 -1
- data/docs/index.html +66 -6
- data/docs/method_list.html +619 -139
- data/docs/top-level-namespace.html +3 -3
- data/lib/helium.rb +2 -0
- data/lib/helium/client/configurations.rb +0 -12
- data/lib/helium/client/elements.rb +0 -12
- data/lib/helium/client/labels.rb +1 -12
- data/lib/helium/client/organizations.rb +1 -47
- data/lib/helium/client/sensors.rb +0 -12
- data/lib/helium/client/users.rb +1 -3
- data/lib/helium/collection.rb +129 -0
- data/lib/helium/configuration.rb +5 -1
- data/lib/helium/element.rb +1 -1
- data/lib/helium/label.rb +1 -3
- data/lib/helium/metadata.rb +58 -0
- data/lib/helium/organization.rb +4 -4
- data/lib/helium/resource.rb +28 -29
- data/lib/helium/sensor.rb +1 -1
- data/lib/helium/version.rb +1 -1
- metadata +11 -2
@@ -6,7 +6,7 @@
|
|
6
6
|
<title>
|
7
7
|
Top Level Namespace
|
8
8
|
|
9
|
-
— Documentation by YARD 0.9.
|
9
|
+
— Documentation by YARD 0.9.5
|
10
10
|
|
11
11
|
</title>
|
12
12
|
|
@@ -102,9 +102,9 @@
|
|
102
102
|
</div>
|
103
103
|
|
104
104
|
<div id="footer">
|
105
|
-
Generated on Thu
|
105
|
+
Generated on Thu Jan 12 15:58:34 2017 by
|
106
106
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
|
-
0.9.
|
107
|
+
0.9.5 (ruby-2.3.1).
|
108
108
|
</div>
|
109
109
|
|
110
110
|
</div>
|
data/lib/helium.rb
CHANGED
@@ -7,7 +7,9 @@ require "helium/error"
|
|
7
7
|
require "helium/utils"
|
8
8
|
require "helium/client"
|
9
9
|
require "helium/cursor"
|
10
|
+
require "helium/collection"
|
10
11
|
require "helium/resource"
|
12
|
+
require "helium/metadata"
|
11
13
|
require "helium/user"
|
12
14
|
require "helium/organization"
|
13
15
|
require "helium/sensor"
|
@@ -10,18 +10,6 @@ module Helium
|
|
10
10
|
Configuration.find(id, client: self)
|
11
11
|
end
|
12
12
|
|
13
|
-
def config_device_configurations(id)
|
14
|
-
path = "/configuration/#{id}/device-configuration"
|
15
|
-
response = get(path)
|
16
|
-
device_confs_data = JSON.parse(response.body)["data"]
|
17
|
-
|
18
|
-
device_confs = device_confs_data.map do |dc|
|
19
|
-
DeviceConfiguration.new(client: self, params: dc)
|
20
|
-
end
|
21
|
-
|
22
|
-
return device_confs
|
23
|
-
end
|
24
|
-
|
25
13
|
# Configurations are immutable, so no updates are available
|
26
14
|
def create_configuration(attributes)
|
27
15
|
Configuration.create(attributes, client: self)
|
@@ -9,18 +9,6 @@ module Helium
|
|
9
9
|
Element.find(id, client: self)
|
10
10
|
end
|
11
11
|
|
12
|
-
def element_sensors(element)
|
13
|
-
path = "/element/#{element.id}/sensor"
|
14
|
-
response = get(path)
|
15
|
-
sensors_data = JSON.parse(response.body)["data"]
|
16
|
-
|
17
|
-
sensors = sensors_data.map do |sensor|
|
18
|
-
Sensor.new(client: self, params: sensor)
|
19
|
-
end
|
20
|
-
|
21
|
-
return sensors
|
22
|
-
end
|
23
|
-
|
24
12
|
def element_device_configuration(element)
|
25
13
|
path = "/element/#{element.id}/device-configuration"
|
26
14
|
response = get(path)
|
data/lib/helium/client/labels.rb
CHANGED
@@ -13,18 +13,7 @@ module Helium
|
|
13
13
|
Label.create(attributes, client: self)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
path = "/label/#{label.id}/sensor"
|
18
|
-
response = get(path)
|
19
|
-
sensors_data = JSON.parse(response.body)["data"]
|
20
|
-
|
21
|
-
sensors = sensors_data.map do |sensor_data|
|
22
|
-
Sensor.new(client: self, params: sensor_data)
|
23
|
-
end
|
24
|
-
|
25
|
-
return sensors
|
26
|
-
end
|
27
|
-
|
16
|
+
# TODO incorporate this logic into Helium::Collection
|
28
17
|
def update_label_sensors(label, opts = {})
|
29
18
|
sensors = opts.fetch(:sensors, [])
|
30
19
|
|
@@ -2,53 +2,7 @@ module Helium
|
|
2
2
|
class Client
|
3
3
|
module Organizations
|
4
4
|
def organization
|
5
|
-
|
6
|
-
org_data = JSON.parse(response.body)["data"]
|
7
|
-
return Organization.new(client: self, params: org_data)
|
8
|
-
end
|
9
|
-
|
10
|
-
def organization_users
|
11
|
-
response = get('/organization/user')
|
12
|
-
users_data = JSON.parse(response.body)["data"]
|
13
|
-
|
14
|
-
users = users_data.map do |user_data|
|
15
|
-
User.new(client: self, params: user_data)
|
16
|
-
end
|
17
|
-
|
18
|
-
return users
|
19
|
-
end
|
20
|
-
|
21
|
-
def organization_labels
|
22
|
-
response = get('/organization/label')
|
23
|
-
labels_data = JSON.parse(response.body)["data"]
|
24
|
-
|
25
|
-
labels = labels_data.map do |label_data|
|
26
|
-
Label.new(client: self, params: label_data)
|
27
|
-
end
|
28
|
-
|
29
|
-
return labels
|
30
|
-
end
|
31
|
-
|
32
|
-
def organization_elements
|
33
|
-
response = get('/organization/element')
|
34
|
-
elements_data = JSON.parse(response.body)["data"]
|
35
|
-
|
36
|
-
elements = elements_data.map do |element_data|
|
37
|
-
Element.new(client: self, params: element_data)
|
38
|
-
end
|
39
|
-
|
40
|
-
return elements
|
41
|
-
end
|
42
|
-
|
43
|
-
def organization_sensors
|
44
|
-
response = get('/organization/sensor')
|
45
|
-
sensors_data = JSON.parse(response.body)["data"]
|
46
|
-
|
47
|
-
sensors = sensors_data.map do |sensor_data|
|
48
|
-
Sensor.new(client: self, params: sensor_data)
|
49
|
-
end
|
50
|
-
|
51
|
-
return sensors
|
5
|
+
Organization.singleton(client: self)
|
52
6
|
end
|
53
7
|
end
|
54
8
|
end
|
@@ -18,18 +18,6 @@ module Helium
|
|
18
18
|
return element
|
19
19
|
end
|
20
20
|
|
21
|
-
def sensor_labels(sensor)
|
22
|
-
path = "/sensor/#{sensor.id}/label"
|
23
|
-
response = get(path)
|
24
|
-
labels_data = JSON.parse(response.body)["data"]
|
25
|
-
|
26
|
-
labels = labels_data.map do |label|
|
27
|
-
Label.new(client: self, params: label)
|
28
|
-
end
|
29
|
-
|
30
|
-
return labels
|
31
|
-
end
|
32
|
-
|
33
21
|
def sensor_device_configuration(sensor)
|
34
22
|
path = "/sensor/#{sensor.id}/device-configuration"
|
35
23
|
response = get(path)
|
data/lib/helium/client/users.rb
CHANGED
@@ -0,0 +1,129 @@
|
|
1
|
+
module Helium
|
2
|
+
class Collection
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :filter_criteria
|
6
|
+
|
7
|
+
def initialize(opts)
|
8
|
+
@client = opts.fetch(:client)
|
9
|
+
@klass = opts.fetch(:klass)
|
10
|
+
@belongs_to = opts.fetch(:belongs_to, nil)
|
11
|
+
|
12
|
+
@filter_criteria = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns all resources
|
16
|
+
# @option opts [Client] :client A Helium::Client
|
17
|
+
# @return [Helium::Collection] a Collection of all of the given Resource
|
18
|
+
def all
|
19
|
+
@filter_criteria = {}
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
# Uses metadata filtering
|
24
|
+
# (https://docs.helium.com/api/v1/metadata/index.html#filtering)
|
25
|
+
# to search for a collection of resources matching the search parameters
|
26
|
+
# @param [Hash] a set of search criteria
|
27
|
+
#
|
28
|
+
# @example Search for sensors by location
|
29
|
+
# client.sensors.where(location: 'Building B') #=> [Sensor, Sensor]
|
30
|
+
#
|
31
|
+
# @example Search for multiple matching search parameters
|
32
|
+
# client.sensors.where(departments: ['it', 'engineering']) #=> [Sensor, Sensor]
|
33
|
+
#
|
34
|
+
# @return [Collection] a Collection of resources matching the provided search criteria
|
35
|
+
def where(criteria)
|
36
|
+
add_filter_criteria(criteria)
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns an array of the Resources belonging to the Collection
|
41
|
+
# @return [Resource]
|
42
|
+
def collection
|
43
|
+
fetch_collection
|
44
|
+
end
|
45
|
+
|
46
|
+
def each
|
47
|
+
collection.each{ |element| yield element }
|
48
|
+
end
|
49
|
+
|
50
|
+
def inspect
|
51
|
+
collection
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_json(*options)
|
55
|
+
collection.to_json(*options)
|
56
|
+
end
|
57
|
+
|
58
|
+
# TODO: could support something like label.sensors << new_sensor
|
59
|
+
# see Label#add_sensors for where it would be applied
|
60
|
+
def +(other)
|
61
|
+
collection + other
|
62
|
+
end
|
63
|
+
|
64
|
+
def -(other)
|
65
|
+
collection - other
|
66
|
+
end
|
67
|
+
|
68
|
+
def [](index)
|
69
|
+
collection[index]
|
70
|
+
end
|
71
|
+
|
72
|
+
# Collections are considered equal if they contain the same resources
|
73
|
+
# as determined by the resources' ids
|
74
|
+
def ==(other)
|
75
|
+
self.map(&:id).sort == other.map(&:id).sort
|
76
|
+
end
|
77
|
+
|
78
|
+
# NOTE: if we implement pagination, we'll need to rethink this
|
79
|
+
def last
|
80
|
+
collection.last
|
81
|
+
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
|
85
|
+
def add_filter_criteria(criteria)
|
86
|
+
criteria.each do |key, value|
|
87
|
+
if existing_value = @filter_criteria[key]
|
88
|
+
@filter_criteria[key] = (Array(existing_value) + Array(value)).uniq
|
89
|
+
else
|
90
|
+
@filter_criteria[key] = value
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def fetch_collection
|
96
|
+
response = @client.get(resource_path)
|
97
|
+
return collection_from_response(response)
|
98
|
+
end
|
99
|
+
|
100
|
+
def filter_param
|
101
|
+
"filter[metadata]=#{@filter_criteria.to_json}"
|
102
|
+
end
|
103
|
+
|
104
|
+
def resource_path
|
105
|
+
uri = if @belongs_to
|
106
|
+
URI.parse("#{@belongs_to.resource_path}/#{@klass.resource_name}")
|
107
|
+
else
|
108
|
+
URI.parse(@klass.all_path)
|
109
|
+
end
|
110
|
+
|
111
|
+
if @filter_criteria.any?
|
112
|
+
uri.query = [uri.query, filter_param].compact.join('&')
|
113
|
+
end
|
114
|
+
|
115
|
+
uri.to_s
|
116
|
+
end
|
117
|
+
|
118
|
+
def collection_from_response(response)
|
119
|
+
resources_data = JSON.parse(response.body)["data"]
|
120
|
+
|
121
|
+
resources = resources_data.map do |resource_data|
|
122
|
+
@klass.new(client: @client, params: resource_data)
|
123
|
+
end
|
124
|
+
|
125
|
+
return resources
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
data/lib/helium/configuration.rb
CHANGED
data/lib/helium/element.rb
CHANGED
data/lib/helium/label.rb
CHANGED
@@ -8,10 +8,8 @@ module Helium
|
|
8
8
|
@name = @params.dig("attributes", "name")
|
9
9
|
end
|
10
10
|
|
11
|
-
# TODO: would be nice to wrap this in a proxy collection, that way
|
12
|
-
# we could do something like label.sensors << new_sensor
|
13
11
|
def sensors
|
14
|
-
@client
|
12
|
+
Collection.new(klass: Sensor, client: @client, belongs_to: self)
|
15
13
|
end
|
16
14
|
|
17
15
|
def add_sensors(sensors_to_add = [])
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Helium
|
2
|
+
# TODO make Metadata inherit from Resource and implement method_missing
|
3
|
+
# for all resources to automatically generate methods for attributes
|
4
|
+
# rather than whitelisting them with hardcoding
|
5
|
+
class Metadata
|
6
|
+
def initialize(opts = {})
|
7
|
+
@client = opts.fetch(:client)
|
8
|
+
@klass = opts.fetch(:klass)
|
9
|
+
|
10
|
+
@params = fetch_params
|
11
|
+
end
|
12
|
+
|
13
|
+
def id
|
14
|
+
@klass.id
|
15
|
+
end
|
16
|
+
|
17
|
+
def properties
|
18
|
+
@params["attributes"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
"<Helium::Metadata properties=#{properties}>"
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing(method_name, *arguments, &block)
|
26
|
+
properties[method_name.to_s] || super
|
27
|
+
end
|
28
|
+
|
29
|
+
def respond_to_missing?(method_name, include_private = false)
|
30
|
+
properties[method_name.to_s] || super
|
31
|
+
end
|
32
|
+
|
33
|
+
def update(attributes = {})
|
34
|
+
body = {
|
35
|
+
data: {
|
36
|
+
attributes: attributes,
|
37
|
+
id: id,
|
38
|
+
type: "metadata"
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
response = @client.patch(path, body: body)
|
43
|
+
@params = JSON.parse(response.body)["data"]
|
44
|
+
return self
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def path
|
50
|
+
"#{@klass.resource_path}/metadata"
|
51
|
+
end
|
52
|
+
|
53
|
+
def fetch_params
|
54
|
+
response = @client.get(path)
|
55
|
+
JSON.parse(response.body)["data"]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/helium/organization.rb
CHANGED
@@ -15,19 +15,19 @@ module Helium
|
|
15
15
|
|
16
16
|
# TODO refactor into relationships
|
17
17
|
def users
|
18
|
-
@client
|
18
|
+
Collection.new(klass: User, client: @client, belongs_to: self)
|
19
19
|
end
|
20
20
|
|
21
21
|
def labels
|
22
|
-
@client
|
22
|
+
Collection.new(klass: Label, client: @client, belongs_to: self)
|
23
23
|
end
|
24
24
|
|
25
25
|
def elements
|
26
|
-
@client
|
26
|
+
Collection.new(klass: Element, client: @client, belongs_to: self)
|
27
27
|
end
|
28
28
|
|
29
29
|
def sensors
|
30
|
-
@client
|
30
|
+
Collection.new(klass: Sensor, client: @client, belongs_to: self)
|
31
31
|
end
|
32
32
|
|
33
33
|
def as_json
|
data/lib/helium/resource.rb
CHANGED
@@ -17,28 +17,15 @@ module Helium
|
|
17
17
|
class << self
|
18
18
|
include Helium::Utils
|
19
19
|
|
20
|
-
#
|
21
|
-
#
|
22
|
-
|
20
|
+
# The resource's index API route
|
21
|
+
# @return [String] path to resource's index
|
22
|
+
def all_path
|
23
|
+
"/#{resource_name}"
|
24
|
+
end
|
23
25
|
|
24
|
-
# Returns all resources
|
25
|
-
# @option opts [Client] :client A Helium::Client
|
26
|
-
# @return [Array<Resource>] an Array of all of the inheriting Resource
|
27
26
|
def all(opts = {})
|
28
27
|
client = opts.fetch(:client)
|
29
|
-
|
30
|
-
response = client.get(all_path)
|
31
|
-
resources_data = JSON.parse(response.body)["data"]
|
32
|
-
|
33
|
-
resources = resources_data.map do |resource_data|
|
34
|
-
self.new(client: client, params: resource_data)
|
35
|
-
end
|
36
|
-
|
37
|
-
return resources
|
38
|
-
end
|
39
|
-
|
40
|
-
def all_path
|
41
|
-
"/#{resource_name}"
|
28
|
+
Collection.new(klass: self, client: client).all
|
42
29
|
end
|
43
30
|
|
44
31
|
# Finds a single Resource by id
|
@@ -47,11 +34,15 @@ module Helium
|
|
47
34
|
# @return [Resource]
|
48
35
|
def find(id, opts = {})
|
49
36
|
client = opts.fetch(:client)
|
37
|
+
initialize_from_path(path: "/#{resource_name}/#{id}", client: client)
|
38
|
+
end
|
50
39
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
40
|
+
# Fetches a singleton resource (e.g. organization, user)
|
41
|
+
# @option opts [Client] :client A Helium::Client
|
42
|
+
# @return [Resource] A singleton resource
|
43
|
+
def singleton(opts = {})
|
44
|
+
client = opts.fetch(:client)
|
45
|
+
initialize_from_path(path: all_path, client: client)
|
55
46
|
end
|
56
47
|
|
57
48
|
# Creates a new resource with given attributes
|
@@ -76,11 +67,18 @@ module Helium
|
|
76
67
|
return self.new(client: client, params: resource_data)
|
77
68
|
end
|
78
69
|
|
79
|
-
private
|
80
|
-
|
81
70
|
def resource_name
|
82
71
|
kebab_case(self.name.split('::').last)
|
83
72
|
end
|
73
|
+
|
74
|
+
def initialize_from_path(opts = {})
|
75
|
+
client = opts.fetch(:client)
|
76
|
+
path = opts.fetch(:path)
|
77
|
+
|
78
|
+
response = client.get(path)
|
79
|
+
resource_data = JSON.parse(response.body)["data"]
|
80
|
+
return self.new(client: client, params: resource_data)
|
81
|
+
end
|
84
82
|
end # << self
|
85
83
|
|
86
84
|
# Returns a path identifying the current resource. Can be overridden
|
@@ -111,8 +109,11 @@ module Helium
|
|
111
109
|
# Deletes the Resource
|
112
110
|
# @return [Boolean] Whether the operation was successful
|
113
111
|
def destroy
|
114
|
-
|
115
|
-
|
112
|
+
@client.delete(resource_path)
|
113
|
+
end
|
114
|
+
|
115
|
+
def metadata
|
116
|
+
Metadata.new(client: @client, klass: self)
|
116
117
|
end
|
117
118
|
|
118
119
|
# Override equality to use id for comparisons
|
@@ -161,8 +162,6 @@ module Helium
|
|
161
162
|
as_json.to_json(*options)
|
162
163
|
end
|
163
164
|
|
164
|
-
private
|
165
|
-
|
166
165
|
def resource_name
|
167
166
|
kebab_case(self.class.name.split('::').last)
|
168
167
|
end
|