snitcher 0.4.0.rc2 → 0.4.0.rc4
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -4
- data/CHANGELOG.md +2 -1
- data/README.md +24 -9
- data/lib/snitcher.rb +26 -6
- data/lib/snitcher/api/client.rb +40 -39
- data/lib/snitcher/version.rb +1 -1
- data/spec/snitcher_spec.rb +31 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 269d8a39f4f95c7cf5d1d574d7e0db92f3ca3d95
|
4
|
+
data.tar.gz: 9b6ce02c920e04cb8e544b0d1b2d0b2510626ca5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 394d5c82f089074d385f237da314701ea7cf00a353d2339698f90da97a988a4387c41ce7c422bdfddc42719026b9721c5e737f90ba21379883e4bdb8705571f7
|
7
|
+
data.tar.gz: b9126ddc040154e125d763a13cfef5b09897d916fcb04c49cce36a00af93b1b838dd96bd8bb05e725a8bc15d0dce5baa7f409ef060266ff912f424bacdaaf754
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
## 0.4.0 / TBD
|
2
|
-
* [FEATURE]
|
2
|
+
* [FEATURE] Added Snitcher::API for integrating with the DMS API ([@danabrit](https://github.com/danabrit))
|
3
|
+
* [FEATURE] Added Snitcher.snitch! which raises exceptions on errors ([@gaffneyc](https://github.com/gaffneyc))
|
3
4
|
|
4
5
|
## 0.3.2 / 2015-08-13
|
5
6
|
* [BUG] Fixed passing messaging during a check-in ([@ryoung](https://github.com/ryoung))
|
data/README.md
CHANGED
@@ -89,14 +89,15 @@ Returns an array of Snitches.
|
|
89
89
|
|
90
90
|
### Create a Snitch
|
91
91
|
|
92
|
-
|
93
|
-
tags.
|
92
|
+
Both `:name` and `:interval` are required. Optional attributes include `:notes`,
|
93
|
+
and `:tags`. For a full list see [the API documentation](https://deadmanssnitch.com/docs/api/v1#creating-a-snitch).
|
94
94
|
|
95
95
|
```ruby
|
96
|
-
attributes = {
|
97
|
-
|
98
|
-
|
99
|
-
|
96
|
+
attributes = {
|
97
|
+
name: "Nightly User Data Backups",
|
98
|
+
interval: "daily",
|
99
|
+
notes: "User login and usage data",
|
100
|
+
tags: ["users", "critical"],
|
100
101
|
}
|
101
102
|
client.create_snitch(attributes)
|
102
103
|
```
|
@@ -110,8 +111,8 @@ change. The rest of a Snitch's attributes will remain the same.
|
|
110
111
|
|
111
112
|
```ruby
|
112
113
|
token = "c2354d53d2"
|
113
|
-
|
114
|
-
client.update_snitch(token,
|
114
|
+
attrs = { "name": "Important Nightly User Data Backups" }
|
115
|
+
client.update_snitch(token, attrs)
|
115
116
|
```
|
116
117
|
|
117
118
|
Returns the edited Snitch.
|
@@ -122,7 +123,7 @@ This function adds tags to a Snitch, retaining whatever tags it already has.
|
|
122
123
|
|
123
124
|
```ruby
|
124
125
|
token = "c2354d53d2"
|
125
|
-
tags
|
126
|
+
tags = ["spring_campaign", "support"]
|
126
127
|
client.add_tags(token, tags)
|
127
128
|
```
|
128
129
|
|
@@ -140,6 +141,20 @@ client.remove_tag(token, tag)
|
|
140
141
|
|
141
142
|
Returns an array of all of the Snitch's remaining tags.
|
142
143
|
|
144
|
+
### Setting the Tags on a Snitch
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
token = "c2354d53d2"
|
148
|
+
client.update_snitch(token, tags: [ "production", "critical" ])
|
149
|
+
```
|
150
|
+
|
151
|
+
### Removing all Tags from a Snitch
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
token = "c2354d53d2"
|
155
|
+
client.update_snitch(token, tags: [])
|
156
|
+
```
|
157
|
+
|
143
158
|
### Pause a Snitch
|
144
159
|
|
145
160
|
```ruby
|
data/lib/snitcher.rb
CHANGED
@@ -6,7 +6,7 @@ require "snitcher/version"
|
|
6
6
|
module Snitcher
|
7
7
|
extend self
|
8
8
|
|
9
|
-
# Check-in to Dead Man's Snitch.
|
9
|
+
# Check-in to Dead Man's Snitch, exceptions are raised on failures.
|
10
10
|
#
|
11
11
|
# @param token [String] The unique Snitch token to check-in with. This can be
|
12
12
|
# found on the Setup page as the last part of the HTTP check-in url. For
|
@@ -19,16 +19,13 @@ module Snitcher
|
|
19
19
|
#
|
20
20
|
# @option opts [Float, Fixnum] :timeout Number of seconds to wait for a
|
21
21
|
# response from the server. Default is 5 seconds.
|
22
|
-
# no
|
23
22
|
#
|
24
23
|
# @example
|
25
24
|
# Snitch.snitch("c2354d53d2")
|
26
25
|
# # => true
|
27
26
|
#
|
28
|
-
# @raise [Timeout::Error] if the request took too long and timed out.
|
29
|
-
#
|
30
27
|
# @return [Boolean] if the check-in succeeded.
|
31
|
-
def snitch(token, opts = {})
|
28
|
+
def snitch!(token, opts = {})
|
32
29
|
uri = URI.parse(checkin_url(opts, token))
|
33
30
|
uri.query = URI.encode_www_form(m: opts[:message]) if opts[:message]
|
34
31
|
|
@@ -41,7 +38,30 @@ module Snitcher
|
|
41
38
|
response = http.request(request)
|
42
39
|
response.is_a?(Net::HTTPSuccess)
|
43
40
|
end
|
44
|
-
|
41
|
+
end
|
42
|
+
|
43
|
+
# Check-in to Dead Man's Snitch.
|
44
|
+
#
|
45
|
+
# @param token [String] The unique Snitch token to check-in with. This can be
|
46
|
+
# found on the Setup page as the last part of the HTTP check-in url. For
|
47
|
+
# example, c2354d53d2 is the token in http://nosnch.in/c2354d53d2.
|
48
|
+
#
|
49
|
+
# @param [Hash] opts
|
50
|
+
#
|
51
|
+
# @option opts [String] :message Text message to include with the check-in.
|
52
|
+
# The message is limited to 256 characters.
|
53
|
+
#
|
54
|
+
# @option opts [Float, Fixnum] :timeout Number of seconds to wait for a
|
55
|
+
# response from the server. Default is 5 seconds.
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# Snitch.snitch("c2354d53d2")
|
59
|
+
# # => true
|
60
|
+
#
|
61
|
+
# @return [Boolean] if the check-in succeeded.
|
62
|
+
def snitch(*args)
|
63
|
+
snitch!(*args)
|
64
|
+
rescue StandardError
|
45
65
|
false
|
46
66
|
end
|
47
67
|
|
data/lib/snitcher/api/client.rb
CHANGED
@@ -59,22 +59,22 @@ class Snitcher::API::Client
|
|
59
59
|
#
|
60
60
|
# @return [Array<Snitcher::API::Snitch>] the snitches on the account.
|
61
61
|
def snitches(filters = {})
|
62
|
-
path = "/v1/snitches"
|
63
62
|
query = {}
|
64
63
|
|
65
64
|
# Tags allow for labeling Snitches for better categorization. This allows
|
66
65
|
# filtering by a set of tags.
|
67
|
-
if filters[:tags]
|
68
|
-
tags = Array(
|
66
|
+
if tags = filters[:tags]
|
67
|
+
tags = Array(tags).flatten
|
69
68
|
query[:tags] = tags.map(&:strip).compact.uniq.join(",")
|
70
69
|
end
|
71
70
|
|
72
|
-
#
|
73
|
-
|
74
|
-
path = "#{path}?#{URI.encode_www_form(query)}"
|
75
|
-
end
|
71
|
+
# JSON array of Snitch attributes
|
72
|
+
response = get("/v1/snitches", query)
|
76
73
|
|
77
|
-
|
74
|
+
# Convert the attributes hashes into Objects
|
75
|
+
response.map! do |snitch|
|
76
|
+
Snitcher::API::Snitch.new(snitch)
|
77
|
+
end
|
78
78
|
end
|
79
79
|
|
80
80
|
# Get a single Snitch by it's unique token.
|
@@ -126,10 +126,10 @@ class Snitcher::API::Client
|
|
126
126
|
# @raise [Snitcher::API::Error] if any other API errors occur.
|
127
127
|
#
|
128
128
|
# @return [Snitcher::API::Snitch] the new Snitch.
|
129
|
-
def create_snitch(attributes={})
|
130
|
-
if attributes.
|
129
|
+
def create_snitch(attributes = {})
|
130
|
+
if interval = attributes.delete(:interval)
|
131
131
|
type = attributes[:type] ||= {}
|
132
|
-
type[:interval] ||=
|
132
|
+
type[:interval] ||= interval
|
133
133
|
end
|
134
134
|
|
135
135
|
response = post("/v1/snitches", attributes)
|
@@ -174,14 +174,15 @@ class Snitcher::API::Client
|
|
174
174
|
# @raise [Snitcher::API::Error] if any other API errors occur.
|
175
175
|
#
|
176
176
|
# Raise Timeout::Error if the API request times out
|
177
|
-
def update_snitch(token, attributes={})
|
177
|
+
def update_snitch(token, attributes = {})
|
178
178
|
if attributes.has_key?(:tags)
|
179
179
|
attributes[:tags] = [attributes[:tags]].flatten.compact
|
180
180
|
end
|
181
181
|
|
182
|
-
|
182
|
+
# Expand the interval key to the full structure required by the API
|
183
|
+
if interval = attributes.delete(:interval)
|
183
184
|
type = attributes[:type] ||= {}
|
184
|
-
type[:interval] ||=
|
185
|
+
type[:interval] ||= interval
|
185
186
|
end
|
186
187
|
|
187
188
|
payload = patch("/v1/snitches/#{token}", attributes)
|
@@ -207,9 +208,8 @@ class Snitcher::API::Client
|
|
207
208
|
# @raise [Snitcher::API::Error] if an API errors occur.
|
208
209
|
#
|
209
210
|
# @return [Array<String>] full list of tags on the Snitch.
|
210
|
-
def add_tags(token, tags=[])
|
211
|
-
tags
|
212
|
-
post("/v1/snitches/#{token}/tags", tags)
|
211
|
+
def add_tags(token, tags = [])
|
212
|
+
post("/v1/snitches/#{token}/tags", Array(tags).flatten)
|
213
213
|
end
|
214
214
|
|
215
215
|
# Remove a tag from a Snitch.
|
@@ -227,8 +227,7 @@ class Snitcher::API::Client
|
|
227
227
|
#
|
228
228
|
# @return [Array<String>] list of the remaining tags on the Snitch.
|
229
229
|
def remove_tag(token, tag)
|
230
|
-
|
231
|
-
delete(URI.encode(path))
|
230
|
+
delete("/v1/snitches/#{token}/tags/#{tag}")
|
232
231
|
end
|
233
232
|
|
234
233
|
# Pauses a Snitch if it can be paused. Snitches can only be paused if their
|
@@ -279,7 +278,7 @@ class Snitcher::API::Client
|
|
279
278
|
"Snitcher; #{engine}/#{RUBY_VERSION}; #{RUBY_PLATFORM}; v#{::Snitcher::VERSION}"
|
280
279
|
end
|
281
280
|
|
282
|
-
def execute_request(request
|
281
|
+
def execute_request(request)
|
283
282
|
http_options = {
|
284
283
|
open_timeout: @timeout,
|
285
284
|
read_timeout: @timeout,
|
@@ -295,7 +294,7 @@ class Snitcher::API::Client
|
|
295
294
|
if request.body
|
296
295
|
request["Content-Type"] = "application/json"
|
297
296
|
|
298
|
-
# Some
|
297
|
+
# Some trickery to allow pushing the JSON rendering down as far as
|
299
298
|
# possible.
|
300
299
|
if !request.body.is_a?(String)
|
301
300
|
request.body = JSON.generate(request.body)
|
@@ -326,37 +325,39 @@ class Snitcher::API::Client
|
|
326
325
|
end
|
327
326
|
end
|
328
327
|
|
329
|
-
def get(path,
|
328
|
+
def get(path, query = {})
|
329
|
+
path = URI.encode(path)
|
330
|
+
|
331
|
+
# Only add the query param if any valid filters were given.
|
332
|
+
if query.any?
|
333
|
+
path = "#{path}?#{URI.encode_www_form(query)}"
|
334
|
+
end
|
335
|
+
|
330
336
|
request = Net::HTTP::Get.new(path)
|
331
|
-
execute_request(request
|
337
|
+
execute_request(request)
|
332
338
|
end
|
333
339
|
|
334
|
-
def post(path, data=nil
|
340
|
+
def post(path, data = nil)
|
341
|
+
path = URI.encode(path)
|
342
|
+
|
335
343
|
request = Net::HTTP::Post.new(path)
|
336
344
|
request.body = data
|
337
345
|
|
338
|
-
execute_request(request
|
346
|
+
execute_request(request)
|
339
347
|
end
|
340
348
|
|
341
|
-
def patch(path, data
|
349
|
+
def patch(path, data)
|
350
|
+
path = URI.encode(path)
|
351
|
+
|
342
352
|
request = Net::HTTP::Patch.new(path)
|
343
353
|
request.body = data
|
344
354
|
|
345
|
-
execute_request(request
|
355
|
+
execute_request(request)
|
346
356
|
end
|
347
357
|
|
348
|
-
def delete(path
|
358
|
+
def delete(path)
|
359
|
+
path = URI.encode(path)
|
349
360
|
request = Net::HTTP::Delete.new(path)
|
350
|
-
execute_request(request
|
351
|
-
end
|
352
|
-
|
353
|
-
private
|
354
|
-
|
355
|
-
def snitch_array(json_payload)
|
356
|
-
arr = []
|
357
|
-
json_payload.each do |payload|
|
358
|
-
arr << Snitcher::API::Snitch.new(payload)
|
359
|
-
end
|
360
|
-
arr
|
361
|
+
execute_request(request)
|
361
362
|
end
|
362
363
|
end
|
data/lib/snitcher/version.rb
CHANGED
data/spec/snitcher_spec.rb
CHANGED
@@ -9,15 +9,15 @@ describe Snitcher do
|
|
9
9
|
stub_request(:get, /nosnch\.in/)
|
10
10
|
end
|
11
11
|
|
12
|
-
describe ".snitch" do
|
12
|
+
describe ".snitch!" do
|
13
13
|
it "pings DMS with the given token" do
|
14
|
-
Snitcher.snitch(token)
|
14
|
+
Snitcher.snitch!(token)
|
15
15
|
|
16
16
|
expect(a_request(:get, "https://nosnch.in/#{token}")).to have_been_made.once
|
17
17
|
end
|
18
18
|
|
19
19
|
it "includes a custom user-agent" do
|
20
|
-
Snitcher.snitch(token)
|
20
|
+
Snitcher.snitch!(token)
|
21
21
|
|
22
22
|
expect(
|
23
23
|
a_request(:get, "https://nosnch.in/#{token}").with(
|
@@ -26,42 +26,48 @@ describe Snitcher do
|
|
26
26
|
).to have_been_made
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
stub_request(:get, "https://nosnch.in/#{token}").to_return(status: 200)
|
32
|
-
end
|
29
|
+
it "returns true when successful" do
|
30
|
+
request = stub_request(:get, "https://nosnch.in/#{token}").to_return(status: 202)
|
33
31
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
32
|
+
expect(Snitcher.snitch!(token)).to eq(true)
|
33
|
+
expect(request).to have_been_made.once
|
37
34
|
end
|
38
35
|
|
39
|
-
|
40
|
-
|
41
|
-
stub_request(:get, "https://nosnch.in/#{token}").to_return(status: 404)
|
42
|
-
end
|
36
|
+
it "returns false when unsuccessful" do
|
37
|
+
request = stub_request(:get, "https://nosnch.in/#{token}").to_return(status: 404)
|
43
38
|
|
44
|
-
|
45
|
-
|
46
|
-
end
|
39
|
+
expect(Snitcher.snitch!(token)).to eq(false)
|
40
|
+
expect(request).to have_been_made.once
|
47
41
|
end
|
48
42
|
|
49
43
|
describe "with message" do
|
50
44
|
it "includes the message as a query param" do
|
51
|
-
Snitcher.snitch(token, message: "A thing just happened")
|
45
|
+
Snitcher.snitch!(token, message: "A thing just happened")
|
52
46
|
|
53
47
|
expect(a_request(:get, "https://nosnch.in/#{token}?m=A%20thing%20just%20happened")).to have_been_made
|
54
48
|
end
|
55
49
|
end
|
56
50
|
|
57
|
-
|
58
|
-
|
59
|
-
stub_request(:get, "https://nosnch.in/#{token}").to_raise(::Timeout::Error)
|
60
|
-
end
|
51
|
+
it "raises a Timeout::Error if the request timesout" do
|
52
|
+
stub_request(:get, "https://nosnch.in/#{token}").to_timeout
|
61
53
|
|
62
|
-
|
63
|
-
|
64
|
-
|
54
|
+
expect { Snitcher.snitch!(token) }.to raise_error(Timeout::Error)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe ".snitch" do
|
59
|
+
it "returns true on a successfuly check-in" do
|
60
|
+
stub_request(:get, "https://nosnch.in/#{token}").to_return(status: 202)
|
61
|
+
|
62
|
+
result = Snitcher.snitch(token)
|
63
|
+
expect(result).to be(true)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns false on a timeout" do
|
67
|
+
stub_request(:get, "https://nosnch.in/#{token}").to_timeout
|
68
|
+
|
69
|
+
result = Snitcher.snitch(token)
|
70
|
+
expect(result).to be(false)
|
65
71
|
end
|
66
72
|
end
|
67
73
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snitcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.0.
|
4
|
+
version: 0.4.0.rc4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Collective Idea
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|