minicron 0.3 → 0.4

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +42 -33
  3. data/bin/minicron +3 -0
  4. data/lib/minicron.rb +12 -3
  5. data/lib/minicron/alert.rb +9 -6
  6. data/lib/minicron/cli.rb +15 -6
  7. data/lib/minicron/cli/commands.rb +35 -12
  8. data/lib/minicron/constants.rb +1 -1
  9. data/lib/minicron/cron.rb +71 -30
  10. data/lib/minicron/hub/app.rb +6 -0
  11. data/lib/minicron/hub/assets/app/components/schedules.js +1 -1
  12. data/lib/minicron/hub/assets/app/controllers/hosts.js +6 -2
  13. data/lib/minicron/hub/assets/app/controllers/jobs.js +5 -2
  14. data/lib/minicron/hub/assets/app/controllers/schedules.js +15 -13
  15. data/lib/minicron/hub/assets/app/models/host.js +1 -0
  16. data/lib/minicron/hub/assets/app/models/job.js +1 -0
  17. data/lib/minicron/hub/controllers/api/executions.rb +0 -1
  18. data/lib/minicron/hub/controllers/api/hosts.rb +12 -13
  19. data/lib/minicron/hub/controllers/api/job_execution_outputs.rb +0 -1
  20. data/lib/minicron/hub/controllers/api/jobs.rb +5 -3
  21. data/lib/minicron/hub/controllers/api/schedule.rb +3 -1
  22. data/lib/minicron/hub/db/schema.rb +8 -6
  23. data/lib/minicron/hub/db/schema.sql +4 -2
  24. data/lib/minicron/hub/views/handlebars/hosts.erb +18 -0
  25. data/lib/minicron/hub/views/handlebars/jobs.erb +18 -0
  26. data/lib/minicron/monitor.rb +14 -12
  27. data/lib/minicron/transport.rb +0 -1
  28. data/lib/minicron/transport/client.rb +19 -11
  29. data/lib/minicron/transport/faye/client.rb +16 -2
  30. data/lib/minicron/transport/faye/extensions/job_handler.rb +10 -4
  31. data/lib/minicron/transport/faye/server.rb +5 -4
  32. data/lib/minicron/transport/server.rb +9 -4
  33. data/lib/minicron/transport/ssh.rb +5 -4
  34. data/spec/minicron/alert/pagerduty_spec.rb +1 -0
  35. data/spec/minicron/alert/sms_spec.rb +1 -0
  36. data/spec/minicron/cli_spec.rb +1 -0
  37. data/spec/minicron/transport/client_spec.rb +1 -0
  38. data/spec/minicron/transport/faye/client_spec.rb +1 -0
  39. data/spec/minicron/transport/server_spec.rb +1 -0
  40. data/spec/minicron/transport_spec.rb +1 -0
  41. data/spec/minicron_spec.rb +6 -0
  42. metadata +88 -88
@@ -1,10 +1,11 @@
1
- require 'active_record'
2
- require 'parse-cron'
1
+ autoload :ActiveRecord, 'active_record'
2
+ autoload :CronParser, 'parse-cron'
3
3
  require 'minicron/hub/models/schedule'
4
4
  require 'minicron/hub/models/execution'
5
- require 'minicron/alert'
6
5
 
7
6
  module Minicron
7
+ autoload :Alert, 'minicron/alert'
8
+
8
9
  # Used to monitor the executions in the database and look for any failures
9
10
  # or missed executions based on the schedules minicron knows about
10
11
  class Monitor
@@ -37,12 +38,11 @@ module Minicron
37
38
  # Establish a database connection
38
39
  setup_db
39
40
 
41
+ # Set the start time of the monitir
42
+ @start_time = Time.now
43
+
40
44
  # Start a thread for the monitor
41
45
  @thread = Thread.new do
