dyno_scaler 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2RiYzBkZGQ3NDE1N2IwNzc0M2QyMTEwZDhjMmI1NTBmNjgxYmMzNA==
5
+ data.tar.gz: !binary |-
6
+ ZWRhYjU2YzM4Y2U1MDFmYmVjOGUzNzU3NjI0YjdkMzM0OTJiOTgxMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YTc5Mjg1ZThiOGRlNjZhY2ZhYzY2NzQzYjU3ZWUyNGEzMjllNzAyZDVmNGZi
10
+ NGZmNWEwZTRjZDdjYTY1ZWYxYWIwNmQ3Mzg3OWEwODI5OTI2ZDA4ZGMxOGMw
11
+ Yjg2NTNkZGFiMmIwMzk5NjVkZDkwNDA3YzAyM2I4OTA0MGU1YzQ=
12
+ data.tar.gz: !binary |-
13
+ ZDkwYzA2ZjdmNWNiOGZlZjkwOTMzMjVmMDg0NTI4ZTllMjAyZDkzMGM3NTMx
14
+ NjY2MjI2YThmYmZhOTAzNTQ4N2FhMjI4OWUwMzM0NDQzYzI1OTFmZjMyZGZk
15
+ YmQ1ZGM5N2M3Y2Q0N2IyNzExNjI2MjdiODgxMjkxYzY0Mzg0MDk=
data/.rspec CHANGED
@@ -1,4 +1,3 @@
1
1
  --color
2
2
  --format documentation
3
- --debug
4
3
  --drb
data/.travis.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
5
4
  - jruby-19mode # JRuby in 1.9 mode
5
+ services:
6
+ - redis-server
7
+ bundler_args: --without development
data/Gemfile CHANGED
@@ -10,11 +10,17 @@ group(:development) do
10
10
 
11
11
  platforms :jruby do
12
12
  gem 'ruby-debug'
13
- gem 'jruby-openssl'
14
13
  end
15
14
  end
16
15
 
16
+ platforms :jruby do
17
+ gem 'jruby-openssl'
18
+ end
19
+
17
20
  group(:test) do
18
21
  gem 'simplecov', require: false
22
+ gem 'rspec'
23
+ gem 'resque'
24
+ gem 'girl_friday'
19
25
  gem 'rails'
20
26
  end
data/Gemfile.lock CHANGED
@@ -1,76 +1,112 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dyno_scaler (0.2.0)
4
+ dyno_scaler (0.3.0)
5
5
  activesupport
6
6
  heroku-api
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- actionmailer (0.6.1)
12
- actionpack (>= 0.9.5)
13
- actionpack (1.4.0)
14
- activemodel (3.2.13)
15
- activesupport (= 3.2.13)
16
- builder (~> 3.0.0)
17
- activerecord (3.2.13)
18
- activemodel (= 3.2.13)
19
- activesupport (= 3.2.13)
20
- arel (~> 3.0.2)
21
- tzinfo (~> 0.3.29)
22
- activesupport (3.2.13)
23
- i18n (= 0.6.1)
24
- multi_json (~> 1.0)
25
- arel (3.0.2)
11
+ actionmailer (4.1.1)
12
+ actionpack (= 4.1.1)
13
+ actionview (= 4.1.1)
14
+ mail (~> 2.5.4)
15
+ actionpack (4.1.1)
16
+ actionview (= 4.1.1)
17
+ activesupport (= 4.1.1)
18
+ rack (~> 1.5.2)
19
+ rack-test (~> 0.6.2)
20
+ actionview (4.1.1)
21
+ activesupport (= 4.1.1)
22
+ builder (~> 3.1)
23
+ erubis (~> 2.7.0)
24
+ activemodel (4.1.1)
25
+ activesupport (= 4.1.1)
26
+ builder (~> 3.1)
27
+ activerecord (4.1.1)
28
+ activemodel (= 4.1.1)
29
+ activesupport (= 4.1.1)
30
+ arel (~> 5.0.0)
31
+ activesupport (4.1.1)
32
+ i18n (~> 0.6, >= 0.6.9)
33
+ json (~> 1.7, >= 1.7.7)
34
+ minitest (~> 5.1)
35
+ thread_safe (~> 0.1)
36
+ tzinfo (~> 1.1)
37
+ arel (5.0.1.20140414130214)
26
38
  bouncy-castle-java (1.5.0147)
