snitcher 0.4.0.rc1 → 0.4.0.rc2
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/Gemfile +0 -1
- data/README.md +3 -27
- data/Rakefile +0 -3
- data/examples/api.rb +51 -0
- data/lib/snitcher/api/client.rb +37 -36
- data/lib/snitcher/version.rb +1 -1
- data/spec/api/client_spec.rb +24 -71
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d59a08f5f3886dc3f7b0aef1943627c22795c2f
|
4
|
+
data.tar.gz: 108054b71ff9b607b91ac3808d01e8c9173b5b0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fb6accdbc955dd55cf0f1e1a994660557a2425882fe125fa09caa1051510585bc4fea89d4f56bc7588985bf01c487b35b78db8b0b454b5b6c7fe5813786e930
|
7
|
+
data.tar.gz: 3dfdbc8579aac588a50626ed6993bbbf380ca0579c355554a9711fd1d9d0aaa57d84ef03a04f984f1e0e21beccef787e0b7ab2a272f9685461e9a9fac11bd7e2
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -82,8 +82,7 @@ Returns a Snitch.
|
|
82
82
|
### Retrieve Snitches That Match a Set of Tags
|
83
83
|
|
84
84
|
```ruby
|
85
|
-
tags
|
86
|
-
client.tagged_snitches(tags)
|
85
|
+
client.snitches(tags: ["critical", "sales"])
|
87
86
|
```
|
88
87
|
|
89
88
|
Returns an array of Snitches.
|
@@ -141,29 +140,6 @@ client.remove_tag(token, tag)
|
|
141
140
|
|
142
141
|
Returns an array of all of the Snitch's remaining tags.
|
143
142
|
|
144
|
-
### Replace Tags on a Snitch
|
145
|
-
|
146
|
-
Replaces all of a Snitch's tags with an array of new tags.
|
147
|
-
|
148
|
-
```ruby
|
149
|
-
token = "c2354d53d2"
|
150
|
-
tags = ["csv", "server_a"]
|
151
|
-
client.replace_tags(token, tags)
|
152
|
-
```
|
153
|
-
|
154
|
-
Returns the updated Snitch.
|
155
|
-
|
156
|
-
### Remove Tags From a Snitch
|
157
|
-
|
158
|
-
Removes all of a Snitch's tags.
|
159
|
-
|
160
|
-
```ruby
|
161
|
-
token = "c2354d53d2"
|
162
|
-
client.clear_tags(token)
|
163
|
-
```
|
164
|
-
|
165
|
-
Returns the updated Snitch.
|
166
|
-
|
167
143
|
### Pause a Snitch
|
168
144
|
|
169
145
|
```ruby
|
@@ -171,7 +147,7 @@ token = "c2354d53d2"
|
|
171
147
|
client.pause_snitch(token)
|
172
148
|
```
|
173
149
|
|
174
|
-
Returns a
|
150
|
+
Returns a nil object.
|
175
151
|
|
176
152
|
### Delete a Snitch
|
177
153
|
|
@@ -180,7 +156,7 @@ token = "c2354d53d2"
|
|
180
156
|
client.delete_snitch(token)
|
181
157
|
```
|
182
158
|
|
183
|
-
Returns a
|
159
|
+
Returns a nil object.
|
184
160
|
|
185
161
|
## Contributing
|
186
162
|
|
data/Rakefile
CHANGED
data/examples/api.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
$:.unshift File.expand_path("../../lib", __FILE__)
|
2
|
+
|
3
|
+
# Need to require the API separately as it is not required by Snitcher itself.
|
4
|
+
require "snitcher/api"
|
5
|
+
|
6
|
+
if !(ENV["DMS_USER"] && ENV["DMS_PASS"])
|
7
|
+
puts "Set DMS_USER and DMS_PASS environment variables to your"
|
8
|
+
puts "deadmanssnitch.com credentials before running this example"
|
9
|
+
puts
|
10
|
+
puts "example: DMS_USER=email DMS_PASS=pass ruby examples/api.rb"
|
11
|
+
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get an API key for a given user with password
|
16
|
+
key = Snitcher::API.get_key(ENV["DMS_USER"], ENV["DMS_PASS"])
|
17
|
+
|
18
|
+
# Create a new API client
|
19
|
+
client = Snitcher::API::Client.new(key)
|
20
|
+
|
21
|
+
# Create an hourly Snitch called "Monitor All The Things"
|
22
|
+
snitch = client.create_snitch({
|
23
|
+
name: "Monitor All The Things",
|
24
|
+
tags: ["things"],
|
25
|
+
interval: "hourly",
|
26
|
+
})
|
27
|
+
puts "Created: #{snitch.inspect}"
|
28
|
+
|
29
|
+
# Change the name and notes of an existing Snitch
|
30
|
+
snitch = client.update_snitch(snitch.token, {
|
31
|
+
name: "Monitor Fewer Things",
|
32
|
+
notes: "Only monitoring a couple things",
|
33
|
+
})
|
34
|
+
|
35
|
+
# Add new tags to a Snitch
|
36
|
+
snitch.tags = client.add_tags(snitch.token, ["production", "critical issues"])
|
37
|
+
|
38
|
+
# Remove the "critical issues" tag from the Snitch
|
39
|
+
snitch.tags = client.remove_tag(snitch.token, "critical issues")
|
40
|
+
|
41
|
+
# Get a list of Snitches tagged with "production"
|
42
|
+
production = client.snitches(tags: ["production"])
|
43
|
+
puts "Production Snitches:"
|
44
|
+
production.each { |s| puts " - #{s.inspect}"}
|
45
|
+
|
46
|
+
# Pause a Snitch if it's currently missing or errored
|
47
|
+
client.pause_snitch(snitch.token)
|
48
|
+
|
49
|
+
# Delete a Snitch
|
50
|
+
client.delete_snitch(snitch.token)
|
51
|
+
puts "Deleted: #{snitch.token}"
|
data/lib/snitcher/api/client.rb
CHANGED
@@ -35,16 +35,46 @@ class Snitcher::API::Client
|
|
35
35
|
|
36
36
|
# Get the list snitches on the account
|
37
37
|
#
|
38
|
+
# @param [Hash] filters
|
39
|
+
# @option filters [String, Array<String>] tags only return Snitches that are
|
40
|
+
# tagged with _all_ of the given tags. For example, if a Snitch is tagged
|
41
|
+
# with "production" and "critical" it will be returned when filtering by
|
42
|
+
# "production", "critical", or ["production", "critical"] but not
|
43
|
+
# ["production", "backups"].
|
44
|
+
#
|
38
45
|
# @example List the Snitches on an account
|
39
|
-
#
|
40
|
-
#
|
46
|
+
# client.snitches
|
47
|
+
# # => [ #<Snitcher::API::Snitch:...>, #<Snitcher::API::Snitch:...> ]
|
48
|
+
#
|
49
|
+
# @example List Snitches with a specific tag
|
50
|
+
# client.snitches(tags: "production")
|
51
|
+
# # => [ #<Snitcher::API::Snitch:...>, #<Snitcher::API::Snitch:...> ]
|
52
|
+
#
|
53
|
+
# @example List Snitches with multiple tags
|
54
|
+
# client.snitches(tags: ["production", "critical"])
|
55
|
+
# # => [ #<Snitcher::API::Snitch:...>, #<Snitcher::API::Snitch:...> ]
|
41
56
|
#
|
42
57
|
# @raise [Timeout::Error] if the API request took too long to execute.
|
43
58
|
# @raise [Snitcher::API::Error] if any API errors occur.
|
44
59
|
#
|
45
60
|
# @return [Array<Snitcher::API::Snitch>] the snitches on the account.
|
46
|
-
def snitches
|
47
|
-
|
61
|
+
def snitches(filters = {})
|
62
|
+
path = "/v1/snitches"
|
63
|
+
query = {}
|
64
|
+
|
65
|
+
# Tags allow for labeling Snitches for better categorization. This allows
|
66
|
+
# filtering by a set of tags.
|
67
|
+
if filters[:tags]
|
68
|
+
tags = Array(filters[:tags]).flatten
|
69
|
+
query[:tags] = tags.map(&:strip).compact.uniq.join(",")
|
70
|
+
end
|
71
|
+
|
72
|
+
# Only add the query param if any valid filters were given.
|
73
|
+
if query.any?
|
74
|
+
path = "#{path}?#{URI.encode_www_form(query)}"
|
75
|
+
end
|
76
|
+
|
77
|
+
snitch_array(get(path))
|
48
78
|
end
|
49
79
|
|
50
80
|
# Get a single Snitch by it's unique token.
|
@@ -67,36 +97,6 @@ class Snitcher::API::Client
|
|
67
97
|
Snitcher::API::Snitch.new(payload)
|
68
98
|
end
|
69
99
|
|
70
|
-
# Retrieve Snitches filtered by a list of tags. Only Snitches that are tagged
|
71
|
-
# with all of the given tags will be returned.
|
72
|
-
#
|
73
|
-
# @param tags [String, Array<String>] the tag(s) to filter by.
|
74
|
-
#
|
75
|
-
# @example Get the snitches that match a list of tags
|
76
|
-
# client.tagged_snitches(["production","critical"])
|
77
|
-
#
|
78
|
-
# # => [
|
79
|
-
# #<Snitcher::API::Snitch tags=["production", "critical"]>,
|
80
|
-
# #<Snitcher::API::Snitch tags=["production", "critical"]>,
|
81
|
-
# ]
|
82
|
-
#
|
83
|
-
# @raise [Timeout::Error] if the API request took too long to execute.
|
84
|
-
# with that token
|
85
|
-
# @raise [Snitcher::API::Error] if any API errors occur.
|
86
|
-
#
|
87
|
-
# @return [Array<Snitcher::API::Snitch>] list of Snitches matching all tags.
|
88
|
-
def tagged_snitches(*tags)
|
89
|
-
(tags ||= []).flatten!
|
90
|
-
|
91
|
-
query = URI.encode_www_form({
|
92
|
-
# Strip extra spaces, dedupe, and clean up the list of tags to be filtered
|
93
|
-
# by.
|
94
|
-
tags: tags.map(&:strip).compact.uniq.join(","),
|
95
|
-
})
|
96
|
-
|
97
|
-
snitch_array(get("/v1/snitches?#{query}"))
|
98
|
-
end
|
99
|
-
|
100
100
|
# Create a new Snitch.
|
101
101
|
#
|
102
102
|
# @param [Hash] attributes The properties for the new Snitch
|
@@ -113,7 +113,7 @@ class Snitcher::API::Client
|
|
113
113
|
# @example Create a new Snitch
|
114
114
|
# client.create_snitch({
|
115
115
|
# name: "Daily Backups",
|
116
|
-
#
|
116
|
+
# interval: "hourly",
|
117
117
|
# notes: "On error check the print tray for paper jams",
|
118
118
|
# tags: [ "backups", "maintenance" ],
|
119
119
|
# })
|
@@ -227,7 +227,8 @@ 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
|
-
|
230
|
+
path = "/v1/snitches/#{token}/tags/#{tag}"
|
231
|
+
delete(URI.encode(path))
|
231
232
|
end
|
232
233
|
|
233
234
|
# Pauses a Snitch if it can be paused. Snitches can only be paused if their
|
data/lib/snitcher/version.rb
CHANGED
data/spec/api/client_spec.rb
CHANGED
@@ -60,6 +60,22 @@ describe Snitcher::API::Client do
|
|
60
60
|
expect(client.snitches).to be_a(Array)
|
61
61
|
expect(client.snitches.first).to be_a(Snitcher::API::Snitch)
|
62
62
|
end
|
63
|
+
|
64
|
+
it "allows filtering by a tag" do
|
65
|
+
request = stub_request(:get, "#{snitch_url}?tags=production")
|
66
|
+
.to_return(body: body, status: 200)
|
67
|
+
|
68
|
+
client.snitches(tags: "production")
|
69
|
+
expect(request).to have_been_made.once
|
70
|
+
end
|
71
|
+
|
72
|
+
it "allows filtering by multiple tags" do
|
73
|
+
request = stub_request(:get, "#{snitch_url}?tags=phoenix%20foundary,murggle")
|
74
|
+
.to_return(body: body, status: 200)
|
75
|
+
|
76
|
+
client.snitches(tags: ["phoenix foundary", "murggle"])
|
77
|
+
expect(request).to have_been_made.once
|
78
|
+
end
|
63
79
|
end
|
64
80
|
|
65
81
|
describe "#snitch" do
|
@@ -99,77 +115,6 @@ describe Snitcher::API::Client do
|
|
99
115
|
end
|
100
116
|
end
|
101
117
|
|
102
|
-
describe "#tagged_snitches" do
|
103
|
-
let(:tags) { ["sneetch", "belly"] }
|
104
|
-
let(:url) { "#{snitch_url}?tags=sneetch,belly" }
|
105
|
-
let(:body) { '[
|
106
|
-
{
|
107
|
-
"token": "c2354d53d2",
|
108
|
-
"href": "/v1/snitches/c2354d53d2",
|
109
|
-
"name": "Best Kind of Sneetch on the Beach",
|
110
|
-
"tags": [
|
111
|
-
"sneetch",
|
112
|
-
"belly",
|
113
|
-
"star-belly"
|
114
|
-
],
|
115
|
-
"status": "pending",
|
116
|
-
"checked_in_at": "",
|
117
|
-
"type": {
|
118
|
-
"interval": "hourly"
|
119
|
-
}
|
120
|
-
},
|
121
|
-
{
|
122
|
-
"token": "c2354d53d3",
|
123
|
-
"href": "/v1/snitches/c2354d53d3",
|
124
|
-
"name": "Have None Upon Thars",
|
125
|
-
"tags": [
|
126
|
-
"sneetch",
|
127
|
-
"belly",
|
128
|
-
"plain-belly"
|
129
|
-
],
|
130
|
-
"status": "pending",
|
131
|
-
"checked_in_at": "",
|
132
|
-
"type": {
|
133
|
-
"interval": "hourly"
|
134
|
-
}
|
135
|
-
}
|
136
|
-
]'
|
137
|
-
}
|
138
|
-
|
139
|
-
before do
|
140
|
-
stub_request(:get, stub_url).to_return(:body => body, :status => 200)
|
141
|
-
end
|
142
|
-
|
143
|
-
it "pings API with the api_key" do
|
144
|
-
client.tagged_snitches(tags)
|
145
|
-
|
146
|
-
expect(a_request(:get, url)).to have_been_made.once
|
147
|
-
end
|
148
|
-
|
149
|
-
it "returns the snitches" do
|
150
|
-
expect(client.tagged_snitches(tags)).to be_a(Array)
|
151
|
-
expect(client.tagged_snitches(tags).first).to be_a(Snitcher::API::Snitch)
|
152
|
-
end
|
153
|
-
|
154
|
-
it "supports spaces in tags" do
|
155
|
-
request = stub_request(:get, "#{snitch_url}?tags=phoenix%20foundary,murggle").
|
156
|
-
to_return(body: body, status: 200)
|
157
|
-
|
158
|
-
client.tagged_snitches("phoenix foundary", "murggle")
|
159
|
-
|
160
|
-
expect(request).to have_been_made.once
|
161
|
-
end
|
162
|
-
|
163
|
-
it "allows an array to be passed for tags" do
|
164
|
-
request = stub_request(:get, "#{snitch_url}?tags=murggle,gurgggle").
|
165
|
-
to_return(body: body, status: 200)
|
166
|
-
|
167
|
-
client.tagged_snitches(["murggle", "gurgggle"])
|
168
|
-
|
169
|
-
expect(request).to have_been_made.once
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
118
|
describe "#create_snitch" do
|
174
119
|
let(:data) {
|
175
120
|
{
|
@@ -442,6 +387,14 @@ describe Snitcher::API::Client do
|
|
442
387
|
|
443
388
|
expect(a_request(:delete, url)).to have_been_made.once
|
444
389
|
end
|
390
|
+
|
391
|
+
it "properly escapes tags with spaces" do
|
392
|
+
request = stub_request(:delete, "#{snitch_url}/c2354d53d2/tags/tag%20with%20spaces").
|
393
|
+
to_return(:body => body, :status => 200)
|
394
|
+
|
395
|
+
client.remove_tag(token, "tag with spaces")
|
396
|
+
expect(request).to have_been_made.once
|
397
|
+
end
|
445
398
|
|
446
399
|
context "when successful" do
|
447
400
|
it "returns an array of the snitch's remaining tags" do
|
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.rc2
|
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-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- Rakefile
|
55
55
|
- bin/snitch
|
56
56
|
- doc/get_them_stitches.jpg
|
57
|
+
- examples/api.rb
|
57
58
|
- lib/snitcher.rb
|
58
59
|
- lib/snitcher/api.rb
|
59
60
|
- lib/snitcher/api/client.rb
|
@@ -102,4 +103,3 @@ test_files:
|
|
102
103
|
- spec/spec_helper.rb
|
103
104
|
- spec/support/random.rb
|
104
105
|
- spec/support/webmock.rb
|
105
|
-
has_rdoc:
|