42
- # Delay the start of the monitor loop for a moniter so we don't immediately
43
- # send an alert for a job the system wasn't 'up' for
44
- sleep 60
45
-
46
46
  # While the monitor is active run it in a loop ~every minute
47
47
  while @active
48
48
  # Get all the schedules
@@ -60,7 +60,7 @@ module Minicron
60
60
  end
61
61
  end
62
62
 
63
- sleep 60
63
+ sleep 59
64
64
  end
65
65
  end
66
66
  end
@@ -89,14 +89,16 @@ module Minicron
89
89
  cron = CronParser.new(schedule.formatted)
90
90
 
91
91
  # Find the time the cron was last expected to run
92
- expected_at = cron.last(Time.now.utc)
92
+ expected_at = cron.last(Time.now)
93
+ expected_by = expected_at + 60
93
94
 
94
- # We need to wait until after a minute past the expected run time
95
- if Time.now.utc > (expected_at + 60)
95
+ # We only need to check jobs that are expected to under the monitor start time
96
+ # and jobs that have passed their expected by time
97
+ if expected_at > @start_time && Time.now > expected_by
96
98
  # Check if this execution was created inside a minute window
97
99
  # starting when it was expected to run
98
100
  check = Minicron::Hub::Execution.exists?(
99
- :created_at => expected_at..(expected_at + 60),
101
+ :created_at => expected_at..expected_by,
100
102
  :job_id => schedule.job_id
101
103
  )
102
104
 
@@ -1,5 +1,4 @@
1
1
  require 'digest/md5'
2
- require 'json'
3
2
 
4
3
  module Minicron
5
4
  # The transport module deals with interactions between the server and client
@@ -1,7 +1,9 @@
1
- require 'minicron/transport/faye/client'
1
+ require 'json'
2
2
 
3
3
  module Minicron
4
4
  module Transport
5
+ autoload :FayeClient, 'minicron/transport/faye/client'
6
+
5
7
  class Client < Minicron::Transport::FayeClient
6
8
  # Instantiate a new instance of the client
7
9
  #
@@ -17,18 +19,20 @@ module Minicron
17
19
 
18
20
  # Used to set up a job on the server
19
21
  #
20
- # @param job_hash [String]
21
- # @param command [Integer]
22
- # @param fqdn [String]
23
- # @param hostname [String]
22
+ # @option options [String] job_hash
23
+ # @option options [String] user
24
+ # @option options [Integer] command
25
+ # @option options [String] fqdn
26
+ # @option options [String] hostname
24
27
  # @return [Hash]
25
- def setup(job_hash, command, fqdn, hostname)
28
+ def setup(options = {})
26
29
  # Send a request to set up the job