27
- builder (3.0.4)
28
- columnize (0.3.6)
29
- connection_pool (1.0.0)
30
- debugger (1.6.0)
39
+ builder (3.2.2)
40
+ columnize (0.8.9)
41
+ connection_pool (1.2.0)
42
+ debugger (1.6.7)
31
43
  columnize (>= 0.3.1)
32
44
  debugger-linecache (~> 1.2.0)
33
- debugger-ruby_core_source (~> 1.2.1)
45
+ debugger-ruby_core_source (~> 1.3.5)
34
46
  debugger-linecache (1.2.0)
35
- debugger-ruby_core_source (1.2.2)
36
- diff-lcs (1.2.4)
37
- excon (0.22.1)
47
+ debugger-ruby_core_source (1.3.5)
48
+ diff-lcs (1.2.5)
49
+ docile (1.1.3)
50
+ erubis (2.7.0)
51
+ excon (0.33.0)
38
52
  girl_friday (0.11.2)
39
53
  connection_pool (~> 1.0)
40
54
  rubinius-actor
41
- heroku-api (0.3.11)
42
- excon (~> 0.22.1)
43
- i18n (0.6.1)
44
- jruby-openssl (0.8.8)
55
+ heroku-api (0.3.18)
56
+ excon (~> 0.27)
57
+ multi_json (~> 1.8)
58
+ hike (1.2.3)
59
+ i18n (0.6.9)
60
+ jruby-openssl (0.9.4)
45
61
  bouncy-castle-java (>= 1.5.0147)
62
+ json (1.8.1)
63
+ json (1.8.1-java)
64
+ mail (2.5.4)
65
+ mime-types (~> 1.16)
66
+ treetop (~> 1.4.8)
67
+ mime-types (1.25.1)
68
+ minitest (5.3.4)
46
69
  mono_logger (1.1.0)
47
- multi_json (1.7.4)
70
+ multi_json (1.10.1)
71
+ polyglot (0.3.4)
48
72
  rack (1.5.2)
49
- rack-protection (1.5.0)
73
+ rack-protection (1.5.3)
50
74
  rack
51
- rails (0.9.5)
52
- actionmailer (>= 0.6.1)
53
- actionpack (>= 1.4.0)
54
- activerecord (>= 1.6.0)
55
- rake (>= 0.4.15)
56
- rake (10.0.4)
57
- redis (3.0.4)
58
- redis-namespace (1.3.0)
59
- redis (~> 3.0.0)
60
- resque (1.24.1)
75
+ rack-test (0.6.2)
76
+ rack (>= 1.0)
77
+ rails (4.1.1)
78
+ actionmailer (= 4.1.1)
79
+ actionpack (= 4.1.1)
80
+ actionview (= 4.1.1)
81
+ activemodel (= 4.1.1)
82
+ activerecord (= 4.1.1)
83
+ activesupport (= 4.1.1)
84
+ bundler (>= 1.3.0, < 2.0)
85
+ railties (= 4.1.1)
86
+ sprockets-rails (~> 2.0)
87
+ railties (4.1.1)
88
+ actionpack (= 4.1.1)
89
+ activesupport (= 4.1.1)
90
+ rake (>= 0.8.7)
91
+ thor (>= 0.18.1, < 2.0)
92
+ rake (10.3.2)
93
+ redis (3.0.7)
94
+ redis-namespace (1.4.1)
95
+ redis (~> 3.0.4)
96
+ resque (1.25.2)
61
97
  mono_logger (~> 1.0)
62
98
  multi_json (~> 1.0)
63
- redis-namespace (~> 1.2)
99
+ redis-namespace (~> 1.3)
64
100
  sinatra (>= 0.9.2)
65
101
  vegas (~> 0.1.2)
66
- rspec (2.13.0)
67
- rspec-core (~> 2.13.0)
68
- rspec-expectations (~> 2.13.0)
69
- rspec-mocks (~> 2.13.0)
70
- rspec-core (2.13.1)
71
- rspec-expectations (2.13.0)
102
+ rspec (2.14.1)
103
+ rspec-core (~> 2.14.0)
104
+ rspec-expectations (~> 2.14.0)
105
+ rspec-mocks (~> 2.14.0)
106
+ rspec-core (2.14.8)
107
+ rspec-expectations (2.14.5)
72
108
  diff-lcs (>= 1.1.3, < 2.0)
73
- rspec-mocks (2.13.1)
109
+ rspec-mocks (2.14.6)
74
110
  rubinius-actor (0.0.2)
