minicron 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
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: