heroscale 0.0.1 → 0.0.2

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.
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source :rubygems
2
2
 
3
- gem "rake"
4
3
  gemspec
data/Gemfile.lock CHANGED
@@ -1,14 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- heroscale (0.0.1)
5
- rack (~> 1.0)
4
+ heroscale (0.0.2)
6
5
 
7
6
  GEM
8
7
  remote: http://rubygems.org/
9
8
  specs:
10
9
  diff-lcs (1.1.2)
11
- rack (1.2.1)
10
+ json (1.4.6)
12
11
  rake (0.8.7)
13
12
  rspec (2.1.0)
14
13
  rspec-core (~> 2.1.0)
@@ -24,6 +23,6 @@ PLATFORMS
24
23
 
25
24
  DEPENDENCIES
26
25
  heroscale!
27
- rack (~> 1.0)
28
- rake
26
+ json
27
+ rake (~> 0.8.7)
29
28
  rspec (~> 2.0)
data/Rakefile CHANGED
@@ -39,5 +39,4 @@ Rake::RDocTask.new do |rdoc|
39
39
  rdoc.rdoc_files.include("lib/**/*.rb")
40
40
  end
41
41
 
42
-
43
42
  task :default => :spec
data/heroscale.gemspec CHANGED
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "heroscale"
3
- s.version = "0.0.1"
3
+ s.version = "0.0.2"
4
4
 
5
5
  s.authors = ["Jacques Crocker"]
6
6
  s.summary = "Autoscale your heroku app"
7
- s.description = "This rack middleware that allows easy external querying of your heroku's app queue depth"
7
+ s.description = "Rack middleware that allows easy external querying of your heroku's app queue depth"
8
8
 
9
9
  s.email = "railsjedi@gmail.com"
10
10
  s.homepage = "http://github.com/railsjedi/heroscale"
@@ -27,8 +27,9 @@ Gem::Specification.new do |s|
27
27
  "README.md"
28
28
  ]
29
29
 
30
- s.add_runtime_dependency 'rack', '~> 1.0'
30
+ s.add_development_dependency "json"
31
31
  s.add_development_dependency "rspec", "~> 2.0"
32
+ s.add_development_dependency 'rake', '~> 0.8.7'
32
33
  end
33
34
 
34
35
 