75
111
  rubinius-core-api
76
112
  rubinius-core-api (0.0.1)
@@ -79,16 +115,33 @@ GEM
79
115
  columnize (>= 0.1)
80
116
  ruby-debug-base (~> 0.10.4.0)
81
117
  ruby-debug-base (0.10.4-java)
82
- simplecov (0.7.1)
83
- multi_json (~> 1.0)
84
- simplecov-html (~> 0.7.1)
85
- simplecov-html (0.7.1)
86
- sinatra (1.4.2)
87
- rack (~> 1.5, >= 1.5.2)
118
+ simplecov (0.8.2)
119
+ docile (~> 1.1.0)
120
+ multi_json
121
+ simplecov-html (~> 0.8.0)
122
+ simplecov-html (0.8.0)
123
+ sinatra (1.4.5)
124
+ rack (~> 1.4)
88
125
  rack-protection (~> 1.4)
89
126
  tilt (~> 1.3, >= 1.3.4)
127
+ sprockets (2.12.1)
128
+ hike (~> 1.2)
129
+ multi_json (~> 1.0)
130
+ rack (~> 1.0)
131
+ tilt (~> 1.1, != 1.3.0)
132
+ sprockets-rails (2.1.3)
133
+ actionpack (>= 3.0)
134
+ activesupport (>= 3.0)
135
+ sprockets (~> 2.8)
136
+ thor (0.19.1)
137
+ thread_safe (0.3.3)
138
+ thread_safe (0.3.3-java)
90
139
  tilt (1.4.1)
91
- tzinfo (0.3.37)
140
+ treetop (1.4.15)
141
+ polyglot
142
+ polyglot (>= 0.3.1)
143
+ tzinfo (1.2.0)
144
+ thread_safe (~> 0.1)
92
145
  vegas (0.1.11)
93
146
  rack (>= 1.0.0)
94
147
 
data/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # DynoScaler
2
2
 
3
- [![alt build status][1]][2]
3
+ [![build status][1]][2]
4
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/dtmtec/dyno_scaler/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
4
5
 
5
- [1]: https://travis-ci.org/dtmconsultoria/dyno_scaler.png?branch=master
6
- [2]: http://travis-ci.org/dtmconsultoria/dyno_scaler
6
+ [1]: https://travis-ci.org/dtmtec/dyno_scaler.png
7
+ [2]: http://travis-ci.org/dtmtec/dyno_scaler
7
8
 
8
9
  Scale your dyno workers on Heroku as needed, pay only for what you use!
9
10
 
data/dyno_scaler.gemspec CHANGED
@@ -19,8 +19,4 @@ Gem::Specification.new do |gem|
19
19
 
20
20
  gem.add_dependency "heroku-api"
21
21
  gem.add_dependency "activesupport"
22
-
23
- gem.add_development_dependency "rspec"
24
- gem.add_development_dependency "resque"
25
- gem.add_development_dependency "girl_friday"
26
22
  end
@@ -1,3 +1,3 @@
1
1
  module DynoScaler
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -15,6 +15,10 @@ module DynoScaler
15
15
  enable_scaling_down
16
16
  end
17
17
 
18
+ def scale(&block)
19
+ self.class.scale(&block)
20
+ end
21
+
18
22
  module ClassMethods
19
23
  def after_perform_scale_down(*args)
20
24
  info = ::Resque.info
@@ -27,7 +31,7 @@ module DynoScaler
27
31
  end
28
32
 
29
33
  def after_enqueue_scale_up(*args)
30
- if scale_up_enabled?
34
+ if scale_up_enabled? && !scaling?
31
35
  if DynoScaler.configuration.async?
32
36
  DynoScaler.configuration.async.call(::Resque.info.merge(action: :scale_up))
33
37
  else
@@ -54,6 +58,18 @@ module DynoScaler
54
58
  self.scale_down_enabled = false
55
59
  end
56
60
 
61
+ def scaling?
62
+ @scaling
63
+ end
64
+
65
+ def scale(&block)
66
+ @scaling = true
67
+ result = block.call if block_given?
68
+ dyno_scaler_manager.scale_with(::Resque.info)
69
+ @scaling = false
70
+ result
71
+ end
72
+
57
73
  private
58
74
  def dyno_scaler_manager
59
75
  @manager ||= DynoScaler::Manager.new