27
- publish("/job/#{job_hash}/status",
30
+ publish("/job/#{options[:job_hash]}/status",
28
31
  :action => 'SETUP',
29
- :command => command,
30
- :fqdn => fqdn,
31
- :hostname => hostname
32
+ :user => options[:user],
33
+ :command => options[:command],
34
+ :fqdn => options[:fqdn],
35
+ :hostname => options[:hostname]
32
36
  )
33
37
 
34
38
  # Wait for the response..
@@ -36,7 +40,11 @@ module Minicron
36
40
 
37
41
  # TODO: Handle errors here!
38
42
  # Get the job and execution id from the response
39
- ids = JSON.parse(@responses.first[:body]).first['channel'].split('/')[3]
43
+ begin
44
+ ids = JSON.parse(@responses.first[:body]).first['channel'].split('/')[3]
45
+ rescue Exception => e
46
+ raise Exception, "Unable to parse JSON response of: '#{@responses.first[:body]}', reason: #{e.message}"
47
+ end
40
48
 
41
49
  # Split them up
42
50
  ids = ids.split('-')
@@ -1,6 +1,9 @@
1
- require 'eventmachine'
2
- require 'em-http-request'
3
1
  require 'digest/md5'
2
+ autoload :EM, 'eventmachine'
3
+
4
+ module EventMachine
5
+ autoload :HttpRequest, 'em-http-request'
6
+ end
4
7
 
5
8
  module Minicron
6
9
  module Transport
@@ -40,6 +43,11 @@ module Minicron
40
43
  # Make sure eventmachine is running
41
44
  ensure_em_running
42
45
 
46
+ # Wait until there is some space in the queue so we don't overwhelm the server
47
+ until queue.length <= 10
48
+ sleep 0.05
49
+ end
50
+
43
51
  # Make the request
44
52
  req = EventMachine::HttpRequest.new(
45
53
  @url,
@@ -75,9 +83,15 @@ module Minicron
75
83
  :body => req.response
76
84
  )
77
85
 
86
+ # Retry the request if we have another try left
78
87
  if @retry_counts[req_id] < @retries
79
88
  @retry_counts[req_id] += 1
89
+ # Wait a second and then retry
90
+ sleep 1
80
91
  request(body)
92
+ # Otherwise remove it from the queue
93
+ elsif @retry_counts[req_id] == @retries
94
+ queue.delete(req_id)
81
95
  end
82
96
  end
83
97
  end
@@ -1,10 +1,15 @@
1
1
  require 'minicron/alert'
2
- require 'minicron/hub/models/host'
3
- require 'minicron/hub/models/job'
4
- require 'minicron/hub/models/execution'
5
- require 'minicron/hub/models/job_execution_output'
6
2
 
7
3
  module Minicron
4
+ autoload :Alert, 'minicron/alert'
5
+
6
+ module Hub
7
+ autoload :Host, 'minicron/hub/models/host'
8
+ autoload :Job, 'minicron/hub/models/job'
9
+ autoload :Execution, 'minicron/hub/models/execution'
10
+ autoload :JobExecutionOutput, 'minicron/hub/models/job_execution_output'
11
+ end
12
+
8
13
  module Transport
9
14
  # An extension to the Faye server to store some of the data it receives
10
15
  #
@@ -86,6 +91,7 @@ module Minicron
86
91
  # Validate or create the job
87
92
  job = Minicron::Hub::Job.where(:job_hash => segments[2]).first_or_create do |j|
88
93
  j.job_hash = segments[2]
94
+ j.user = data['user']
89
95
  j.command = data['command']
90
96
  j.host_id = host.id
91
97
  end
@@ -1,10 +1,11 @@
1
- require 'thin'
2
- require 'rack'
3
- require 'faye'
4
- require 'minicron/transport/faye/extensions/job_handler'
1
+ autoload :Thin, 'thin'
2
+ autoload :Rack, 'rack'
3
+ autoload :Faye, 'faye'
5
4
 
6
5
  module Minicron
7
6
  module Transport
7
+ autoload :FayeJobHandler, 'minicron/transport/faye/extensions/job_handler'
8
+
8
9
  class FayeServer
9
10
  attr_reader :server
10
11
 
@@ -1,8 +1,15 @@
1
- require 'thin'
2
- require 'rack'
1
+ autoload :Thin, 'thin'
2
+ autoload :Rack, 'rack'
3
3
 
4
4
  module Minicron
5
+ module Hub
6
+ autoload :App, 'minicron/hub/app'
7
+ autoload :ExceptionHandling, 'minicron/hub/app'
8
+ end
9
+
5
10
  module Transport
11
+ autoload :FayeServer, 'minicron/transport/faye/server'
12
+
6
13
  # Used to mangage the web server minicron runs on
7
14
  class Server
8
15
  @server = nil
@@ -26,7 +33,6 @@ module Minicron
26
33
 
27
34
  # The 'hub', aka our sinatra web interface
28
35
  map '/' do
29
- require Minicron::LIB_PATH + '/minicron/hub/app'
30
36
  use Minicron::Hub::ExceptionHandling
31
37
  run Minicron::Hub::App.new
32
38
  end
@@ -36,7 +42,6 @@ module Minicron
36
42
 
37
43
  # The faye server the server and browser clients talk to
38
44
  map faye_path do
39
- require Minicron::LIB_PATH + '/minicron/transport/faye/server'
40
45
  run Minicron::Transport::FayeServer.new.server
41
46
  end
42
47
  end
@@ -5,16 +5,17 @@ module Minicron
5
5
  class SSH
6
6
  # Set all the options for the ssh instance
7
7
  #
8
- # @option options [String] the host to connect to
9
- # @option options [Integer] the port number
10
- # @option options [String] the path to the private key
8
+ # @option options [String] user
9
+ # @option options [String] host
10
+ # @option options [Integer] port
11
+ # @option options [String] path to the private key
11
12
  def initialize(options = {})
13
+ @user = options[:user]
12
14
  @host = options[:host]
13
15
  @port = options[:port]
14
16
  @private_key = File.expand_path(options[:private_key])
15
17
 
16
18
  # TODO: Make these configurable?
17
- @user = 'root'
18
19
  @auth_methods = ['publickey']
19
20
  @host_key = 'ssh-rsa'
20
21
  @timeout = 10
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/alert/pagerduty'
2
3
 
3
4
  describe Minicron::PagerDuty do
4
5
  describe '#intiailize' do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/alert/sms'
2
3
 
3
4
  describe Minicron::SMS do
4
5
  before (:each) do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/cli'
2
3
 
3
4
  describe Minicron::CLI do
4
5
  let(:server) { Minicron::Transport::Server }
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/transport/client'
2
3
 
3
4
  describe Minicron::Transport::Client do
4
5
  describe '#initialize' do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/transport/faye/client'
2
3
 
3
4
  describe Minicron::Transport::FayeClient do
4
5
  let(:client) { Minicron::Transport::FayeClient }
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/transport/server'
2
3
 
3
4
  describe Minicron::Transport::Server do
4
5
  let(:server) { Minicron::Transport::Server }
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'minicron/transport'
2
3
 
3
4
  describe Minicron::Transport do
4
5
  describe '.get_job_hash' do
@@ -171,4 +171,10 @@ describe Minicron do
171
171
  expect(Minicron.get_hostname).to eq `hostname -s`.strip
172
172
  end
173
173
  end
174
+
175
+ describe '.get_user' do
176
+ it 'should return the user as a string with no newline' do
177
+ expect(Minicron.get_user).to eq `whoami`.strip
178
+ end
179
+ end
174
180
  end
metadata CHANGED
@@ -1,379 +1,379 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minicron
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
4
+ version: '0.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - James White
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-05 00:00:00.000000000 Z
11
+ date: 2014-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: commander
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.1'
34
- - - ">="
34
+ - - '>='
35
35
  - !ruby/object:Gem::Version
36
36
  version: 4.1.6
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
41
+ - - ~>
42
42
  - !ruby/object:Gem::Version
43
43
  version: '4.1'
44
- - - ">="
44
+ - - '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: 4.1.6
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thin
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ~>
52
52
  - !ruby/object:Gem::Version
53
53
  version: '1.6'
54
- - - ">="
54
+ - - '>='
55
55
  - !ruby/object:Gem::Version
56
56
  version: 1.6.1
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "~>"
61
+ - - ~>
62
62
  - !ruby/object:Gem::Version
63
63
  version: '1.6'
64
- - - ">="
64
+ - - '>='
65
65
  - !ruby/object:Gem::Version
66
66
  version: 1.6.1
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: faye
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - "~>"
71
+ - - ~>
72
72
  - !ruby/object:Gem::Version
73
73
  version: '1.0'
74
- - - ">="
74
+ - - '>='
75
75
  - !ruby/object:Gem::Version
76
76
  version: 1.0.1
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - "~>"
81
+ - - ~>
82
82
  - !ruby/object:Gem::Version
83
83
  version: '1.0'
84
- - - ">="
84
+ - - '>='
85
85
  - !ruby/object:Gem::Version
86
86
  version: 1.0.1
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: eventmachine
89
89
  requirement: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - "~>"
91
+ - - ~>
92
92
  - !ruby/object:Gem::Version
93
93
  version: '1.0'
94
- - - ">="
94
+ - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: 1.0.3
97
97
  type: :runtime
98
98
  prerelease: false
99
99
  version_requirements: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ~>
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.0'
104
- - - ">="
104
+ - - '>='
105
105
  - !ruby/object:Gem::Version
106
106
  version: 1.0.3
107
107
  - !ruby/object:Gem::Dependency
108
108
  name: toml-rb
109
109
  requirement: !ruby/object:Gem::Requirement
110
110
  requirements:
111
- - - "~>"
111
+ - - ~>
112
112
  - !ruby/object:Gem::Version
113
113
  version: '0.1'
114
- - - ">="
114
+ - - '>='
115
115
  - !ruby/object:Gem::Version
116
116
  version: 0.1.4
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - "~>"
121
+ - - ~>
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0.1'
124
- - - ">="
124
+ - - '>='
125
125
  - !ruby/object:Gem::Version
126
126
  version: 0.1.4
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: sinatra
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - "~>"
131
+ - - ~>
132
132
  - !ruby/object:Gem::Version
133
133
  version: '1.4'
134
- - - ">="
134
+ - - '>='
135
135
  - !ruby/object:Gem::Version
136
136
  version: 1.4.4
137
137
  type: :runtime
138
138
  prerelease: false
139
139
  version_requirements: !ruby/object:Gem::Requirement
140
140
  requirements:
141
- - - "~>"
141
+ - - ~>
142
142
  - !ruby/object:Gem::Version
143
143
  version: '1.4'
144
- - - ">="
144
+ - - '>='
145
145
  - !ruby/object:Gem::Version
146
146
  version: 1.4.4
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: erubis
149
149
  requirement: !ruby/object:Gem::Requirement
150
150
  requirements:
151
- - - "~>"
151
+ - - ~>
152
152
  - !ruby/object:Gem::Version
153
153
  version: '2.7'
154
154
  type: :runtime
155
155
  prerelease: false
156
156
  version_requirements: !ruby/object:Gem::Requirement
157
157
  requirements:
158
- - - "~>"
158
+ - - ~>
159
159
  - !ruby/object:Gem::Version
160
160
  version: '2.7'
161
161
  - !ruby/object:Gem::Dependency
162
162
  name: activerecord
163
163
  requirement: !ruby/object:Gem::Requirement
164
164
  requirements:
165
- - - "~>"
165
+ - - ~>
166
166
  - !ruby/object:Gem::Version
167
167
  version: '4.0'
168
- - - ">="
168
+ - - '>='
169
169
  - !ruby/object:Gem::Version
170
170
  version: 4.0.3
171
171
  type: :runtime
172
172
  prerelease: false
173
173
  version_requirements: !ruby/object:Gem::Requirement
174
174
  requirements:
175
- - - "~>"
175
+ - - ~>
176
176
  - !ruby/object:Gem::Version
177
177
  version: '4.0'
178
- - - ">="
178
+ - - '>='
179
179
  - !ruby/object:Gem::Version
180
180
  version: 4.0.3
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: sinatra-activerecord
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - "~>"
185
+ - - ~>
186
186
  - !ruby/object:Gem::Version
187
187
  version: '1.6'
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - "~>"
192
+ - - ~>
193
193
  - !ruby/object:Gem::Version
194
194
  version: '1.6'
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: sinatra-assetpack
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
- - - "~>"
199
+ - - ~>
200
200
  - !ruby/object:Gem::Version
201
201
  version: '0.3'
202
- - - ">="
202
+ - - '>='
203
203
  - !ruby/object:Gem::Version
204
204
  version: 0.3.2
205
205
  type: :runtime
206
206
  prerelease: false
207
207
  version_requirements: !ruby/object:Gem::Requirement
208
208
  requirements:
209
- - - "~>"
209
+ - - ~>
210
210
  - !ruby/object:Gem::Version
211
211
  version: '0.3'
212
- - - ">="
212
+ - - '>='
213
213
  - !ruby/object:Gem::Version
214
214
  version: 0.3.2
215
215
  - !ruby/object:Gem::Dependency
216
216
  name: sass
217
217
  requirement: !ruby/object:Gem::Requirement
218
218
  requirements:
219
- - - "~>"
219
+ - - ~>
220
220
  - !ruby/object:Gem::Version
221
221
  version: '3.2'
222
- - - ">="
222
+ - - '>='
223
223
  - !ruby/object:Gem::Version
224
224
  version: 3.2.14
225
225
  type: :runtime
226
226
  prerelease: false
227
227
  version_requirements: !ruby/object:Gem::Requirement
228
228
  requirements:
229
- - - "~>"
229
+ - - ~>
230
230
  - !ruby/object:Gem::Version
231
231
  version: '3.2'
232
- - - ">="
232
+ - - '>='
233
233
  - !ruby/object:Gem::Version
234
234
  version: 3.2.14
235
235
  - !ruby/object:Gem::Dependency
236
236
  name: oj
237
237
  requirement: !ruby/object:Gem::Requirement
238
238
  requirements:
239
- - - "~>"
239
+ - - ~>
240
240
  - !ruby/object:Gem::Version
241
241
  version: '2.6'
242
242
  type: :runtime
243
243
  prerelease: false
244
244
  version_requirements: !ruby/object:Gem::Requirement
245
245
  requirements:
246
- - - "~>"
246
+ - - ~>
247
247
  - !ruby/object:Gem::Version
248
248
  version: '2.6'
249
249
  - !ruby/object:Gem::Dependency
250
250
  name: sshkey
251
251
  requirement: !ruby/object:Gem::Requirement
252
252
  requirements:
253
- - - "~>"
253
+ - - ~>
254
254
  - !ruby/object:Gem::Version
255
255
  version: '1.6'
256
- - - ">="
256
+ - - '>='
257
257
  - !ruby/object:Gem::Version
258
258
  version: 1.6.1
259
259
  type: :runtime
260
260
  prerelease: false
261
261
  version_requirements: !ruby/object:Gem::Requirement
262
262
  requirements:
263
- - - "~>"
263
+ - - ~>
264
264
  - !ruby/object:Gem::Version
265
265
  version: '1.6'
266
- - - ">="
266
+ - - '>='
267
267
  - !ruby/object:Gem::Version
268
268
  version: 1.6.1
269
269
  - !ruby/object:Gem::Dependency
270
270
  name: net-ssh
271
271
  requirement: !ruby/object:Gem::Requirement
272
272
  requirements:
273
- - - "~>"
273
+ - - ~>
274
274
  - !ruby/object:Gem::Version
275
275
  version: '2.8'
276
276
  type: :runtime
277
277
  prerelease: false
278
278
  version_requirements: !ruby/object:Gem::Requirement
279
279
  requirements:
280
- - - "~>"
280
+ - - ~>
281
281
  - !ruby/object:Gem::Version
282
282
  version: '2.8'
283
283
  - !ruby/object:Gem::Dependency
284
284
  name: parse-cron
285
285
  requirement: !ruby/object:Gem::Requirement
286
286
  requirements:
287
- - - "~>"
287
+ - - ~>
288
288
  - !ruby/object:Gem::Version
289
289
  version: '0.1'
290
- - - ">="
290
+ - - '>='
291
291
  - !ruby/object:Gem::Version
292
292
  version: 0.1.4
293
293
  type: :runtime
294
294
  prerelease: false
295
295
  version_requirements: !ruby/object:Gem::Requirement
296
296
  requirements:
297
- - - "~>"
297
+ - - ~>
298
298
  - !ruby/object:Gem::Version
299
299
  version: '0.1'
300
- - - ">="
300
+ - - '>='
301
301
  - !ruby/object:Gem::Version
302
302
  version: 0.1.4
303
303
  - !ruby/object:Gem::Dependency
304
304
  name: mail
305
305
  requirement: !ruby/object:Gem::Requirement
306
306
  requirements:
307
- - - "~>"
307
+ - - ~>
308
308
  - !ruby/object:Gem::Version
309
309
  version: '2.5'
310
- - - ">="
310
+ - - '>='
311
311
  - !ruby/object:Gem::Version
312
312
  version: 2.5.4
313
313
  type: :runtime
314
314
  prerelease: false
315
315
  version_requirements: !ruby/object:Gem::Requirement
316
316
  requirements:
317
- - - "~>"
317
+ - - ~>
318
318
  - !ruby/object:Gem::Version
319
319
  version: '2.5'
320
- - - ">="
320
+ - - '>='
321
321
  - !ruby/object:Gem::Version
322
322
  version: 2.5.4
323
323
  - !ruby/object:Gem::Dependency
324
324
  name: twilio-ruby
325
325
  requirement: !ruby/object:Gem::Requirement
326
326
  requirements:
327
- - - "~>"
327
+ - - ~>
328
328
  - !ruby/object:Gem::Version
329
329
  version: '3.1'
330
- - - ">="
330
+ - - '>='
331
331
  - !ruby/object:Gem::Version
332
332
  version: 3.11.5
333
333
  type: :runtime
334
334
  prerelease: false
335
335
  version_requirements: !ruby/object:Gem::Requirement
336
336
  requirements:
337
- - - "~>"
337
+ - - ~>
338
338
  - !ruby/object:Gem::Version
339
339
  version: '3.1'
340
- - - ">="
340
+ - - '>='
341
341
  - !ruby/object:Gem::Version
342
342
  version: 3.11.5
343
343
  - !ruby/object:Gem::Dependency
344
344
  name: pagerduty
345
345
  requirement: !ruby/object:Gem::Requirement
346
346
  requirements:
347
- - - "~>"
347
+ - - ~>
348
348
  - !ruby/object:Gem::Version
349
349
  version: '1.3'
350
- - - ">="
350
+ - - '>='
351
351
  - !ruby/object:Gem::Version
352
352
  version: 1.3.4
353
353
  type: :runtime
354
354
  prerelease: false
355
355
  version_requirements: !ruby/object:Gem::Requirement
356
356
  requirements:
357
- - - "~>"
357
+ - - ~>
358
358
  - !ruby/object:Gem::Version
359
359
  version: '1.3'
360
- - - ">="
360
+ - - '>='
361
361
  - !ruby/object:Gem::Version
362
362
  version: 1.3.4
363
363
  - !ruby/object:Gem::Dependency
364
364
  name: insidious
365
365
  requirement: !ruby/object:Gem::Requirement
366
366
  requirements:
367
- - - "~>"
367
+ - - ~>
368
368
  - !ruby/object:Gem::Version
369
- version: '0.2'
369
+ version: '0.3'
370
370
  type: :runtime
371
371
  prerelease: false
372
372
  version_requirements: !ruby/object:Gem::Requirement
373
373
  requirements:
374
- - - "~>"
374
+ - - ~>
375
375
  - !ruby/object:Gem::Version
376
- version: '0.2'
376
+ version: '0.3'
377
377
  - !ruby/object:Gem::Dependency
378
378
  name: escape
379
379
  requirement: !ruby/object:Gem::Requirement
@@ -392,76 +392,76 @@ dependencies:
392
392
  name: mysql2
393
393
  requirement: !ruby/object:Gem::Requirement
394
394
  requirements:
395
- - - "~>"
395
+ - - ~>
396
396
  - !ruby/object:Gem::Version
397
397
  version: '0.3'
398
- - - ">="
398
+ - - '>='
399
399
  - !ruby/object:Gem::Version
400
400
  version: 0.3.15
401
401
  type: :runtime
402
402
  prerelease: false
403
403
  version_requirements: !ruby/object:Gem::Requirement
404
404
  requirements:
405
- - - "~>"
405
+ - - ~>
406
406
  - !ruby/object:Gem::Version
407
407
  version: '0.3'
408
- - - ">="
408
+ - - '>='
409
409
  - !ruby/object:Gem::Version
410
410
  version: 0.3.15
411
411
  - !ruby/object:Gem::Dependency
412
412
  name: bundler
413
413
  requirement: !ruby/object:Gem::Requirement
414
414
  requirements:
415
- - - "~>"
415
+ - - ~>
416
416
  - !ruby/object:Gem::Version
417
417
  version: '1.5'
418
418
  type: :development
419
419
  prerelease: false
420
420
  version_requirements: !ruby/object:Gem::Requirement
421
421
  requirements:
422
- - - "~>"
422
+ - - ~>
423
423
  - !ruby/object:Gem::Version
424
424
  version: '1.5'
425
425
  - !ruby/object:Gem::Dependency
426
426
  name: rake
427
427
  requirement: !ruby/object:Gem::Requirement
428
428
  requirements:
429
- - - "~>"
429
+ - - ~>
430
430
  - !ruby/object:Gem::Version
431
431
  version: '10.1'
432
432
  type: :development
433
433
  prerelease: false
434
434
  version_requirements: !ruby/object:Gem::Requirement
435
435
  requirements:
436
- - - "~>"
436
+ - - ~>
437
437
  - !ruby/object:Gem::Version
438
438
  version: '10.1'
439
439
  - !ruby/object:Gem::Dependency
440
440
  name: rspec
441
441
  requirement: !ruby/object:Gem::Requirement
442
442
  requirements:
443
- - - "~>"
443
+ - - ~>
444
444
  - !ruby/object:Gem::Version
445
445
  version: '2'
446
446
  type: :development
447
447
  prerelease: false
448
448
  version_requirements: !ruby/object:Gem::Requirement
449
449
  requirements:
450
- - - "~>"
450
+ - - ~>
451
451
  - !ruby/object:Gem::Version
452
452
  version: '2'
453
453
  - !ruby/object:Gem::Dependency
454
454
  name: simplecov
455
455
  requirement: !ruby/object:Gem::Requirement
456
456
  requirements:
457
- - - "~>"
457
+ - - ~>
458
458
  - !ruby/object:Gem::Version
459
459
  version: '0.8'
460
460
  type: :development
461
461
  prerelease: false
462
462
  version_requirements: !ruby/object:Gem::Requirement
463
463
  requirements:
464
- - - "~>"
464
+ - - ~>
465
465
  - !ruby/object:Gem::Version
466
466
  version: '0.8'
467
467
  description:
@@ -578,17 +578,17 @@ require_paths:
578
578
  - lib
579
579
  required_ruby_version: !ruby/object:Gem::Requirement
580
580
  requirements:
581
- - - ">="
581
+ - - '>='
582
582
  - !ruby/object:Gem::Version
583
583
  version: 1.9.3
584
584
  required_rubygems_version: !ruby/object:Gem::Requirement
585
585
  requirements:
586
- - - ">="
586
+ - - '>='
587
587
  - !ruby/object:Gem::Version
588
588
  version: '0'
589
589
  requirements:
590
- - ruby-dev, you may need this for eventmachine
591
- - build-essential, you may need this for eventmachine
590
+ - ruby-dev (you may need this for eventmachine)
591
+ - build-essential (you may need this for eventmachine)
592
592
  rubyforge_project:
593
593
  rubygems_version: 2.2.2
594
594
  signing_key: