deadman_check 0.1.11 → 0.2.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 +65 -26
- data/bin/deadman-check +26 -14
- data/deadman_check.gemspec +1 -0
- data/lib/deadman_check/version.rb +1 -1
- data/lib/deadman_check_keyset.rb +17 -15
- data/lib/deadman_check_switch.rb +63 -27
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60016a96e65047af901a74875d61fd0052cebf86
|
4
|
+
data.tar.gz: 08e97ecbae9e2d7cc68dc80b1dbc0153700ff9f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e41ca251ccfa94ad4731b19a8b9f4ed61fbbecaae6dd9eb4d94517e15faeb640adbb867a2c7c24ef18357081718e467b2096d6406929513bddce67db1b9e129
|
7
|
+
data.tar.gz: c9b409c2cf717875c3645567dba926bc0a57ee659d6e3daebf9cfec1b896342267b8e7870ebd27dee38986ef1411f17b550d069c927f8763bad12311c81371d0
|
data/README.md
CHANGED
@@ -89,7 +89,9 @@ job "SilverBulletPeriodic" {
|
|
89
89
|
"--port",
|
90
90
|
"8500",
|
91
91
|
"--key",
|
92
|
-
"deadman/SilverBulletPeriodicProcess"
|
92
|
+
"deadman/SilverBulletPeriodicProcess",
|
93
|
+
"--frequency",
|
94
|
+
"700"]
|
93
95
|
}
|
94
96
|
resources {
|
95
97
|
cpu = 100
|
@@ -99,8 +101,7 @@ job "SilverBulletPeriodic" {
|
|
99
101
|
}
|
100
102
|
}
|
101
103
|
```
|
102
|
-
|
103
|
-
<img width="1215" alt="screen shot 2017-03-26 at 3 28 50 pm" src="https://cloud.githubusercontent.com/assets/538171/24335809/276147ec-1239-11e7-83d8-0fca95bebdc2.png">
|
104
|
+
<img width="1215" alt="screen shot 2017-04-23 at 11 14 36 pm" src="https://cloud.githubusercontent.com/assets/538171/25324439/b65541d6-287a-11e7-9b6d-4e1c9565eed2.png">
|
104
105
|
|
105
106
|
Now the key, deadman/SilverBulletPeriodicProcess, at 10.0.0.1 will be updated with
|
106
107
|
the EPOCH time for each SilverBulletPeriodic job run. If the job hangs or fails to run
|
@@ -126,8 +127,6 @@ job "DeadmanMonitoring" {
|
|
126
127
|
"8500",
|
127
128
|
"--key",
|
128
129
|
"deadman/SilverBulletPeriodicProcess",
|
129
|
-
"--freshness",
|
130
|
-
"800",
|
131
130
|
"--alert-to",
|
132
131
|
"slackroom",
|
133
132
|
"--daemon",
|
@@ -146,10 +145,52 @@ job "DeadmanMonitoring" {
|
|
146
145
|
}
|
147
146
|
```
|
148
147
|
|
149
|
-
Monitor a Consul key that contains an EPOCH time entry. Send a Slack message if EPOCH age hits given threshold
|
148
|
+
Monitor a Consul key that contains an EPOCH time entry. Send a Slack message if EPOCH age hits given frequency threshold
|
150
149
|
|
151
150
|
<img width="752" alt="screen shot 2017-03-26 at 3 29 28 pm" src="https://cloud.githubusercontent.com/assets/538171/24335811/2e57eee8-1239-11e7-9fff-c8a10d956f2e.png">
|
152
151
|
|
152
|
+
If you have multiple periodic jobs that need to be monitored then use the ```--key-path``` argument instead of ```--key```. Be sure to ```key_set``` all under the same Consul key path.
|
153
|
+
|
154
|
+
<img width="658" alt="screen shot 2017-04-23 at 11 17 29 pm" src="https://cloud.githubusercontent.com/assets/538171/25324510/14d6e7f0-287b-11e7-9c0d-733d69e1cc94.png">
|
155
|
+
|
156
|
+
To monitor the above you would just use the ```--key-path``` argument instead of ```--key```
|
157
|
+
|
158
|
+
```hcl
|
159
|
+
job "DeadmanMonitoring" {
|
160
|
+
datacenters = ["dc1"]
|
161
|
+
type = "service"
|
162
|
+
|
163
|
+
group "monitor" {
|
164
|
+
task "DeadmanMonitorSilverBulletPeriodicProcesses" {
|
165
|
+
driver = "docker"
|
166
|
+
config {
|
167
|
+
image = "sepulworld/deadman-check"
|
168
|
+
command = "switch_monitor"
|
169
|
+
args = [
|
170
|
+
"--host",
|
171
|
+
"10.0.0.1",
|
172
|
+
"--port",
|
173
|
+
"8500",
|
174
|
+
"--key-path",
|
175
|
+
"deadman/",
|
176
|
+
"--alert-to",
|
177
|
+
"slackroom",
|
178
|
+
"--daemon",
|
179
|
+
"--daemon-sleep",
|
180
|
+
"900"]
|
181
|
+
}
|
182
|
+
resources {
|
183
|
+
cpu = 100
|
184
|
+
memory = 256
|
185
|
+
}
|
186
|
+
env {
|
187
|
+
SLACK_API_TOKEN = "YourSlackApiToken"
|
188
|
+
}
|
189
|
+
}
|
190
|
+
}
|
191
|
+
}
|
192
|
+
```
|
193
|
+
|
153
194
|
# Non-Nomad Use:
|
154
195
|
|
155
196
|
## Local system installation
|
@@ -185,8 +226,7 @@ $ deadman-check -h
|
|
185
226
|
|
186
227
|
DESCRIPTION:
|
187
228
|
|
188
|
-
Monitor a Consul key that contains an EPOCH time entry.
|
189
|
-
Send a Slack message if EPOCH age hits given threshold
|
229
|
+
Monitor a Consul key or key-path that contains an EPOCH time entry and frequency. Send Slack message if EPOCH age is greater than given frequency
|
190
230
|
|
191
231
|
COMMANDS:
|
192
232
|
|
@@ -221,12 +261,12 @@ $ deadman-check key_set -h
|
|
221
261
|
|
222
262
|
DESCRIPTION:
|
223
263
|
|
224
|
-
|
264
|
+
key_set will set a consul key that contains the current epoch and time frequency that job should be running at, example key {"epoch":1493010437,"frequency":"300"}
|
225
265
|
|
226
266
|
EXAMPLES:
|
227
267
|
|
228
268
|
# Update a Consul key deadman/myservice, with current EPOCH time
|
229
|
-
deadman-check key_set --host 127.0.0.1 --port 8500 --key deadman/myservice
|
269
|
+
deadman-check key_set --host 127.0.0.1 --port 8500 --key deadman/myservice --frequency 300
|
230
270
|
|
231
271
|
OPTIONS:
|
232
272
|
|
@@ -237,7 +277,10 @@ $ deadman-check key_set -h
|
|
237
277
|
port Consul is listening on
|
238
278
|
|
239
279
|
--key KEY
|
240
|
-
Consul key to
|
280
|
+
Consul key to report EPOCH time and frequency for service
|
281
|
+
|
282
|
+
--frequency FREQUENCY
|
283
|
+
Frequency at which this key should be updated in seconds
|
241
284
|
```
|
242
285
|
|
243
286
|
### Usage for switch_monitor command
|
@@ -255,18 +298,15 @@ $ deadman-check switch_monitor -h
|
|
255
298
|
|
256
299
|
DESCRIPTION:
|
257
300
|
|
258
|
-
|
301
|
+
switch_monitor will monitor either a given key which contains a services last epoch checkin and frequency, or a series of services that set keys under a given key-path in Consul
|
259
302
|
|
260
303
|
EXAMPLES:
|
261
304
|
|
262
|
-
# Target a Consul key deadman/myservice, and this key has an EPOCH
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
--key deadman/myservice \
|
268
|
-
--freshness 500 \
|
269
|
-
--alert-to slackroom
|
305
|
+
# Target a Consul key deadman/myservice, and this key has an EPOCH value to check looking to alert
|
306
|
+
deadman-check switch_monitor --host 127.0.0.1 --port 8500 --key deadman/myservice --alert-to monitoroom
|
307
|
+
|
308
|
+
# Target a Consul key path deadman/, which contains 2 or more service keys to monitor, i.e. deadman/myservice1, deadman/myservice2, deadmman/myservice3 all fall under the path deadman/
|
309
|
+
deadman-check switch_monitor --host 127.0.0.1 --port 8500 --key-path deadman/ --alert-to monitoroom
|
270
310
|
|
271
311
|
OPTIONS:
|
272
312
|
|
@@ -276,15 +316,14 @@ $ deadman-check switch_monitor -h
|
|
276
316
|
--port PORT
|
277
317
|
port Consul is listening on
|
278
318
|
|
279
|
-
--key
|
280
|
-
Consul key to monitor
|
319
|
+
--key-path KEYPATH
|
320
|
+
Consul key path to monitor, performs a recursive key lookup at given path.
|
281
321
|
|
282
|
-
--
|
283
|
-
|
284
|
-
EPOCH value exceeds current EPOCH
|
322
|
+
--key KEY
|
323
|
+
Consul key to monitor, provide this or --key-path if you have multiple keys in a given path.
|
285
324
|
|
286
325
|
--alert-to SLACKROOM
|
287
|
-
Slackroom to alert
|
326
|
+
Slackroom to send alert, don't include the # tag in name
|
288
327
|
|
289
328
|
--daemon
|
290
329
|
Run as a daemon, otherwise will run check just once
|
data/bin/deadman-check
CHANGED
@@ -7,26 +7,37 @@ require 'daemons'
|
|
7
7
|
|
8
8
|
program :name, 'deadman-check'
|
9
9
|
program :version, DeadmanCheck::VERSION
|
10
|
-
program :description, %q{Monitor a Consul key that contains an EPOCH time entry. Send
|
10
|
+
program :description, %q{Monitor a Consul key or key-path that contains an EPOCH time entry and frequency. Send Slack message if EPOCH age is greater than given frequency}
|
11
11
|
|
12
12
|
command :switch_monitor do |c|
|
13
13
|
c.syntax = 'deadman-check switch_monitor [options]'
|
14
14
|
c.summary = 'Target a Consul key to monitor'
|
15
|
-
c.description = ''
|
16
|
-
c.example %q{Target a Consul key deadman/myservice, and this key has an EPOCH value to check looking to alert
|
17
|
-
%q{deadman-check switch_monitor --host 127.0.0.1 --port 8500 --key deadman/myservice --
|
15
|
+
c.description = 'switch_monitor will monitor either a given key which contains a services last epoch checkin and frequency, or a series of services that set keys under a given key-path in Consul'
|
16
|
+
c.example %q{Target a Consul key deadman/myservice, and this key has an EPOCH value to check looking to alert},
|
17
|
+
%q{deadman-check switch_monitor --host 127.0.0.1 --port 8500 --key deadman/myservice --alert-to monitoroom}
|
18
|
+
c.example %q{Target a Consul key path deadman/, which contains 2 or more service keys to monitor, i.e. deadman/myservice1, deadman/myservice2, deadmman/myservice3 all fall under the path deadman/},
|
19
|
+
%q{deadman-check switch_monitor --host 127.0.0.1 --port 8500 --key-path deadman/ --alert-to monitoroom}
|
18
20
|
c.option '--host HOST', String, 'IP address or hostname of Consul system'
|
19
21
|
c.option '--port PORT', String, 'port Consul is listening on'
|
20
|
-
c.option '--key
|
21
|
-
c.option '--
|
22
|
-
|
23
|
-
c.option '--alert-to SLACKROOM', String, 'Slackroom to alert to'
|
22
|
+
c.option '--key-path KEYPATH', String, 'Consul key path to monitor, performs a recursive key lookup at given path.'
|
23
|
+
c.option '--key KEY', String, 'Consul key to monitor, provide this or --key-path if you have multiple keys in a given path.'
|
24
|
+
c.option '--alert-to SLACKROOM', String, 'Slackroom to send alert, don\'t include the # tag in name'
|
24
25
|
c.option '--daemon', 'Run as a daemon, otherwise will run check just once'
|
25
26
|
c.option '--daemon-sleep SECONDS', String, 'Set the number of seconds to sleep in between switch checks, default 300'
|
26
27
|
c.action do |args, options|
|
27
28
|
options.default :daemon_sleep => 300
|
29
|
+
if options.key_path && options.key
|
30
|
+
abort("Specify --key-path or --key, don't specify both")
|
31
|
+
end
|
32
|
+
if options.key
|
33
|
+
target = options.key
|
34
|
+
recurse = false
|
35
|
+
else
|
36
|
+
target = options.key_path
|
37
|
+
recurse = true
|
38
|
+
end
|
28
39
|
switch_monitor = DeadmanCheck::SwitchMonitor.new(options.host, options.port,
|
29
|
-
|
40
|
+
target, options.alert_to, recurse, options.daemon_sleep)
|
30
41
|
if options.daemon
|
31
42
|
Daemons.run(switch_monitor.run_check_daemon)
|
32
43
|
else
|
@@ -38,15 +49,16 @@ end
|
|
38
49
|
command :key_set do |c|
|
39
50
|
c.syntax = 'deadman-check key_set [options]'
|
40
51
|
c.summary = 'Update a given Consul key with current EPOCH'
|
41
|
-
c.description = ''
|
52
|
+
c.description = 'key_set will set a consul key that contains the current epoch and time frequency for which the job being monitored runs at, example key {"epoch":1493010437,"frequency":"300"}'
|
42
53
|
c.example %q{Update a Consul key deadman/myservice, with current EPOCH time},
|
43
|
-
%q{deadman-check key_set --host 127.0.0.1 --port 8500 --key deadman/myservice}
|
54
|
+
%q{deadman-check key_set --host 127.0.0.1 --port 8500 --key deadman/myservice --frequency 300}
|
44
55
|
c.option '--host HOST', String, 'IP address or hostname of Consul system'
|
45
56
|
c.option '--port PORT', String, 'port Consul is listening on'
|
46
|
-
c.option '--key KEY', String, 'Consul key to report EPOCH time
|
57
|
+
c.option '--key KEY', String, 'Consul key to report EPOCH time and frequency for service'
|
58
|
+
c.option '--frequency FREQUENCY', String, 'Frequency at which this key should be updated in seconds'
|
47
59
|
c.action do |args, options|
|
48
|
-
key_set = DeadmanCheck::KeySet.new(options.host, options.port,
|
49
|
-
options.
|
60
|
+
key_set = DeadmanCheck::KeySet.new(options.host, options.port, options.key,
|
61
|
+
options.frequency)
|
50
62
|
key_set.run_consul_key_update
|
51
63
|
end
|
52
64
|
end
|
data/deadman_check.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency "bundler", "~> 1.13"
|
34
34
|
spec.add_development_dependency "rake", "~> 10.0"
|
35
35
|
spec.add_development_dependency "minitest", "~> 5.0"
|
36
|
+
spec.add_development_dependency "webmock", "~> 3.0"
|
36
37
|
|
37
38
|
spec.add_dependency 'commander', '~> 4.4', '>= 4.4.3'
|
38
39
|
spec.add_dependency 'diplomat', '~> 1.2', '>= 1.2.0'
|
data/lib/deadman_check_keyset.rb
CHANGED
@@ -1,33 +1,35 @@
|
|
1
1
|
require 'deadman_check/version'
|
2
2
|
require 'deadman_check_global'
|
3
3
|
require 'diplomat'
|
4
|
+
require 'json'
|
4
5
|
|
5
6
|
module DeadmanCheck
|
6
7
|
# KeySet Class
|
7
8
|
class KeySet
|
8
|
-
attr_accessor :host, :port, :key
|
9
|
+
attr_accessor :host, :port, :key, :frequency
|
9
10
|
|
10
|
-
def initialize(host, port, key)
|
11
|
+
def initialize(host, port, key, frequency)
|
11
12
|
@host = host
|
12
13
|
@port = port
|
13
14
|
@key = key
|
15
|
+
@frequency = frequency
|
14
16
|
end
|
15
17
|
|
16
|
-
def
|
17
|
-
|
18
|
-
config.url = "http://#{host}:#{port}"
|
19
|
-
end
|
18
|
+
def run_consul_key_update
|
19
|
+
update_consul_key(@host, @port, @key, @frequency)
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
22
|
+
private
|
23
|
+
def generate_json(epoch, frequency)
|
24
|
+
consul_key = { :epoch => epoch, :frequency => frequency }
|
25
|
+
consul_key.to_json
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def update_consul_key(host, port, key, frequency)
|
29
|
+
DeadmanCheck::DeadmanCheckGlobal.new.configure_diplomat(host, port)
|
30
|
+
epoch_time_now = DeadmanCheck::DeadmanCheckGlobal.new.get_epoch_time
|
31
|
+
Diplomat::Kv.put(key, "#{generate_json(epoch_time_now, frequency)}")
|
32
|
+
puts "Consul key #{key} updated EPOCH to #{epoch_time_now}"
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
data/lib/deadman_check_switch.rb
CHANGED
@@ -2,18 +2,19 @@ require 'deadman_check/version'
|
|
2
2
|
require 'deadman_check_global'
|
3
3
|
require 'diplomat'
|
4
4
|
require 'slack-ruby-client'
|
5
|
+
require 'json'
|
5
6
|
|
6
7
|
module DeadmanCheck
|
7
8
|
# Switch class
|
8
9
|
class SwitchMonitor
|
9
|
-
attr_accessor :host, :port, :
|
10
|
+
attr_accessor :host, :port, :target, :alert_to, :recurse, :daemon_sleep
|
10
11
|
|
11
|
-
def initialize(host, port,
|
12
|
+
def initialize(host, port, target, alert_to, recurse, daemon_sleep)
|
12
13
|
@host = host
|
13
14
|
@port = port
|
14
|
-
@
|
15
|
-
@freshness = freshness.to_i
|
15
|
+
@target = target
|
16
16
|
@alert_to = alert_to
|
17
|
+
@recurse = recurse
|
17
18
|
@daemon_sleep = daemon_sleep.to_i
|
18
19
|
end
|
19
20
|
|
@@ -21,39 +22,74 @@ module DeadmanCheck
|
|
21
22
|
config.token = ENV['SLACK_API_TOKEN']
|
22
23
|
end
|
23
24
|
|
24
|
-
def _diff_epoc(current_epoch, recorded_epoch)
|
25
|
-
epoch_difference = current_epoch - recorded_epoch
|
26
|
-
return epoch_difference
|
27
|
-
end
|
28
|
-
|
29
|
-
def _get_recorded_epoch(host, port, key)
|
30
|
-
DeadmanCheck::DeadmanCheckGlobal.new.configure_diplomat(host, port)
|
31
|
-
recorded_epoch = Diplomat::Kv.get(key)
|
32
|
-
return recorded_epoch
|
33
|
-
end
|
34
|
-
|
35
|
-
def slack_alert(alert_to, key, epoch_diff)
|
36
|
-
client = Slack::Web::Client.new
|
37
|
-
client.chat_postMessage(channel: "\##{alert_to}", text: "Alert: Deadman Switch
|
38
|
-
Triggered for #{key}, with #{epoch_diff} seconds since last run",
|
39
|
-
username: 'deadman')
|
40
|
-
end
|
41
|
-
|
42
25
|
def run_check_once
|
43
|
-
|
26
|
+
recorded_epochs = get_recorded_epochs(@host, @port, @target, @recurse)
|
44
27
|
current_epoch = DeadmanCheck::DeadmanCheckGlobal.new.get_epoch_time.to_i
|
45
|
-
|
46
|
-
|
47
|
-
|
28
|
+
if @recurse
|
29
|
+
check_recursive_recorded_epochs(recorded_epochs, current_epoch)
|
30
|
+
else
|
31
|
+
record = parse_recorded_epoch(recorded_epochs)
|
32
|
+
check_recorded_epoch(record, current_epoch)
|
48
33
|
end
|
49
34
|
end
|
50
35
|
|
51
36
|
def run_check_daemon
|
52
37
|
loop do
|
53
|
-
run_check_once
|
38
|
+
run_check_once(target, recurse)
|
54
39
|
sleep(@daemon_sleep)
|
55
40
|
end
|
56
41
|
end
|
57
42
|
|
43
|
+
private
|
44
|
+
def diff_epoch(current_epoch, recorded_epoch)
|
45
|
+
epoch_difference = current_epoch - recorded_epoch
|
46
|
+
return epoch_difference
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_recorded_epochs(host, port, target, recurse)
|
50
|
+
DeadmanCheck::DeadmanCheckGlobal.new.configure_diplomat(host, port)
|
51
|
+
recorded_epochs = Diplomat::Kv.get(target, recurse: recurse)
|
52
|
+
return recorded_epochs
|
53
|
+
end
|
54
|
+
|
55
|
+
def parse_recorded_epoch(recorded_epochs)
|
56
|
+
# {"epoch":1493000501,"frequency":"300"}
|
57
|
+
value_json = JSON.parse(recorded_epochs)
|
58
|
+
frequency = value_json["frequency"].to_i
|
59
|
+
epoch = value_json["epoch"].to_i
|
60
|
+
return epoch, frequency
|
61
|
+
end
|
62
|
+
|
63
|
+
def alert_if_epoch_greater_than_frequency(epoch_diff, target, frequency)
|
64
|
+
if epoch_diff > frequency
|
65
|
+
slack_alert(@alert_to, target, epoch_diff)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def check_recorded_epoch(parse_recorded_epoch, current_epoch)
|
70
|
+
recorded_epoch = parse_recorded_epoch[0].to_i
|
71
|
+
frequency = parse_recorded_epoch[1].to_i
|
72
|
+
epoch_diff = diff_epoch(current_epoch, recorded_epoch)
|
73
|
+
alert_if_epoch_greater_than_frequency(epoch_diff, @target, frequency)
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_recursive_recorded_epochs(recorded_epochs, current_epoch)
|
77
|
+
recorded_epochs.each do |recorded_service|
|
78
|
+
value_json = JSON.parse(recorded_service[:value])
|
79
|
+
frequency = value_json["frequency"].to_i
|
80
|
+
epoch = value_json["epoch"].to_i
|
81
|
+
epoch_diff = diff_epoch(current_epoch, epoch)
|
82
|
+
alert_if_epoch_greater_than_frequency(epoch_diff,
|
83
|
+
recorded_service[:key],
|
84
|
+
frequency)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def slack_alert(alert_to, target, epoch_diff)
|
89
|
+
client = Slack::Web::Client.new
|
90
|
+
client.chat_postMessage(channel: "\##{alert_to}", text: "Alert: Deadman Switch
|
91
|
+
Triggered for #{target}, with #{epoch_diff} seconds since last run",
|
92
|
+
username: 'deadman')
|
93
|
+
end
|
58
94
|
end
|
59
95
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deadman_check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: webmock
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: commander
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|