@@ -6,10 +6,10 @@ describe DynoScaler::Heroku do
6
6
  subject(:heroku_client) { DynoScaler::Heroku.new application, options }
7
7
 
8
8
  describe "scaling workers" do
9
- let(:heroku_api) { mock(::Heroku::API, :post_ps_scale => false) }
9
+ let(:heroku_api) { double(::Heroku::API, :post_ps_scale => false) }
10
10
 
11
11
  before do
12
- ::Heroku::API.stub!(:new).and_return(heroku_api)
12
+ ::Heroku::API.stub(:new).and_return(heroku_api)
13
13
  end
14
14
 
15
15
  let(:quantity) { 2 }
@@ -5,7 +5,7 @@ describe DynoScaler::Manager do
5
5
 
6
6
  subject(:manager) { DynoScaler::Manager.new }
7
7
 
8
- let(:heroku) { mock(DynoScaler::Heroku, scale_workers: false) }
8
+ let(:heroku) { double(DynoScaler::Heroku, scale_workers: false) }
9
9
 
10
10
  let(:workers) { 0 }
11
11
  let(:pending_jobs) { 0 }
@@ -27,7 +27,7 @@ describe DynoScaler::Manager do
27
27
  config.application = 'my-app'
28
28
  config.enabled = true
29
29
 
30
- DynoScaler::Heroku.stub!(:new).with(config.application).and_return(heroku)
30
+ DynoScaler::Heroku.stub(:new).with(config.application).and_return(heroku)
31
31
  end
32
32
 
33
33
  shared_examples_for "disabled" do
@@ -348,7 +348,7 @@ describe DynoScaler::Manager do
348
348
  end
349
349
 
350
350
  describe "running workers" do
351
- let(:heroku) { mock(DynoScaler::Heroku, scale_workers: false, running_workers: 2) }
351
+ let(:heroku) { double(DynoScaler::Heroku, scale_workers: false, running_workers: 2) }
352
352
 
353
353
  its(:running_workers) { should eq(heroku.running_workers) }
354
354
  end
@@ -17,23 +17,25 @@ class SampleJob
17
17
  end
18
18
 
19
19
  describe DynoScaler::Workers::Resque do
20
- let(:manager) { mock(DynoScaler::Manager, scale_up: false, scale_down: false) }
20
+ let(:manager) { double(DynoScaler::Manager, scale_up: false, scale_down: false) }
21
21
 
22
22
  let(:workers) { 0 }
23
23
  let(:working) { 0 }
24
24
  let(:pending) { 1 }
25
25
 
26
26
  before do
