hirefire 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ 0.1.3 / 2011-05-01
2
+
3
+ [full changelog](https://github.com/meskyanichi/hirefire/compare/0.1.2...0.1.3)
4
+
5
+ * Enhancements
6
+ * Bumps Heroku gem requirement to ~> 2.0
7
+
8
+ 0.1.2 / 2011-05-01
9
+
10
+ [full changelog](https://github.com/meskyanichi/hirefire/compare/0.1.1...0.1.2)
11
+
12
+ * Enhancements
13
+ * Add min_workers option (Sam Oliver)
14
+ * Gracefully handle RestClient exceptions (Nathaniel Bibler)
15
+ * Add Rails 2 compatibility (Estanislau Trepat)
16
+ * Performance improvements
17
+
18
+ 0.1.1 / 2011-04-15
19
+
20
+ [full changelog](https://github.com/meskyanichi/hirefire/compare/0.1.0...0.1.1)
21
+
22
+ * Enhancements
23
+ * Add support for Resque workers
24
+ * Add functional job/worker ratio definition option (Dirk Gadsden)
25
+ * Improve overall performance
26
+
27
+ 0.1.0 / 2011-04-10
28
+
29
+ * Initial release.
data/README.md CHANGED
@@ -17,6 +17,18 @@ Author
17
17
  Drop me a message for any questions, suggestions, requests, bugs or submit them to the [issue log](https://github.com/meskyanichi/hirefire/issues).
18
18
 
19
19
 
20
+ HireFireApp.com - The Heroku Worker Manager - BETA
21
+ --------------------------------------------------
22
+
23
+ *This is not part of the "HireFire open source" project, but it could potentially help support my open source projects!*
24
+
25
+ I would like to announce the release of a **new service** I've been working on, called **HireFireApp**. The goal is essentially the same as the open source HireFire project, except that it's considered more **stable/reliable** and **a lot more performant**.
26
+
27
+ The service is currently in beta, so feel free to create a free account and try it out!
28
+
29
+ Check out the [official website](http://hirefireapp.com) for more information: [http://hirefireapp.com](http://hirefireapp.com)
30
+
31
+
20
32
  Setting it up
21
33
  -------------
22
34
 
@@ -0,0 +1,12 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake'
5
+ require 'rspec/core/rake_task'
6
+
7
+ task :default => :spec
8
+
9
+ desc "Run all examples"
10
+ RSpec::Core::RakeTask.new('spec') do |t|
11
+ t.pattern = 'spec/**/*_spec.rb'
12
+ end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
- require File.expand_path(File.dirname(__FILE__) + '/lib/hirefire')
3
+ $:.push File.expand_path('../lib', __FILE__)
4
+ require 'hirefire/version'
4
5
 
5
6
  Gem::Specification.new do |gem|
6
7
 
@@ -23,7 +24,7 @@ Gem::Specification.new do |gem|
23
24
 
24
25
  ##
25
26
  # Production gem dependencies
26
- gem.add_dependency 'heroku', ['~> 2.0.0']
27
+ gem.add_dependency 'heroku', ['>= 1.4']
27
28
  gem.add_dependency 'rush', ['~> 0.6.7']
28
29
 
29
30
  end
@@ -1,98 +1,56 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module HireFire
4
+ autoload :Configuration, 'hirefire/configuration'
5
+ autoload :Environment, 'hirefire/environment'
6
+ autoload :Initializer, 'hirefire/initializer'
7
+ autoload :Backend, 'hirefire/backend'
8
+ autoload :Logger, 'hirefire/logger'
9
+ autoload :Version, 'hirefire/version'
4
10
 
5
- ##
6
- # HireFire constants
7
- LIB_PATH = File.dirname(__FILE__)
8
- HIREFIRE_PATH = File.join(LIB_PATH, 'hirefire')
9
- ENVIRONMENT_PATH = File.join(HIREFIRE_PATH, 'environment')
10
- BACKEND_PATH = File.join(HIREFIRE_PATH, 'backend')
11
- WORKERS_PATH = File.join(HIREFIRE_PATH, 'workers')
11
+ class << self
12
12
 
13
- ##
14
- # HireFire namespace
15
- autoload :Configuration, File.join(HIREFIRE_PATH, 'configuration')
16
- autoload :Environment, File.join(HIREFIRE_PATH, 'environment')
17
- autoload :Initializer, File.join(HIREFIRE_PATH, 'initializer')
18
- autoload :Backend, File.join(HIREFIRE_PATH, 'backend')
19
- autoload :Logger, File.join(HIREFIRE_PATH, 'logger')
20
- autoload :Version, File.join(HIREFIRE_PATH, 'version')
21
-
22
- ##
23
- # HireFire::Environment namespace
24
- module Environment
25
- autoload :Base, File.join(ENVIRONMENT_PATH, 'base')
26
- autoload :Heroku, File.join(ENVIRONMENT_PATH, 'heroku')
27
- autoload :Local, File.join(ENVIRONMENT_PATH, 'local')
28
- autoload :Noop, File.join(ENVIRONMENT_PATH, 'noop')
29
- end
30
-
31
- ##
32
- # HireFire::Workers namespace
33
- module Workers
34
- autoload :DelayedJob, File.join(WORKERS_PATH, 'delayed_job')
35
- autoload :Resque, File.join(WORKERS_PATH, 'resque')
36
- end
37
-
38
- ##
39
- # HireFire::Backend namespace
40
- module Backend
41
- DELAYED_JOB_PATH = File.join(BACKEND_PATH, 'delayed_job')
42
- RESQUE_PATH = File.join(BACKEND_PATH, 'resque')
13
+ attr_writer :configuration
43
14
 
44
15
  ##
45
- # HireFire::Backend::DelayedJob namespace
46
- module DelayedJob
47
- autoload :ActiveRecord, File.join(DELAYED_JOB_PATH, 'active_record')
48
- autoload :ActiveRecord2, File.join(DELAYED_JOB_PATH, 'active_record_2')
49
- autoload :Mongoid, File.join(DELAYED_JOB_PATH, 'mongoid')
16
+ # This method is used to configure HireFire
17
+ #
18
+ # @yield [config] the instance of HireFire::Configuration class
19
+ # @yieldparam [Fixnum] max_workers default: 1 (set at least 1)
20
+ # @yieldparam [Array] job_worker_ratio default: see example
21
+ # @yieldparam [Symbol, nil] environment (:heroku, :local, :noop or nil) - default: nil
22
+ #
23
+ # @note Every param has it's own defaults. It's best to leave the environment param at "nil".
24
+ # When environment is set to "nil", it'll default to the :noop environment. This basically means
25
+ # that you have to run "rake jobs:work" yourself from the console to get the jobs running in development mode.
26
+ # In production, it'll automatically use :heroku if deployed to the Heroku platform.
27
+ #
28
+ # @example
29
+ # HireFire.configure do |config|
30
+ # config.environment = nil
31
+ # config.max_workers = 5
32
+ # config.min_workers = 0
33
+ # config.job_worker_ratio = [
34
+ # { :jobs => 1, :workers => 1 },
35
+ # { :jobs => 15, :workers => 2 },
36
+ # { :jobs => 35, :workers => 3 },
37
+ # { :jobs => 60, :workers => 4 },
38
+ # { :jobs => 80, :workers => 5 }
39
+ # ]
40
+ # end
41
+ #
42
+ # @return [nil]
43
+ def configure
44
+ yield(configuration); nil
50
45
  end
51
46
 
52
47
  ##
53
- # HireFire::Backend::Resque namespace
54
- module Resque
55
- autoload :Redis, File.join(RESQUE_PATH, 'redis')
48
+ # Instantiates a new HireFire::Configuration
49
+ # instance and instance variable caches it
50
+ def configuration
51
+ @configuration ||= HireFire::Configuration.new
56
52
  end
57
- end
58
-
59
- ##
60
- # This method is used to configure HireFire
61
- #
62
- # @yield [config] the instance of HireFire::Configuration class
63
- # @yieldparam [Fixnum] max_workers default: 1 (set at least 1)
64
- # @yieldparam [Array] job_worker_ratio default: see example
65
- # @yieldparam [Symbol, nil] environment (:heroku, :local, :noop or nil) - default: nil
66
- #
67
- # @note Every param has it's own defaults. It's best to leave the environment param at "nil".
68
- # When environment is set to "nil", it'll default to the :noop environment. This basically means
69
- # that you have to run "rake jobs:work" yourself from the console to get the jobs running in development mode.
70
- # In production, it'll automatically use :heroku if deployed to the Heroku platform.
71
- #
72
- # @example
73
- # HireFire.configure do |config|
74
- # config.environment = nil
75
- # config.max_workers = 5
76
- # config.min_workers = 0
77
- # config.job_worker_ratio = [
78
- # { :jobs => 1, :workers => 1 },
79
- # { :jobs => 15, :workers => 2 },
80
- # { :jobs => 35, :workers => 3 },
81
- # { :jobs => 60, :workers => 4 },
82
- # { :jobs => 80, :workers => 5 }
83
- # ]
84
- # end
85
- #
86
- # @return [nil]
87
- def self.configure
88
- yield(configuration); nil
89
- end
90
53
 
91
- ##
92
- # Instantiates a new HireFire::Configuration
93
- # instance and instance variable caches it
94
- def self.configuration
95
- @configuration ||= HireFire::Configuration.new
96
54
  end
97
55
 
98
56
  end
@@ -106,7 +64,7 @@ end
106
64
  # and the desired mapper (ActiveRecord, Mongoid or Redis)
107
65
  if defined?(Rails)
108
66
  if defined?(Rails::Railtie)
109
- require File.join(HireFire::HIREFIRE_PATH, 'railtie')
67
+ require 'hirefire/railtie'
110
68
  else
111
69
  HireFire::Initializer.initialize!
112
70
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module HireFire
4
4
  module Backend
5
+ autoload :DelayedJob, 'hirefire/backend/delayed_job'
6
+ autoload :Resque, 'hirefire/backend/resque'
5
7
 
6
8
  ##
7
9
  # Load the correct module (ActiveRecord, Mongoid or Redis)
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module HireFire
4
+ module Backend
5
+ module DelayedJob
6
+ autoload :ActiveRecord, 'hirefire/backend/delayed_job/active_record'
7
+ autoload :ActiveRecord2, 'hirefire/backend/delayed_job/active_record_2'
8
+ autoload :Mongoid, 'hirefire/backend/delayed_job/mongoid'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module HireFire
4
+ module Backend
5
+ module Resque
6
+ autoload :Redis, 'hirefire/backend/resque/redis'
7
+ end
8
+ end
9
+ end
@@ -2,6 +2,10 @@
2
2
 
3
3
  module HireFire
4
4
  module Environment
5
+ autoload :Base, 'hirefire/environment/base'
6
+ autoload :Heroku, 'hirefire/environment/heroku'
7
+ autoload :Local, 'hirefire/environment/local'
8
+ autoload :Noop, 'hirefire/environment/noop'
5
9
 
6
10
  ##
7
11
  # This module gets included in either:
@@ -163,12 +163,16 @@ module HireFire
163
163
  # If there are workers active, but there are no more pending jobs,
164
164
  # then fire all the workers or set to the minimum_workers
165
165
  #
166
- # @return [nil]
166
+ # @return [Boolean] if the workers have been fired
167
167
  def fire
168
168
  if jobs == 0 and workers > min_workers
169
169
  Logger.message("All queued jobs have been processed. " + (min_workers > 0 ? "Setting workers to #{min_workers}." : "Firing all workers."))
170
170
  workers(min_workers)
171
+
172
+ return true
171
173
  end
174
+
175
+ return false
172
176
  end
173
177
 
174
178
  private
@@ -46,7 +46,7 @@ module HireFire
46
46
  ##
47
47
  # Load Delayed Job extensions, this will patch Delayed::Worker
48
48
  # to implement the necessary hooks to invoke HireFire from
49
- require File.join(HireFire::WORKERS_PATH, 'delayed_job')
49
+ require 'hirefire/workers/delayed_job'
50
50
  end
51
51
 
52
52
  ##
@@ -65,7 +65,7 @@ module HireFire
65
65
  ##
66
66
  # Load Resque extensions, this will patch Resque, Resque::Job and Resque::Worker
67
67
  # to implement the necessary hooks to invoke HireFire from
68
- require File.join(HireFire::WORKERS_PATH, 'resque')
68
+ require 'hirefire/workers/resque'
69
69
  end
70
70
  end
71
71
 
@@ -32,7 +32,7 @@ module HireFire
32
32
  # If Resque is loaded, then we load the Resque rake task
33
33
  # that'll allow Heroku to start up Resque as a worker
34
34
  if defined?(::Resque)
35
- require File.join(WORKERS_PATH, 'resque', 'tasks.rb')
35
+ require 'hirefire/workers/resque/tasks'
36
36
  end
37
37
  end
38
38
 
@@ -6,7 +6,7 @@ module HireFire
6
6
  ##
7
7
  # @return [String] the current version of the HireFire gem
8
8
  def self.current
9
- '0.1.3'
9
+ '0.1.4'
10
10
  end
11
11
 
12
12
  end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ module HireFire
4
+ module Workers
5
+ autoload :DelayedJob, 'hirefire/workers/delayed_job'
6
+ autoload :Resque, 'hirefire/workers/resque'
7
+ end
8
+ end
@@ -59,8 +59,7 @@ module Delayed
59
59
  # If this is the case it'll command the current environment to fire all the hired workers
60
60
  # and then immediately break out of this infinite loop.
61
61
  if queued.jobs == 0
62
- Delayed::Job.environment.fire
63
- break
62
+ break if Delayed::Job.environment.fire
64
63
  end
65
64
 
66
65
  break if $exit
@@ -41,12 +41,11 @@ module ::Resque
41
41
  # If this is the case it'll command the current environment to fire all the hired workers
42
42
  # and then immediately break out of this infinite loop.
43
43
  if (::Resque::Job.jobs + ::Resque::Job.working) == 0
44
- ::Resque::Job.environment.fire
45
- break
46
- else
47
- sleep(interval)
44
+ break if ::Resque::Job.environment.fire
48
45
  end
49
46
 
47
+ sleep(interval)
48
+
50
49
  end
51
50
  end
52
51
 
@@ -102,27 +102,30 @@ describe HireFire::Environment::Base do
102
102
  end
103
103
 
104
104
  it 'should set the workers to minimum workers when there arent any jobs' do
105
- base.jobs = 0
106
- base.workers = 10
107
- base.stubs(:min_workers).returns(2)
105
+ with_min_workers(2) do
106
+ base.jobs = 0
107
+ base.workers = 10
108
108
 
109
- HireFire::Logger.expects(:message).with('All queued jobs have been processed. Setting workers to 2.')
110
- base.expects(:workers).with(2).once
111
- base.fire
109
+ HireFire::Logger.expects(:message).with('All queued jobs have been processed. Setting workers to 2.')
110
+ base.expects(:workers).with(2).once
111
+ base.fire
112
+ end
112
113
  end
113
114
  end
114
115
 
115
116
  describe '#hire' do
116
117
  describe 'the standard notation' do
117
118
  before do
118
- base.stubs(:max_workers).returns(5)
119
- base.stubs(:ratio).returns([
120
- { :jobs => 1, :workers => 1 },
121
- { :jobs => 15, :workers => 2 },
122
- { :jobs => 30, :workers => 3 },
123
- { :jobs => 60, :workers => 4 },
124
- { :jobs => 90, :workers => 5 }
125
- ])
119
+ configure do |config|
120
+ config.max_workers = 5
121
+ config.job_worker_ratio = [
122
+ { :jobs => 1, :workers => 1 },
123
+ { :jobs => 15, :workers => 2 },
124
+ { :jobs => 30, :workers => 3 },
125
+ { :jobs => 60, :workers => 4 },
126
+ { :jobs => 90, :workers => 5 }
127
+ ]
128
+ end
126
129
  end
127
130
 
128
131
  it 'should request 1 worker' do
@@ -178,56 +181,62 @@ describe HireFire::Environment::Base do
178
181
  end
179
182
 
180
183
  it 'should NEVER hire more workers than the #max_workers' do
181
- base.jobs = 100
182
- base.workers = 0
183
-
184
- base.stubs(:max_workers).returns(3) # set the max_workers = 3
184
+ with_max_workers(3) do
185
+ base.jobs = 100
186
+ base.workers = 0
185
187
 
186
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
187
- base.expects(:workers).with(3).once
188
- base.hire
188
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
189
+ base.expects(:workers).with(3).once
190
+ base.hire
191
+ end
189
192
  end
190
193
 
191
194
  it 'should not hire 5 workers even if defined in the job/ratio, when the limit is 3, it should hire 3 max' do
192
- base.jobs = 100
193
- base.workers = 0
194
-
195
- base.stubs(:max_workers).returns(3) # set the max_workers = 3
196
- base.stubs(:ratio).returns([
197
- { :jobs => 5, :workers => 5 }
198
- ])
199
-
200
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
201
- base.expects(:workers).with(3).once
202
- base.hire
195
+ with_configuration do |config|
196
+ config.max_workers = 3
197
+ config.job_worker_ratio = [
198
+ { :jobs => 5, :workers => 5 }
199
+ ]
200
+
201
+ base.jobs = 100
202
+ base.workers = 0
203
+
204
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
205
+ base.expects(:workers).with(3).once
206
+ base.hire
207
+ end
203
208
  end
204
209
 
205
210
  it 'should not hire (or invoke) any more workers since the max amount allowed is already running' do
206
- base.jobs = 100
207
- base.workers = 3
208
-
209
- base.stubs(:max_workers).returns(3) # set the max_workers = 3
210
- base.stubs(:ratio).returns([
211
- { :jobs => 5, :workers => 5 }
212
- ])
213
-
214
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').never
215
- base.expects(:workers).with(3).never
216
- base.hire
211
+ with_configuration do |config|
212
+ config.max_workers = 3
213
+ config.job_worker_ratio = [
214
+ { :jobs => 5, :workers => 5 }
215
+ ]
216
+
217
+ base.jobs = 100
218
+ base.workers = 3
219
+
220
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').never
221
+ base.expects(:workers).with(3).never
222
+ base.hire
223
+ end
217
224
  end
218
225
 
219
226
  it 'the max_workers option can only "limit" the amount of max_workers when used in the "Standard Notation"' do
220
- base.jobs = 100
221
- base.workers = 0
222
-
223
- base.stubs(:max_workers).returns(10) # set the max_workers = 10
224
- base.stubs(:ratio).returns([
225
- { :jobs => 5, :workers => 5 }
226
- ])
227
-
228
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 5 in total.').once
229
- base.expects(:workers).with(5).once
230
- base.hire
227
+ with_configuration do |config|
228
+ config.max_workers = 10
229
+ config.job_worker_ratio = [
230
+ { :jobs => 5, :workers => 5 }
231
+ ]
232
+
233
+ base.jobs = 100
234
+ base.workers = 0
235
+
236
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 5 in total.').once
237
+ base.expects(:workers).with(5).once
238
+ base.hire
239
+ end
231
240
  end
232
241
 
233
242
  it 'should NEVER do API requests to Heroku if the max_workers are already running' do
@@ -251,13 +260,15 @@ describe HireFire::Environment::Base do
251
260
 
252
261
  describe 'the Lambda (functional) notation' do
253
262
  before do
254
- base.stubs(:max_workers).returns(5)
255
- base.stubs(:ratio).returns([
256
- { :when => lambda {|jobs| jobs < 15 }, :workers => 1 },
257
- { :when => lambda {|jobs| jobs < 30 }, :workers => 2 },
258
- { :when => lambda {|jobs| jobs < 60 }, :workers => 3 },
259
- { :when => lambda {|jobs| jobs < 90 }, :workers => 4 }
260
- ])
263
+ configure do |config|
264
+ config.max_workers = 5
265
+ config.job_worker_ratio = [
266
+ { :when => lambda {|jobs| jobs < 15 }, :workers => 1 },
267
+ { :when => lambda {|jobs| jobs < 30 }, :workers => 2 },
268
+ { :when => lambda {|jobs| jobs < 60 }, :workers => 3 },
269
+ { :when => lambda {|jobs| jobs < 90 }, :workers => 4 }
270
+ ]
271
+ end
261
272
  end
262
273
 
263
274
  it 'should request 1 worker' do
@@ -313,56 +324,63 @@ describe HireFire::Environment::Base do
313
324
  end
314
325
 
315
326
  it 'should NEVER hire more workers than the #max_workers' do
316
- base.jobs = 100
317
- base.workers = 0
318
-
319
- base.stubs(:max_workers).returns(3) # set the max_workers = 3
320
-
321
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
322
- base.expects(:workers).with(3).once
323
- base.hire
327
+ with_configuration do |config|
328
+ config.max_workers = 3
329
+ base.jobs = 100
330
+ base.workers = 0
331
+
332
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
333
+ base.expects(:workers).with(3).once
334
+ base.hire
335
+ end
324
336
  end
325
337
 
326
338
  it 'should not hire 5 workers even if defined in the job/ratio, when the limit is 3, it should hire 3 max' do
327
- base.jobs = 100
328
- base.workers = 0
329
-
330
- base.stubs(:max_workers).returns(3) # set the max_workers = 3
331
- base.stubs(:ratio).returns([
332
- { :when => lambda { |jobs| jobs < 5 }, :workers => 5 }
333
- ])
334
-
335
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
336
- base.expects(:workers).with(3).once
337
- base.hire
339
+ with_configuration do |config|
340
+ config.max_workers = 3
341
+ config.job_worker_ratio = [
342
+ { :when => lambda { |jobs| jobs < 5 }, :workers => 5 }
343
+ ]
344
+
345
+ base.jobs = 100
346
+ base.workers = 0
347
+
348
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').once
349
+ base.expects(:workers).with(3).once
350
+ base.hire
351
+ end
338
352
  end
339
353
 
340
354
  it 'should not hire (or invoke) any more workers since the max amount allowed is already running' do
341
- base.jobs = 100
342
- base.workers = 3
343
-
344
- base.stubs(:max_workers).returns(3) # set the max_workers = 3
345
- base.stubs(:ratio).returns([
346
- { :when => lambda { |jobs| jobs < 5 }, :workers => 5 }
347
- ])
348
-
349
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').never
350
- base.expects(:workers).with(3).never
351
- base.hire
355
+ with_configuration do |config|
356
+ config.max_workers = 3
357
+ config.job_worker_ratio = [
358
+ { :when => lambda { |jobs| jobs < 5 }, :workers => 5 }
359
+ ]
360
+
361
+ base.jobs = 100
362
+ base.workers = 3
363
+
364
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 3 in total.').never
365
+ base.expects(:workers).with(3).never
366
+ base.hire
367
+ end
352
368
  end
353
369
 
354
370
  it 'the max_workers option can only "limit" the amount of max_workers when used in the "Standard Notation"' do
355
- base.jobs = 100
356
- base.workers = 0
357
-
358
- base.stubs(:max_workers).returns(10) # set the max_workers = 10
359
- base.stubs(:ratio).returns([
360
- { :when => lambda { |jobs| jobs < 5 }, :workers => 5 }
361
- ])
362
-
363
- HireFire::Logger.expects(:message).with('Hiring more workers so we have 10 in total.').once
364
- base.expects(:workers).with(10).once
365
- base.hire
371
+ with_configuration do |config|
372
+ config.max_workers = 10
373
+ config.job_worker_ratio = [
374
+ { :when => lambda { |jobs| jobs < 5 }, :workers => 5 }
375
+ ]
376
+
377
+ base.jobs = 100
378
+ base.workers = 0
379
+
380
+ HireFire::Logger.expects(:message).with('Hiring more workers so we have 10 in total.').once
381
+ base.expects(:workers).with(10).once
382
+ base.hire
383
+ end
366
384
  end
367
385
 
368
386
  it 'should NEVER do API requests to Heroku if the max_workers are already running' do
@@ -1,12 +1,12 @@
1
1
  # encoding: utf-8
2
+ $:.unshift(File.expand_path('../', __FILE__))
3
+ $:.unshift(File.expand_path('../../lib', __FILE__))
2
4
 
3
- ##
4
- # Path to the lib directory
5
- LIB_PATH = File.expand_path('../../lib', __FILE__)
5
+ require 'hirefire'
6
6
 
7
- ##
8
- # Load the HireFire Ruby library
9
- require File.join(LIB_PATH, 'hirefire')
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir[File.join(File.expand_path('../support', __FILE__), '**/*.rb')].each {|f| require f}
10
10
 
11
11
  ##
12
12
  # Use Mocha to mock with RSpec
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module ConfigurationHelper
4
+ def configure(&block)
5
+ HireFire.configure(&block)
6
+ end
7
+
8
+ def with_configuration(&block)
9
+ old_configuration = HireFire.configuration
10
+ HireFire.configuration = HireFire::Configuration.new
11
+ yield(HireFire.configuration)
12
+ ensure
13
+ HireFire.configuration = old_configuration
14
+ end
15
+
16
+ def with_max_workers(workers, &block)
17
+ with_configuration do |config|
18
+ config.max_workers = workers
19
+ yield
20
+ end
21
+ end
22
+
23
+ def with_min_workers(workers, &block)
24
+ with_configuration do |config|
25
+ config.min_workers = workers
26
+ yield
27
+ end
28
+ end
29
+ end
30
+
31
+ RSpec.configure do |config|
32
+ config.include ConfigurationHelper
33
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: hirefire
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.3
5
+ version: 0.1.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael van Rooijen
@@ -10,7 +10,8 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-01 00:00:00 Z
13
+ date: 2011-06-28 00:00:00 +02:00
14
+ default_executable:
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: heroku
@@ -18,9 +19,9 @@ dependencies:
18
19
  requirement: &id001 !ruby/object:Gem::Requirement
19
20
  none: false
20
21
  requirements:
21
- - - ~>
22
+ - - ">="
22
23
  - !ruby/object:Gem::Version
23
- version: 2.0.0
24
+ version: "1.4"
24
25
  type: :runtime
25
26
  version_requirements: *id001
26
27
  - !ruby/object:Gem::Dependency
@@ -47,16 +48,20 @@ files:
47
48
  - .gitignore
48
49
  - .infinity_test
49
50
  - .rspec
51
+ - CHANGELOG.md
50
52
  - Gemfile
51
53
  - Gemfile.lock
52
54
  - LICENSE.md
53
55
  - README.md
56
+ - Rakefile
54
57
  - hirefire.gemspec
55
58
  - lib/hirefire.rb
56
59
  - lib/hirefire/backend.rb
60
+ - lib/hirefire/backend/delayed_job.rb
57
61
  - lib/hirefire/backend/delayed_job/active_record.rb
58
62
  - lib/hirefire/backend/delayed_job/active_record_2.rb
59
63
  - lib/hirefire/backend/delayed_job/mongoid.rb
64
+ - lib/hirefire/backend/resque.rb
60
65
  - lib/hirefire/backend/resque/redis.rb
61
66
  - lib/hirefire/configuration.rb
62
67
  - lib/hirefire/environment.rb
@@ -68,6 +73,7 @@ files:
68
73
  - lib/hirefire/logger.rb
69
74
  - lib/hirefire/railtie.rb
70
75
  - lib/hirefire/version.rb
76
+ - lib/hirefire/workers.rb
71
77
  - lib/hirefire/workers/delayed_job.rb
72
78
  - lib/hirefire/workers/delayed_job/worker.rb
73
79
  - lib/hirefire/workers/resque.rb
@@ -78,6 +84,8 @@ files:
78
84
  - spec/environment_spec.rb
79
85
  - spec/logger_spec.rb
80
86
  - spec/spec_helper.rb
87
+ - spec/support/configuration_helper.rb
88
+ has_rdoc: true
81
89
  homepage: http://rubygems.org/gems/hirefire
82
90
  licenses: []
83
91
 
@@ -101,10 +109,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
109
  requirements: []
102
110
 
103
111
  rubyforge_project:
104
- rubygems_version: 1.7.2
112
+ rubygems_version: 1.6.2
105
113
  signing_key:
106
114
  specification_version: 3
107
115
  summary: HireFire automatically "hires" and "fires" (aka "scales") Delayed Job and Resque workers on Heroku.
108
116
  test_files: []
109
117
 
110
- has_rdoc: