m2x 1.0.0 → 2.0.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 +42 -30
- data/lib/m2x/client.rb +150 -64
- data/lib/m2x/device.rb +147 -0
- data/lib/m2x/distribution.rb +53 -0
- data/lib/m2x/key.rb +49 -0
- data/lib/m2x/resource.rb +40 -0
- data/lib/m2x/response.rb +42 -0
- data/lib/m2x/stream.rb +111 -0
- data/lib/m2x/version.rb +4 -2
- data/lib/m2x.rb +8 -43
- data/m2x.gemspec +1 -1
- metadata +7 -6
- data/lib/m2x/batches.rb +0 -79
- data/lib/m2x/blueprints.rb +0 -64
- data/lib/m2x/datasources.rb +0 -64
- data/lib/m2x/feeds.rb +0 -194
- data/lib/m2x/keys.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 084cf856cdc4b7844875f78adb56260dc52257a0
|
4
|
+
data.tar.gz: b9cc0d3d5185bc385d37121fa183248ceaef97f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33ee0afd354825adbe05a148c191776e07dd1ac3c3d41fb220d90fc1eee6f7d8040baa5f3cee0106fdb5961e977a149d5ae14600a8db5196552045cef03a898d
|
7
|
+
data.tar.gz: 1f12c23f3fe2aea2ccf4ccb93797c4be1a7b08b6fe336ba7a157b1c92a45d0db98d5007cd1ff3da17f527e10412388dffd54b6626048e421d0b9d99754c22fd1
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Getting Started
|
|
9
9
|
==========================
|
10
10
|
1. Signup for an [M2X Account](https://m2x.att.com/signup).
|
11
11
|
2. Obtain your _Master Key_ from the Master Keys tab of your [Account Settings](https://m2x.att.com/account) screen.
|
12
|
-
2. Create your first [
|
12
|
+
2. Create your first [Device](https://m2x.att.com/devices) and copy its _Device ID_.
|
13
13
|
3. Review the [M2X API Documentation](https://m2x.att.com/developer/documentation/overview).
|
14
14
|
|
15
15
|
## Installation
|
@@ -20,43 +20,46 @@ $ gem install m2x
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
In order to communicate with the M2X API, you need an instance of [M2X](lib/m2x.rb). You need to pass your API key in the constructor to access your data.
|
23
|
+
In order to communicate with the M2X API, you need an instance of [M2X::Client](lib/m2x/client.rb). You need to pass your API key in the constructor to access your data.
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
m2x = M2X.new(<YOUR-API-KEY>)
|
26
|
+
m2x = M2X::Client.new(<YOUR-API-KEY>)
|
27
27
|
```
|
28
28
|
|
29
29
|
This provides an interface to your data on M2X
|
30
30
|
|
31
|
-
- [
|
31
|
+
- [Distribution](lib/m2x/distribution.rb)
|
32
32
|
```ruby
|
33
|
-
|
34
|
-
```
|
33
|
+
distribution = m2x.distribution("<DISTRIBUTION-ID>")
|
35
34
|
|
36
|
-
|
37
|
-
```ruby
|
38
|
-
batches_api = m2x.batches
|
39
|
-
```
|
40
|
-
- [Datasources](lib/m2x/datasources.rb)
|
41
|
-
```ruby
|
42
|
-
datasources_api = m2x.datasources
|
35
|
+
distributions = m2x.distributions
|
43
36
|
```
|
44
37
|
|
45
|
-
- [
|
38
|
+
- [Device](lib/m2x/device.rb)
|
46
39
|
```ruby
|
47
|
-
|
40
|
+
device = m2x.device("<DEVICE-ID>")
|
41
|
+
|
42
|
+
devices = m2x.devices
|
48
43
|
```
|
49
44
|
|
50
|
-
- [
|
45
|
+
- [Key](lib/m2x/key.rb)
|
51
46
|
```ruby
|
52
|
-
|
47
|
+
key = m2x.key("<KEY-TOKEN>")
|
48
|
+
|
49
|
+
keys = m2x.keys
|
53
50
|
```
|
54
51
|
|
55
52
|
Refer to the documentation on each class for further usage instructions.
|
56
53
|
|
57
54
|
## Example
|
58
55
|
|
59
|
-
In order to run this example, you will need a `
|
56
|
+
In order to run this example, you will need a `Device ID` and `API Key`. If you don't have any, access your M2X account, create a new [Device](https://m2x.att.com/devices), and copy the `Device ID` and `API Key` values. The following script will send your CPU load average to three different streams named `load_1m`, `load_5m` and `load_15`. Check that there's no need to create a stream in order to write values into it.
|
57
|
+
|
58
|
+
In order to execute this script run:
|
59
|
+
|
60
|
+
```bash
|
61
|
+
API_KEY=<YOUR-API-KEY> DEVICE=<YOUR-DEVICE-ID> ./m2x-uptime.rb
|
62
|
+
```
|
60
63
|
|
61
64
|
```ruby
|
62
65
|
#! /usr/bin/env ruby
|
@@ -69,13 +72,17 @@ In order to run this example, you will need a `Feed ID` and `API Key`. If you do
|
|
69
72
|
require "time"
|
70
73
|
require "m2x"
|
71
74
|
|
72
|
-
API_KEY = "
|
73
|
-
|
75
|
+
API_KEY = ENV.fetch("API_KEY")
|
76
|
+
DEVICE = ENV.fetch("DEVICE")
|
74
77
|
|
75
|
-
|
78
|
+
puts "M2X::Client/#{M2X::Client::VERSION} example"
|
76
79
|
|
77
80
|
@run = true
|
78
|
-
|
81
|
+
|
82
|
+
stop = Proc.new { @run = false }
|
83
|
+
|
84
|
+
trap(:INT, &stop)
|
85
|
+
trap(:TERM, &stop)
|
79
86
|
|
80
87
|
# Match `uptime` load averages output for both Linux and OSX
|
81
88
|
UPTIME_RE = /(\d+\.\d+),? (\d+\.\d+),? (\d+\.\d+)$/
|
@@ -84,10 +91,15 @@ def load_avg
|
|
84
91
|
`uptime`.match(UPTIME_RE).captures
|
85
92
|
end
|
86
93
|
|
94
|
+
m2x = M2X::Client.new(API_KEY)
|
95
|
+
|
96
|
+
# Get the device
|
97
|
+
device = m2x.device(DEVICE)
|
98
|
+
|
87
99
|
# Create the streams if they don't exist
|
88
|
-
|
89
|
-
|
90
|
-
|
100
|
+
device.create_stream("load_1m")
|
101
|
+
device.create_stream("load_5m")
|
102
|
+
device.create_stream("load_15m")
|
91
103
|
|
92
104
|
while @run
|
93
105
|
load_1m, load_5m, load_15m = load_avg
|
@@ -96,14 +108,14 @@ while @run
|
|
96
108
|
now = Time.now.iso8601
|
97
109
|
|
98
110
|
values = {
|
99
|
-
load_1m: [ { value: load_1m,
|
100
|
-
load_5m: [ { value: load_5m,
|
101
|
-
load_15m: [ { value: load_15m,
|
111
|
+
load_1m: [ { value: load_1m, timestamp: now } ],
|
112
|
+
load_5m: [ { value: load_5m, timestamp: now } ],
|
113
|
+
load_15m: [ { value: load_15m, timestamp: now } ]
|
102
114
|
}
|
103
115
|
|
104
|
-
res =
|
116
|
+
res = device.post_updates(values: values)
|
105
117
|
|
106
|
-
abort res.json["message"] unless res.
|
118
|
+
abort res.json["message"] unless res.success?
|
107
119
|
|
108
120
|
sleep 1
|
109
121
|
end
|
data/lib/m2x/client.rb
CHANGED
@@ -2,94 +2,180 @@ require "net/http"
|
|
2
2
|
require "json"
|
3
3
|
require "openssl"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
# Interface for connecting with M2X API service.
|
6
|
+
#
|
7
|
+
# This class provides convenience methods to access M2X most common resources.
|
8
|
+
# It can also be used to access any endpoint directly like this:
|
9
|
+
#
|
10
|
+
# m2x = M2X::Client.new("<YOUR-API-KEY>")
|
11
|
+
# m2x.get("/some_path")
|
12
|
+
#
|
13
|
+
class M2X::Client
|
14
|
+
DEFAULT_API_BASE = "https://api-m2x.att.com".freeze
|
15
|
+
DEFAULT_API_VERSION = "v2".freeze
|
16
|
+
|
17
|
+
CA_FILE = File.expand_path("../cacert.pem", __FILE__)
|
18
|
+
|
19
|
+
USER_AGENT = "M2X-Ruby/#{M2X::Client::VERSION} #{RUBY_ENGINE}/#{RUBY_VERSION} (#{RUBY_PLATFORM})".freeze
|
20
|
+
|
21
|
+
attr_accessor :api_key
|
22
|
+
attr_accessor :api_base
|
23
|
+
attr_accessor :api_version
|
24
|
+
attr_reader :last_response
|
25
|
+
|
26
|
+
def initialize(api_key=nil, api_base=nil)
|
27
|
+
@api_key = api_key
|
28
|
+
@api_base = api_base
|
29
|
+
@api_version = api_version
|
30
|
+
end
|
8
31
|
|
9
|
-
|
32
|
+
# Returns the status of the M2X system.
|
33
|
+
#
|
34
|
+
# The response to this endpoint is an object in which each of its attributes
|
35
|
+
# represents an M2X subsystem and its current status.
|
36
|
+
def status
|
37
|
+
get("/status")
|
38
|
+
end
|
10
39
|
|
11
|
-
|
40
|
+
# Obtain a Device from M2X
|
41
|
+
#
|
42
|
+
# This method instantiates an instance of Device and calls `Device#view`
|
43
|
+
# method, returning the device instance with all its attributes initialized
|
44
|
+
def device(id)
|
45
|
+
M2X::Client::Device.new(self, "id" => id).tap(&:view)
|
46
|
+
end
|
12
47
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
48
|
+
# Creates a new device on M2X with the specified parameters
|
49
|
+
def create_device(params)
|
50
|
+
M2X::Client::Device.create!(self, params)
|
51
|
+
end
|
17
52
|
|
18
|
-
|
19
|
-
|
53
|
+
# Retrieve the list of devices accessible by the authenticated API key that
|
54
|
+
# meet the search criteria.
|
55
|
+
#
|
56
|
+
# See M2X::Client::Device.list for more details
|
57
|
+
def devices(params={})
|
58
|
+
M2X::Client::Device.list(self, params)
|
59
|
+
end
|
20
60
|
|
21
|
-
|
61
|
+
# Search the catalog of public Devices.
|
62
|
+
#
|
63
|
+
# This allows unauthenticated users to search Devices from other users that
|
64
|
+
# have been marked as public, allowing them to read public Device metadata,
|
65
|
+
# locations, streams list, and view each Devices' stream metadata and its
|
66
|
+
# values.
|
67
|
+
#
|
68
|
+
# See M2X::Client::Device.catalog for more details
|
69
|
+
def device_catalog(params={})
|
70
|
+
M2X::Client::Device.catalog(self, params)
|
71
|
+
end
|
22
72
|
|
23
|
-
|
73
|
+
# Obtain a Distribution from M2X
|
74
|
+
#
|
75
|
+
# This method instantiates an instance of Distribution and calls
|
76
|
+
# `Distribution#view` method, returning the device instance with all
|
77
|
+
# its attributes initialized
|
78
|
+
def distribution(id)
|
79
|
+
M2X::Client::Distribution.new(self, "id" => id).tap(&:view)
|
80
|
+
end
|
24
81
|
|
25
|
-
|
26
|
-
|
82
|
+
# Creates a new device distribution on M2X with the specified parameters
|
83
|
+
def create_distribution(params)
|
84
|
+
M2X::Client::Distribution.create!(self, params)
|
85
|
+
end
|
27
86
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
87
|
+
# Retrieve list of device distributions accessible by the authenticated
|
88
|
+
# API key.
|
89
|
+
#
|
90
|
+
# See M2X::Client::Distribution.list for more details
|
91
|
+
def distributions(params={})
|
92
|
+
M2X::Client::Distribution.list(self, params)
|
93
|
+
end
|
35
94
|
|
36
|
-
|
37
|
-
|
95
|
+
# Obtain an API Key from M2X
|
96
|
+
#
|
97
|
+
# This method instantiates an instance of Key and calls
|
98
|
+
# `Key#view` method, returning the key instance with all
|
99
|
+
# its attributes initialized
|
100
|
+
def key(key)
|
101
|
+
M2X::Client::Key.new(self, "key" => key).tap(&:view)
|
102
|
+
end
|
38
103
|
|
39
|
-
|
40
|
-
|
104
|
+
# Create a new API Key
|
105
|
+
#
|
106
|
+
# Note that, according to the parameters sent, you can create a
|
107
|
+
# Master API Key or a Device/Stream API Key.
|
108
|
+
#
|
109
|
+
# See M2X::Client::Key.create! for more details
|
110
|
+
def create_key(params)
|
111
|
+
M2X::Client::Key.create!(self, params)
|
112
|
+
end
|
41
113
|
|
42
|
-
|
43
|
-
|
44
|
-
|
114
|
+
# Retrieve list of keys associated with the user account.
|
115
|
+
#
|
116
|
+
# See M2X::Client::Key.list for more details
|
117
|
+
def keys
|
118
|
+
M2X::Client::Key.list(self)
|
119
|
+
end
|
45
120
|
|
46
|
-
|
121
|
+
# Define methods for accessing M2X REST API
|
122
|
+
[:get, :post, :put, :delete, :head, :options, :patch].each do |verb|
|
123
|
+
define_method verb do |path, qs=nil, params=nil, headers=nil|
|
124
|
+
request(verb, path, qs, params, headers)
|
47
125
|
end
|
126
|
+
end
|
48
127
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
128
|
+
private
|
129
|
+
def request(verb, path, qs=nil, params=nil, headers=nil)
|
130
|
+
url = URI.parse(File.join(api_base, versioned(path)))
|
54
131
|
|
55
|
-
|
56
|
-
attr_reader :response
|
132
|
+
url.query = URI.encode_www_form(qs) unless qs.nil? || qs.empty?
|
57
133
|
|
58
|
-
|
59
|
-
@response = response
|
60
|
-
end
|
134
|
+
headers = default_headers.merge(headers || {})
|
61
135
|
|
62
|
-
|
63
|
-
|
64
|
-
end
|
136
|
+
body = if params
|
137
|
+
headers["Content-Type"] ||= "application/x-www-form-urlencoded"
|
65
138
|
|
66
|
-
|
67
|
-
|
139
|
+
case headers["Content-Type"]
|
140
|
+
when "application/json" then JSON.dump(params)
|
141
|
+
when "application/x-www-form-urlencoded" then URI.encode_www_form(params)
|
142
|
+
else
|
143
|
+
raise ArgumentError, "Unrecognized Content-Type `#{headers["Content-Type"]}`"
|
144
|
+
end
|
145
|
+
end
|
68
146
|
|
69
|
-
|
70
|
-
|
147
|
+
options = {}
|
148
|
+
options.merge!(use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_PEER, ca_file: CA_FILE) if url.scheme == "https"
|
71
149
|
|
72
|
-
|
73
|
-
|
74
|
-
end
|
150
|
+
path = url.path
|
151
|
+
path << "?#{url.query}" if url.query
|
75
152
|
|
76
|
-
|
77
|
-
|
78
|
-
end
|
153
|
+
res = Net::HTTP.start(url.host, url.port, options) do |http|
|
154
|
+
http.send_request(verb.to_s.upcase, path, body, headers)
|
79
155
|
end
|
80
156
|
|
81
|
-
|
157
|
+
@last_response = Response.new(res)
|
158
|
+
end
|
82
159
|
|
83
|
-
|
84
|
-
|
85
|
-
|
160
|
+
def api_base
|
161
|
+
@api_base ||= DEFAULT_API_BASE
|
162
|
+
end
|
86
163
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
164
|
+
def api_version
|
165
|
+
@api_version ||= DEFAULT_API_VERSION
|
166
|
+
end
|
167
|
+
|
168
|
+
def versioned(path)
|
169
|
+
versioned?(path) ? path : "/#{api_version}#{path}"
|
170
|
+
end
|
171
|
+
|
172
|
+
def versioned?(path)
|
173
|
+
path =~ /^\/v\d+\//
|
174
|
+
end
|
175
|
+
|
176
|
+
def default_headers
|
177
|
+
@headers ||= { "User-Agent" => USER_AGENT }.tap do |headers|
|
178
|
+
headers["X-M2X-KEY"] = @api_key if @api_key
|
179
|
+
end
|
94
180
|
end
|
95
181
|
end
|
data/lib/m2x/device.rb
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
# Wrapper for AT&T M2X Device API
|
2
|
+
# https://m2x.att.com/developer/documentation/v2/device
|
3
|
+
class M2X::Client::Device < M2X::Client::Resource
|
4
|
+
|
5
|
+
PATH = "/devices"
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Retrieve the list of devices accessible by the authenticated API key that
|
9
|
+
# meet the search criteria.
|
10
|
+
#
|
11
|
+
# https://m2x.att.com/developer/documentation/v2/device#List-Search-Devices
|
12
|
+
def list(client, params={})
|
13
|
+
res = client.get(PATH, params)
|
14
|
+
|
15
|
+
res.json["devices"].map{ |atts| new(client, atts) } if res.success?
|
16
|
+
end
|
17
|
+
|
18
|
+
# Search the catalog of public Devices.
|
19
|
+
#
|
20
|
+
# This allows unauthenticated users to search Devices from other users
|
21
|
+
# that have been marked as public, allowing them to read public Device
|
22
|
+
# metadata, locations, streams list, and view each Devices' stream metadata
|
23
|
+
# and its values.
|
24
|
+
#
|
25
|
+
# https://m2x.att.com/developer/documentation/v2/device#List-Search-Public-Devices-Catalog
|
26
|
+
def catalog(client, params={})
|
27
|
+
res = client.get("#{PATH}/catalog", params)
|
28
|
+
|
29
|
+
res.json["devices"].map{ |atts| new(client, atts) } if res.success?
|
30
|
+
end
|
31
|
+
|
32
|
+
# List Device Groups
|
33
|
+
# Retrieve the list of device groups for the authenticated user.
|
34
|
+
#
|
35
|
+
# https://m2x.att.com/developer/documentation/v2/device#List-Device-Groups
|
36
|
+
def groups(client)
|
37
|
+
client.get("#{PATH}/groups")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Create a new device
|
41
|
+
#
|
42
|
+
# https://m2x.att.com/developer/documentation/v2/device#Create-Device
|
43
|
+
def create!(client, params)
|
44
|
+
res = client.post(PATH, nil, params, "Content-Type" => "application/json")
|
45
|
+
|
46
|
+
new(client, res.json) if res.success?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def path
|
51
|
+
@path ||= "#{ PATH }/#{ URI.encode(@attributes.fetch("id")) }"
|
52
|
+
end
|
53
|
+
|
54
|
+
# View Request Log
|
55
|
+
# Retrieve list of HTTP requests received lately by the specified device
|
56
|
+
# (up to 100 entries).
|
57
|
+
#
|
58
|
+
# https://m2x.att.com/developer/documentation/v2/device#View-Request-Log
|
59
|
+
def log
|
60
|
+
@client.get("#{path}/log")
|
61
|
+
end
|
62
|
+
|
63
|
+
# Get location details of an existing Device.
|
64
|
+
#
|
65
|
+
# Note that this method can return an empty value (response status
|
66
|
+
# of 204) if the device has no location defined.
|
67
|
+
#
|
68
|
+
# https://m2x.att.com/developer/documentation/v2/device#Read-Device-Location
|
69
|
+
def location
|
70
|
+
@client.get("#{path}/location")
|
71
|
+
end
|
72
|
+
|
73
|
+
# Update the current location of the specified device.
|
74
|
+
#
|
75
|
+
# https://m2x.att.com/developer/documentation/v2/device#Update-Device-Location
|
76
|
+
def update_location(params)
|
77
|
+
@client.put("#{path}/location", nil, params, "Content-Type" => "application/json")
|
78
|
+
end
|
79
|
+
|
80
|
+
# Post Device Updates (Multiple Values to Multiple Streams)
|
81
|
+
#
|
82
|
+
# This method allows posting multiple values to multiple streams
|
83
|
+
# belonging to a device and optionally, the device location.
|
84
|
+
#
|
85
|
+
# All the streams should be created before posting values using this method.
|
86
|
+
#
|
87
|
+
# The `values` parameter contains an object with one attribute per each stream to be updated.
|
88
|
+
# The value of each one of these attributes is an array of timestamped values.
|
89
|
+
#
|
90
|
+
# {
|
91
|
+
# temperature: [
|
92
|
+
# { "timestamp": <Time in ISO8601>, "value": x },
|
93
|
+
# { "timestamp": <Time in ISO8601>, "value": y },
|
94
|
+
# ],
|
95
|
+
# humidity: [
|
96
|
+
# { "timestamp": <Time in ISO8601>, "value": x },
|
97
|
+
# { "timestamp": <Time in ISO8601>, "value": y },
|
98
|
+
# ]
|
99
|
+
#
|
100
|
+
# }
|
101
|
+
#
|
102
|
+
# The optional location attribute can contain location information that will
|
103
|
+
# be used to update the current location of the specified device
|
104
|
+
#
|
105
|
+
# https://staging.m2x.sl.attcompute.com/developer/documentation/v2/device#Post-Device-Updates--Multiple-Values-to-Multiple-Streams-
|
106
|
+
def post_updates(params)
|
107
|
+
@client.post("#{path}/updates", nil, params, "Content-Type" => "application/json")
|
108
|
+
end
|
109
|
+
|
110
|
+
# Retrieve list of data streams associated with the device.
|
111
|
+
#
|
112
|
+
# https://m2x.att.com/developer/documentation/v2/device#List-Data-Streams
|
113
|
+
def streams
|
114
|
+
::M2X::Client::Stream.list(@client, self)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Get details of a specific data Stream associated with the device
|
118
|
+
#
|
119
|
+
# https://m2x.att.com/developer/documentation/v2/device#View-Data-Stream
|
120
|
+
def stream(name)
|
121
|
+
::M2X::Client::Stream.fetch(@client, self, name)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Update a data stream associated with the Device
|
125
|
+
# (if a stream with this name does not exist it gets created).
|
126
|
+
#
|
127
|
+
# https://m2x.att.com/developer/documentation/v2/device#Create-Update-Data-Stream
|
128
|
+
def update_stream(name, params={})
|
129
|
+
stream = ::M2X::Client::Stream.new(@client, self, "name" => name)
|
130
|
+
|
131
|
+
stream.update!(params)
|
132
|
+
end
|
133
|
+
alias_method :create_stream, :update_stream
|
134
|
+
|
135
|
+
# Returns a list of API keys associated with the device
|
136
|
+
def keys
|
137
|
+
::M2X::Client::Key.list(@client, params.merge(device: self["id"]))
|
138
|
+
end
|
139
|
+
|
140
|
+
# Creates a new API key associated to the device
|
141
|
+
#
|
142
|
+
# If a parameter named `stream` is supplied with a stream name, it
|
143
|
+
# will create an API key associated with that stream only.
|
144
|
+
def create_key(params)
|
145
|
+
::M2X::Client::Key.create!(@client, params.merge(device: self["id"]))
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Wrapper for AT&T M2X Distribution API
|
2
|
+
# https://m2x.att.com/developer/documentation/v2/distribution
|
3
|
+
class M2X::Client::Distribution < M2X::Client::Resource
|
4
|
+
|
5
|
+
PATH = "/distributions"
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Retrieve list of device distributions accessible by the authenticated
|
9
|
+
# API key.
|
10
|
+
#
|
11
|
+
# https://m2x.att.com/developer/documentation/v2/distribution#List-Distributions
|
12
|
+
def list(client, params={})
|
13
|
+
res = client.get(PATH, params)
|
14
|
+
|
15
|
+
res.json["distributions"].map{ |atts| new(client, atts) } if res.success?
|
16
|
+
end
|
17
|
+
alias_method :search, :list
|
18
|
+
|
19
|
+
# Create a new device distribution
|
20
|
+
#
|
21
|
+
# https://m2x.att.com/developer/documentation/v2/distribution#Create-Distribution
|
22
|
+
def create!(client, params)
|
23
|
+
res = client.post(PATH, nil, params, "Content-Type" => "application/json")
|
24
|
+
|
25
|
+
new(client, res.json) if res.success?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def path
|
30
|
+
@path ||= "#{ PATH }/#{ URI.encode(@attributes.fetch("id")) }"
|
31
|
+
end
|
32
|
+
|
33
|
+
# Retrieve list of devices added to the specified distribution.
|
34
|
+
#
|
35
|
+
# https://m2x.att.com/developer/documentation/v2/distribution#List-Devices-from-an-existing-Distribution
|
36
|
+
def devices(params={})
|
37
|
+
res = @client.get("#{path}/devices", params)
|
38
|
+
|
39
|
+
res.json["devices"].map{ |atts| ::M2X::Client::Device.new(@client, atts) } if res.success?
|
40
|
+
end
|
41
|
+
|
42
|
+
# Add a new device to an existing distribution
|
43
|
+
#
|
44
|
+
# Accepts a `serial` parameter, that must be a unique identifier
|
45
|
+
# within this distribution.
|
46
|
+
#
|
47
|
+
# https://m2x.att.com/developer/documentation/v2/distribution#Add-Device-to-an-existing-Distribution
|
48
|
+
def add_device(serial)
|
49
|
+
res = @client.post("#{path}/devices", nil, { serial: serial }, "Content-Type" => "application/json")
|
50
|
+
|
51
|
+
::M2X::Client::Device.new(@client, res.json) if res.success?
|
52
|
+
end
|
53
|
+
end
|
data/lib/m2x/key.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Wrapper for AT&T M2X Keys API
|
2
|
+
# https://m2x.att.com/developer/documentation/v2/keys
|
3
|
+
class M2X::Client::Key < M2X::Client::Resource
|
4
|
+
|
5
|
+
PATH = "/keys"
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Retrieve list of keys associated with the user account.
|
9
|
+
#
|
10
|
+
# https://m2x.att.com/developer/documentation/v2/keys#List-Keys
|
11
|
+
def list(client, params={})
|
12
|
+
res = client.get(PATH, params)
|
13
|
+
|
14
|
+
res.json["keys"].map{ |atts| new(client, atts) } if res.success?
|
15
|
+
end
|
16
|
+
|
17
|
+
# Create a new API Key
|
18
|
+
#
|
19
|
+
# Note that, according to the parameters sent, you can create a
|
20
|
+
# Master API Key or a Device/Stream API Key.
|
21
|
+
#
|
22
|
+
# https://m2x.att.com/developer/documentation/v2/keys#Create-Key
|
23
|
+
def create!(client, params={})
|
24
|
+
res = client.post(PATH, nil, params, "Content-Type" => "application/json")
|
25
|
+
|
26
|
+
new(client, res.json) if res.success?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def path
|
31
|
+
@path ||= "#{ PATH }/#{ URI.encode(@attributes.fetch("key")) }"
|
32
|
+
end
|
33
|
+
|
34
|
+
# Regenerate an API Key token
|
35
|
+
#
|
36
|
+
# Note that if you regenerate the key that you're using for
|
37
|
+
# authentication then you would need to change your scripts to
|
38
|
+
# start using the new key token for all subsequent requests.
|
39
|
+
#
|
40
|
+
# https://m2x.att.com/developer/documentation/v2/keys#Regenerate-Key
|
41
|
+
def regenerate
|
42
|
+
res = @client.post("#{path}/regenerate", nil, {})
|
43
|
+
|
44
|
+
if res.success?
|
45
|
+
@path = nil
|
46
|
+
@attributes = res.json
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/m2x/resource.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
# Wrapper for M2X::Client resources
|
4
|
+
class M2X::Client::Resource
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
attr_reader :attributes
|
8
|
+
|
9
|
+
def_delegator :@attributes, :[]
|
10
|
+
|
11
|
+
def initialize(client, attributes)
|
12
|
+
@client = client
|
13
|
+
@attributes = attributes
|
14
|
+
end
|
15
|
+
|
16
|
+
# Return the resource details
|
17
|
+
def view
|
18
|
+
res = @client.get(path)
|
19
|
+
|
20
|
+
@attributes = res.json if res.success?
|
21
|
+
end
|
22
|
+
|
23
|
+
# Update an existing resource details
|
24
|
+
def update!(params)
|
25
|
+
@client.put(path, nil, params, "Content-Type" => "application/json")
|
26
|
+
end
|
27
|
+
|
28
|
+
# Delete the resource
|
29
|
+
def delete!
|
30
|
+
@client.delete(path)
|
31
|
+
end
|
32
|
+
|
33
|
+
def inspect
|
34
|
+
"<#{self.class.name}: #{attributes.inspect}>"
|
35
|
+
end
|
36
|
+
|
37
|
+
def path
|
38
|
+
raise NotImplementedError
|
39
|
+
end
|
40
|
+
end
|