27
- Resque.stub!(:info).and_return({
27
+ Resque.stub(:info).and_return({
28
28
  workers: workers,
29
29
  working: working,
30
30
  pending: pending
31
31
  })
32
32
 
33
33
  SampleJob.reset!
34
- DynoScaler::Manager.stub!(:new).and_return(manager)
34
+ DynoScaler::Manager.stub(:new).and_return(manager)
35
35
  end
36
36
 
37
+ after { DynoScaler.configuration.async = false }
38
+
37
39
  def work_off(queue)
38
40
  job = Resque::Job.reserve(queue)
39
41
  job ? job.perform : fail("No jobs for queue '#{queue}'.")
@@ -63,6 +65,25 @@ describe DynoScaler::Workers::Resque do
63
65
  end
64
66
  end
65
67
 
68
+ context "when it is scaling" do
69
+ before { SampleJob.stub(:scaling?).and_return(true) }
70
+
71
+ it "does not scales up" do
72
+ manager.should_not_receive(:scale_up)
73
+ Resque.enqueue(SampleJob)
74
+ end
75
+
76
+ context "and async is configured" do
77
+ let(:config) { DynoScaler.configuration }
78
+ before { config.async = true }
79
+
80
+ it "does not calls the given async processor" do
81
+ config.async.should_not_receive(:call)
82
+ Resque.enqueue(SampleJob)
83
+ end
84
+ end
85
+ end
86
+
66
87
  context "when scaling up is disabled" do
67
88
  before { SampleJob.disable_scaling_up }
68
89
  after { SampleJob.enable_scaling_up }
@@ -75,7 +96,7 @@ describe DynoScaler::Workers::Resque do
75
96
 
76
97
  context "when an error occurs while scaling up" do
77
98
  before do
78
- manager.stub!(:scale_up).and_raise("error")
99
+ manager.stub(:scale_up).and_raise("error")
79
100
  end
80
101
 
81
102
  it "does not raises it" do
@@ -135,6 +156,56 @@ describe DynoScaler::Workers::Resque do
135
156
  end
136
157
  end
137
158
 
159
+ describe "#scale" do
160
+ it "calls the Klass.scale" do
161
+ block = Proc.new { |a| }
162
+ SampleJob.should_receive(:scale).and_yield(block)
163
+ SampleJob.new.scale(&block)
164
+ end
165
+ end
166
+
167
+ describe ".scale" do
168
+ before { manager.stub(:scale_with) }
169
+
170
+ it "should not be scaling before it is run" do
171
+ SampleJob.should_not be_scaling
172
+ SampleJob.scale { }
173
+ end
174
+
175
+ it "should not be scaling after it is run" do
176
+ SampleJob.scale { }
177
+ SampleJob.should_not be_scaling
178
+ end
179
+
180
+ it "calls the given block" do
181
+ called = false
182
+ SampleJob.scale do
183
+ called = true
184
+ end
185
+
186
+ called.should be_true
187
+ end
188
+
189
+ it "sets scaling? to true inside the given block" do
190
+ SampleJob.scale do
191
+ SampleJob.should be_scaling
192
+ end
193
+ end
194
+
195
+ it "returns the result of the block" do
196
+ result = SampleJob.scale do
197
+ 'some value'
198
+ end
199
+
200
+ result.should eq('some value')
201
+ end
202
+
203
+ it "scales with Resque.info" do
204
+ manager.should_receive(:scale_with).with(Resque.info)
205
+ SampleJob.scale {}
206
+ end
207
+ end
208
+
138
209
  describe "after performing" do
139
210
  before do
140
211
  Resque.enqueue(SampleJob)
@@ -184,7 +255,7 @@ describe DynoScaler::Workers::Resque do
184
255
 
185
256
  context "when an error occurs while scaling down" do
186
257
  before do
187
- manager.stub!(:scale_down).and_raise("error")
258
+ manager.stub(:scale_down).and_raise("error")
188
259
  end
189
260
 
190
261
  it "does not raises it" do
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,11 @@ ENV['RACK_ENV'] ||= 'test'
10
10
 
11
11
  Bundler.require :default, ENV['RACK_ENV']
12
12
 
13
+ begin
14
+ require 'debugger'
15
+ rescue LoadError
16
+ end
17
+
13
18
  RSpec.configure do |config|
14
19
  config.treat_symbols_as_metadata_keys_with_true_values = true
15
20
  config.run_all_when_everything_filtered = true
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dyno_scaler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Vicente Mundim
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-28 00:00:00.000000000 Z
11
+ date: 2014-05-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: heroku-api
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activesupport
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,55 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: rspec
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- - !ruby/object:Gem::Dependency
63
- name: resque
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- type: :development
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
- - !ruby/object:Gem::Dependency
79
- name: girl_friday
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ! '>='
84
- - !ruby/object:Gem::Version
85
- version: '0'
86
- type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
37
  requirements:
91
38
  - - ! '>='
92
39
  - !ruby/object:Gem::Version
@@ -124,33 +71,26 @@ files:
124
71
  - spec/spec_helper.rb
125
72
  homepage: ''
126
73
  licenses: []
74
+ metadata: {}
127
75
  post_install_message:
128
76
  rdoc_options: []
129
77
  require_paths:
130
78
  - lib
131
79
  required_ruby_version: !ruby/object:Gem::Requirement
132
- none: false
133
80
  requirements:
134
81
  - - ! '>='
135
82
  - !ruby/object:Gem::Version
136
83
  version: '0'
137
- segments:
138
- - 0
139
- hash: 2224126621468173424
140
84
  required_rubygems_version: !ruby/object:Gem::Requirement
141
- none: false
142
85
  requirements:
143
86
  - - ! '>='
144
87
  - !ruby/object:Gem::Version
145
88
  version: '0'
146
- segments:
147
- - 0
148
- hash: 2224126621468173424
149
89
  requirements: []
150
90
  rubyforge_project:
151
- rubygems_version: 1.8.25
91
+ rubygems_version: 2.2.2
152
92
  signing_key:
153
- specification_version: 3
93
+ specification_version: 4
154
94
  summary: Scale your dyno workers on Heroku as needed
155
95
  test_files:
156
96
  - spec/dyno_scaler/configuration_spec.rb