@@ -0,0 +1,29 @@
1
+ module Heroscale
2
+
3
+ # simple Rack Middleware that adds a hook to return the heroku env info
4
+ class Middleware
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ if env["PATH_INFO"] == "/heroscale/status"
11
+ queue_wait_time = env['HTTP_X_HEROKU_QUEUE_WAIT_TIME']
12
+ queue_depth = env['HTTP_X_HEROKU_QUEUE_DEPTH']
13
+ dynos_in_use = env['HTTP_X_HEROKU_DYNOS_IN_USE']
14
+
15
+ if queue_wait_time and queue_depth and dynos_in_use
16
+ # format the response on heroku
17
+ res = %|{"heroku": true, "queue_wait_time": #{queue_wait_time.to_i}, "queue_depth": #{queue_depth.to_i}, "dynos_in_use": #{dynos_in_use.to_i}}|
18
+ else
19
+ res = %|{"heroku": false}|
20
+ end
21
+
22
+ [ 200, {'Content-Type' => 'application/json'}, res]
23
+ else
24
+ @app.call(env)
25
+ end
26
+ end
27
+
28
+ end
29
+ end
File without changes
data/lib/heroscale.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'heroscale/middleware'
2
+ require 'heroscale/railtie' if defined?(Rails::Railtie)
@@ -0,0 +1,74 @@
1
+ require "spec_helper"
2
+ require "heroscale"
3
+
4
+ require "json"
5
+
6
+ describe Heroscale::Middleware do
7
+
8
+ # this is our original app (that the middleware is wrapping around)
9
+ let(:orig_app) do
10
+ lambda do |env|
11
+ [ 200, {'Content-Type' => 'application/json'}, "HELLO!"]
12
+ end
13
+ end
14
+
15
+ # this is our app with the middleware attached
16
+ let(:app) do
17
+ Heroscale::Middleware.new orig_app
18
+ end
19
+
20
+ def heroku_request(opts = {})
21
+ app.call({
22
+ 'PATH_INFO' => '/heroscale/status',
23
+ 'HTTP_X_HEROKU_QUEUE_WAIT_TIME' => (opts[:wait] || 100),
24
+ 'HTTP_X_HEROKU_QUEUE_DEPTH' => (opts[:depth] || 0),
25
+ 'HTTP_X_HEROKU_DYNOS_IN_USE' => (opts[:dynos] || 1)
26
+ })
27
+ end
28
+
29
+ context "when querying on a heroku instance" do
30
+ before(:each) do
31
+ @rack_response = heroku_request(:wait => 100, :depth => 5, :dynos => 12)
32
+ @json = JSON.parse(@rack_response.last)
33
+ end
34
+
35
+ it "should return the 'heroku' field that tells that we're on heroku" do
36
+ @json["heroku"].should == true
37
+ end
38
+
39
+ it "should return the 'queue_wait_time' field that tells us the queue wait time" do
40
+ @json["queue_wait_time"].should == 100
41
+ end
42
+
43
+ it "should return the 'queue_depth' field that tells us the current queue depth" do
44
+ @json["queue_depth"].should == 5
45
+ end
46
+
47
+ it "should return the 'dynos_in_use' field that tells us the current heroku dynos in use" do
48
+ @json["dynos_in_use"].should == 12
49
+ end
50
+
51
+ end
52
+
53
+ context "when not quering the status link" do
54
+ it "should return the original app's response" do
55
+ app.call({}).last.should == "HELLO!"
56
+ app.call({"PATH_INFO" => "/"}).last.should == "HELLO!"
57
+ app.call({"PATH_INFO" => "/heroscale/"}).last.should == "HELLO!"
58
+ app.call({"PATH_INFO" => "/heroscale/status2"}).last.should == "HELLO!"
59
+ end
60
+
61
+ end
62
+
63
+ context "when query while not on a heroku instance" do
64
+ before(:each) do
65
+ @rack_response = app.call({"PATH_INFO" => "/heroscale/status"})
66
+ @json = JSON.parse(@rack_response.last)
67
+ end
68
+
69
+ it "should return the 'heroku' field telling use we're not on heroku" do
70
+ @json["heroku"].should == false
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ require "rspec"
3
+
4
+ $:.unshift "lib"
5
+
6
+ Rspec.configure do |config|
7
+ config.color_enabled = true
8
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jacques Crocker
@@ -14,21 +14,20 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-13 00:00:00 -08:00
17
+ date: 2010-11-14 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rack
21
+ name: json
22
22
  requirement: &id001 !ruby/object:Gem::Requirement
23
23
  none: false
24
24
  requirements:
25
- - - ~>
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
- - 1
29
28
  - 0
30
- version: "1.0"
31
- type: :runtime
29
+ version: "0"
30
+ type: :development
32
31
  prerelease: false
33
32
  version_requirements: *id001
34
33
  - !ruby/object:Gem::Dependency
@@ -45,7 +44,22 @@ dependencies:
45
44
  type: :development
46
45
  prerelease: false
47
46
  version_requirements: *id002
48
- description: This rack middleware that allows easy external querying of your heroku's app queue depth
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ - 8
57
+ - 7
58
+ version: 0.8.7
59
+ type: :development
60
+ prerelease: false
61
+ version_requirements: *id003
62
+ description: Rack middleware that allows easy external querying of your heroku's app queue depth
49
63
  email: railsjedi@gmail.com
50
64
  executables: []
51
65
 
@@ -55,6 +69,11 @@ extra_rdoc_files:
55
69
  - LICENSE
56
70
  - README.md
57
71
  files:
72
+ - lib/heroscale/middleware.rb
73
+ - lib/heroscale/railtie.rb
74
+ - lib/heroscale.rb
75
+ - spec/heroscale/middleware_spec.rb
76
+ - spec/spec_helper.rb
58
77
  - heroscale.gemspec
59
78
  - Gemfile
60
79
  - Gemfile.lock
@@ -75,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
75
94
  requirements:
76
95
  - - ">="
77
96
  - !ruby/object:Gem::Version
78
- hash: 176599757990332131
97
+ hash: -2259297854901398522
79
98
  segments:
80
99
  - 0
81
100
  version: "0"
@@ -84,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
103
  requirements:
85
104
  - - ">="
86
105
  - !ruby/object:Gem::Version
87
- hash: 176599757990332131
106
+ hash: -2259297854901398522
88
107
  segments:
89
108
  - 0
90
109
  version: "0"
@@ -95,5 +114,6 @@ rubygems_version: 1.3.7
95
114
  signing_key:
96
115
  specification_version: 3
97
116
  summary: Autoscale your heroku app
98
- test_files: []
99
-
117
+ test_files:
118
+ - spec/heroscale/middleware_spec.rb
119
+ - spec/spec_helper.rb