operations_middleware 0.3.0

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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Emily Price
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = operation_middleware
2
+
3
+ Description goes here.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 Emily Price. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "operations_middleware"
8
+ gem.summary = %Q{Rack middleware to provide route for heartbeat and version pages.}
9
+ gem.description = %Q{Rack middleware to provide route for heartbeat and version pages. Includes links to github repo. }
10
+ gem.email = ""
11
+ gem.homepage = "http://github.com/primedia/operations_middleware"
12
+ gem.authors = ["Primedia Team"]
13
+ gem.add_dependency "rack", "= 1.0.1"
14
+ gem.add_development_dependency "rspec", ">= 1.2.9"
15
+ gem.add_development_dependency "rack-test"
16
+ gem.add_development_dependency 'rspec_tag_matchers'
17
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
+ end
19
+ Jeweler::GemcutterTasks.new
20
+ rescue LoadError
21
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
22
+ end
23
+
24
+ require 'spec/rake/spectask'
25
+ Spec::Rake::SpecTask.new(:spec) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.spec_files = FileList['spec/**/*_spec.rb']
28
+ end
29
+
30
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
31
+ spec.libs << 'lib' << 'spec'
32
+ spec.pattern = 'spec/**/*_spec.rb'
33
+ spec.rcov = true
34
+ end
35
+
36
+ task :spec => :check_dependencies
37
+
38
+ task :default => :spec
39
+
40
+ require 'rake/rdoctask'
41
+ Rake::RDocTask.new do |rdoc|
42
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
43
+
44
+ rdoc.rdoc_dir = 'rdoc'
45
+ rdoc.title = "operation_middleware #{version}"
46
+ rdoc.rdoc_files.include('README*')
47
+ rdoc.rdoc_files.include('lib/**/*.rb')
48
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.0
@@ -0,0 +1,171 @@
1
+ class OperationsMiddleware
2
+ attr_writer :app_name
3
+ attr_accessor :file_root, :heartbeat
4
+
5
+ def initialize(app)
6
+ @app = app
7
+ @heartbeat = {}
8
+ yield self if block_given?
9
+ end
10
+
11
+ def call(env)
12
+ return @app.call(env) unless env['PATH_INFO'] =~ %r{^/ops/(heartbeat|version)(?:/(\w+))?/?$}
13
+
14
+ @status = 200
15
+ @headers = {}
16
+
17
+ if $1 == 'heartbeat'
18
+ if $2
19
+ check_heartbeat($2)
20
+ else
21
+ @body = "#{app_name} is OK"
22
+ end
23
+ else
24
+ @body = version_template
25
+ end
26
+
27
+ @headers['Content-Type'] = "text/html"
28
+ @headers['Content-Length'] = @body.length.to_s
29
+
30
+
31
+ [@status, @headers, @body]
32
+ end
33
+
34
+ private
35
+
36
+ def check_heartbeat(heartbeat_name)
37
+ if heartbeat_name and heartbeat[heartbeat_name.to_sym]
38
+ begin
39
+ heartbeat[heartbeat_name.to_sym].call
40
+ rescue
41
+ @status = 500
42
+ @body = "ERROR: #{heartbeat_name} does not have a heartbeat"
43
+ else
44
+ @body = "#{heartbeat_name} is OK"
45
+ end
46
+ else
47
+ @status = 500
48
+ @body = "ERROR: #{heartbeat_name} does not have a heartbeat"
49
+ end
50
+ end
51
+
52
+ def environment
53
+ ENV['RAILS_ENV']
54
+ end
55
+
56
+ def version_or_branch
57
+ return @version if @version
58
+ version_file = ::File.join(file_root, 'VERSION')
59
+ if ::File.exists?( version_file )
60
+ @version = ::File.read(version_file).chomp.gsub('^{}', '')
61
+ elsif environment == 'development' and `git branch` =~ /^\* (.*)$/
62
+ @version = $1
63
+ else
64
+ @version = 'Unknown (VERSION file is missing)'
65
+ end
66
+ @version
67
+ end
68
+
69
+ def deploy_date
70
+ return @deploy_date if @deploy_date
71
+ version_file = ::File.join(file_root, 'VERSION')
72
+ if ::File.exists?( version_file )
73
+ @deploy_date = ::File.stat(version_file).mtime
74
+ elsif environment == 'development'
75
+ @deploy_date = Time.now
76
+ else
77
+ @deploy_date = 'Unknown (VERSION file is missing)'
78
+ end
79
+ @deploy_date
80
+ end
81
+
82
+ def last_commit
83
+ return @last_commit if @last_commit
84
+ revision_file = ::File.join(file_root, 'REVISION')
85
+ if ::File.exists?( revision_file )
86
+ @last_commit = ::File.read(revision_file).chomp
87
+ elsif environment == 'development' and `git show` =~ /^commit (.*)$/
88
+ @last_commit = $1
89
+ else
90
+ @last_commit = 'Unknown (REVISION file is missing)'
91
+ end
92
+ @last_commit
93
+ end
94
+
95
+ def hostname
96
+ return @hostname if @hostname
97
+ hostname = `/bin/hostname`
98
+ @hostname = hostname.nil? || hostname.empty? ? "Unknown" : hostname
99
+ end
100
+
101
+ def app_name
102
+ return @app_name if @app_name
103
+ dirs = Dir.pwd.split('/')
104
+ app_name = dirs.last
105
+ app_name = dirs[-3] if app_name =~ /^\d+$/
106
+ app_name.sub!(/\.com$/, '')
107
+ @app_name ||= app_name
108
+ end
109
+
110
+ def headers
111
+ hh = @headers.select{|k,v| k.match(/^HTTP.*/) }
112
+ return if hh.nil? || hh.empty?
113
+ ret = "<table border='1' style='width:100%'>"
114
+ hh.each { |k, v| ret += "<tr><td>#{k}</td><td>#{v}</td></tr>" }
115
+ ret += "</table>"
116
+ end
117
+
118
+ def version_link
119
+ return version_or_branch if version_or_branch =~ /^Unknown/
120
+ "<a href='https://github.com/primedia/#{app_name}/tree/#{version_or_branch}' style='font-size: 20px;'>#{version_or_branch}</a>"
121
+ end
122
+
123
+ def last_commit_link
124
+ return last_commit if last_commit =~ /^Unknown/
125
+ "<a href='https://github.com/primedia/#{app_name}/commit/#{last_commit}' style='font-size: 20px;'>#{last_commit}</a>"
126
+ end
127
+
128
+ def version_template
129
+ <<-HTML
130
+ <div class='container' style=' width: 1000px;'>
131
+ <div class='spacer'></div>
132
+ <div id='version'>
133
+ <div class='label'>#{app_name} Version</div>
134
+ <div class='value'>#{version_link}</div>
135
+ </div>
136
+ <div class='spacer'></div>
137
+ <div id='date'>
138
+ <div class='label'>Date Deployed:</div>
139
+ <div class='value'>#{deploy_date}</div>
140
+ </div>
141
+ <div class='spacer'></div>
142
+ <div id='commit'>
143
+ <div class='label'>Last Commit:</div>
144
+ <div class='value'>#{last_commit_link}</div>
145
+ </div>
146
+ <div class='spacer'></div>
147
+ <div id='host'>
148
+ <div class='label'>Host:</div>
149
+ <div class='value'>#{hostname}</div>
150
+ </div>
151
+ <div class='spacer'></div>
152
+ <div id='headers'>
153
+ <div class='label'>Headers:</div>
154
+ <div class='value'>#{headers}</div>
155
+ </div>
156
+ <div class='spacer'></div>
157
+ <div id='environment'>
158
+ <div class='label'>Environment:</div>
159
+ <div class='value'>#{environment}</div>
160
+ </div>
161
+ </div>
162
+ <style>
163
+ .container {font-size: 20px;}
164
+ .label {float: left; width: 400px;}
165
+ .spacer {clear: both; padding: 10px;}
166
+ .value {float: left; width: 500px; text-align: right;}
167
+ .clear {clear: both;}
168
+ </style>
169
+ HTML
170
+ end
171
+ end
@@ -0,0 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{operations_middleware}
8
+ s.version = "0.3.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Primedia Team"]
12
+ s.date = %q{2010-07-19}
13
+ s.description = %q{Rack middleware to provide route for heartbeat and version pages. Includes links to github repo. }
14
+ s.email = %q{}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/operations_middleware.rb",
27
+ "operations_middleware.gemspec",
28
+ "spec/operations_middleware_spec.rb",
29
+ "spec/spec.opts",
30
+ "spec/spec_helper.rb"
31
+ ]
32
+ s.homepage = %q{http://github.com/primedia/operations_middleware}
33
+ s.rdoc_options = ["--charset=UTF-8"]
34
+ s.require_paths = ["lib"]
35
+ s.rubygems_version = %q{1.3.6}
36
+ s.summary = %q{Rack middleware to provide route for heartbeat and version pages.}
37
+ s.test_files = [
38
+ "spec/operations_middleware_spec.rb",
39
+ "spec/spec_helper.rb"
40
+ ]
41
+
42
+ if s.respond_to? :specification_version then
43
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
47
+ s.add_runtime_dependency(%q<rack>, ["= 1.0.1"])
48
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
49
+ s.add_development_dependency(%q<rack-test>, [">= 0"])
50
+ s.add_development_dependency(%q<rspec_tag_matchers>, [">= 0"])
51
+ else
52
+ s.add_dependency(%q<rack>, ["= 1.0.1"])
53
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
54
+ s.add_dependency(%q<rack-test>, [">= 0"])
55
+ s.add_dependency(%q<rspec_tag_matchers>, [">= 0"])
56
+ end
57
+ else
58
+ s.add_dependency(%q<rack>, ["= 1.0.1"])
59
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
60
+ s.add_dependency(%q<rack-test>, [">= 0"])
61
+ s.add_dependency(%q<rspec_tag_matchers>, [">= 0"])
62
+ end
63
+ end
64
+
@@ -0,0 +1,248 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "OperationsMiddleware" do
4
+ before do
5
+ @parent_app = mock("Rails App")
6
+ @parent_app.stub(:call).and_return([200, {}, ['Parent App']])
7
+ end
8
+
9
+ def app
10
+ @app ||= OperationsMiddleware.new(@parent_app) do |ops|
11
+ ops.file_root = File.join(File.dirname(__FILE__), '..')
12
+ end
13
+ end
14
+
15
+ context "passing routes" do
16
+
17
+ it "should pass to parent app for /" do
18
+ @parent_app.should_receive(:call)
19
+ get '/'
20
+ end
21
+
22
+ it "should pass to parent app for /Georgia/Atlanta" do
23
+ @parent_app.should_receive(:call)
24
+ get '/Georgia/Atlanta'
25
+ end
26
+
27
+ end
28
+
29
+ context "captured routes" do
30
+
31
+ describe "version" do
32
+
33
+ it "should not pass to parent app for '/ops/version'" do
34
+ @parent_app.should_not_receive(:call)
35
+ get '/ops/version'
36
+ end
37
+
38
+ it "should have version link" do
39
+ app.stub(:app_name).and_return('App')
40
+ app.stub(:version_or_branch).and_return('branch')
41
+ get '/ops/version'
42
+ last_response.body.should have_tag('#version .label', 'App Version')
43
+ last_response.body.should have_tag('#version .value', 'branch')
44
+ end
45
+
46
+ it "should have date deployed" do
47
+ app.stub(:deploy_date).and_return('now')
48
+ get '/ops/version'
49
+ last_response.body.should have_tag('#date .label', 'Date Deployed:')
50
+ last_response.body.should have_tag('#date .value', 'now')
51
+ end
52
+
53
+ it "should have last commit" do
54
+ app.stub(:last_commit_link).and_return('mock_sha')
55
+ get '/ops/version'
56
+ last_response.body.should have_tag('#commit .label', 'Last Commit:')
57
+ last_response.body.should have_tag('#commit .value', 'mock_sha')
58
+ end
59
+
60
+ it "should have host" do
61
+ app.stub(:hostname).and_return('host')
62
+ get '/ops/version'
63
+ last_response.body.should have_tag('#host .label', 'Host:')
64
+ last_response.body.should have_tag('#host .value', 'host')
65
+ end
66
+
67
+ it "should have headers" do
68
+ app.stub(:headers).and_return('headers')
69
+ get '/ops/version'
70
+ last_response.body.should have_tag('#headers .label', 'Headers:')
71
+ last_response.body.should have_tag('#headers .value', 'headers')
72
+ end
73
+
74
+ it "should have environment" do
75
+ app.stub(:environment).and_return('env')
76
+ get '/ops/version'
77
+ last_response.body.should have_tag('#environment .label', 'Environment:')
78
+ last_response.body.should have_tag('#environment .value', 'env')
79
+ end
80
+
81
+ end
82
+
83
+ describe "heartbeat" do
84
+
85
+ it "should not pass to parent app for '/ops/heartbeat'" do
86
+ @parent_app.should_not_receive(:call)
87
+ get '/ops/heartbeat'
88
+ end
89
+
90
+ it "should respond with OK" do
91
+ get '/ops/heartbeat'
92
+ last_response.body.should match('OK')
93
+ end
94
+
95
+ context "named heartbeat" do
96
+ it "should be run" do
97
+ heartbeat = mock('heartbeat')
98
+ app.heartbeat[:test] = heartbeat
99
+ heartbeat.should_receive(:call)
100
+ get '/ops/heartbeat/test'
101
+ end
102
+
103
+ it "should respond OK if heartbeat raises no errors" do
104
+ app.heartbeat[:test] = lambda{ return true }
105
+ get '/ops/heartbeat/test'
106
+
107
+ last_response.should match('OK')
108
+ last_response.status.should == 200
109
+ end
110
+
111
+ it "should respond with ERROR if heartbeat raises errors" do
112
+ app.heartbeat[:test] = lambda{ raise "I HAVE NO HEART" }
113
+ get '/ops/heartbeat/test'
114
+
115
+ last_response.should match('ERROR')
116
+ last_response.status.should == 500
117
+ end
118
+
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+
125
+ describe '#app_name' do
126
+
127
+ it "should return config option if given" do
128
+ local_app = OperationsMiddleware.new(@parent_app) do |ops|
129
+ ops.file_root = File.join(File.dirname(__FILE__), '..')
130
+ ops.app_name = 'Config App'
131
+ end
132
+ local_app.method(:app_name).call.should == 'Config App'
133
+ end
134
+
135
+ it "should return parent directory if not a timestamp" do
136
+ Dir.stub(:pwd).and_return('/foo/bar')
137
+ app.method(:app_name).call.should == 'bar'
138
+ end
139
+
140
+ it "should return 2 levels up from parent if parent is timestamp (cap deploy structure)" do
141
+ Dir.stub(:pwd).and_return('/app/releases/12345')
142
+ app.method(:app_name).call.should == 'app'
143
+ end
144
+
145
+ it "should strip '.com' off of parent name" do
146
+ Dir.stub(:pwd).and_return('/app.com/releases/12345')
147
+ app.method(:app_name).call.should == 'app'
148
+ end
149
+
150
+ end
151
+
152
+ describe '#version_or_branch' do
153
+ it "should use contents of VERSION file if available" do
154
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(true)
155
+ File.stub(:read).with(File.join(app.file_root, 'VERSION')).and_return('version')
156
+
157
+ app.method(:version_or_branch).call.should == 'version'
158
+ end
159
+
160
+ it "should use current git branch if in git repo and development mode" do
161
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(false)
162
+ # stub on app instead of Kernel since apparently you can't stub on a Module
163
+ app.stub(:`).with('git branch').and_return("* foo\n bar")
164
+ app.stub(:environment).and_return('development')
165
+
166
+ app.method(:version_or_branch).call.should == 'foo'
167
+ end
168
+
169
+ it "should be unknown if not in git repo" do
170
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(false)
171
+ # stub on app instead of Kernel since apparently you can't stub on a Module
172
+ app.stub(:`).with('git branch').and_return("fatal: Not a git repository (or any of the parent directories): .git")
173
+ app.stub(:environment).and_return('development')
174
+
175
+ app.method(:version_or_branch).call.should match('^Unknown')
176
+ end
177
+
178
+ it "should be unknown if not in development mode" do
179
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(false)
180
+ # stub on app instead of Kernel since apparently you can't stub on a Module
181
+ app.stub(:`).with('git branch').and_return("* foo\n bar")
182
+ app.stub(:environment).and_return('production')
183
+
184
+ app.method(:version_or_branch).call.should match('^Unknown')
185
+ end
186
+
187
+ end
188
+
189
+ describe '#deploy_date' do
190
+ it "should use mtime of VERSION file if available" do
191
+ time = mock('time')
192
+ time.stub(:mtime).and_return('timestamp')
193
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(true)
194
+ File.stub(:stat).with(File.join(app.file_root, 'VERSION')).and_return(time)
195
+
196
+ app.method(:deploy_date).call.should == 'timestamp'
197
+ end
198
+
199
+ it "should use current time if in development" do
200
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(false)
201
+ app.stub(:environment).and_return('development')
202
+
203
+ app.method(:deploy_date).call.should be_close(Time.now, 5)
204
+ end
205
+
206
+ it "should use unknown if not development" do
207
+ File.stub(:exists?).with(File.join(app.file_root, 'VERSION')).and_return(false)
208
+ app.stub(:environment).and_return('production')
209
+
210
+ app.method(:deploy_date).call.should match('^Unknown')
211
+ end
212
+ end
213
+
214
+ describe '#last_commit' do
215
+ it "should use contents of REVISION file if available" do
216
+ File.stub(:exists?).with(File.join(app.file_root, 'REVISION')).and_return(true)
217
+ File.stub(:read).with(File.join(app.file_root, 'REVISION')).and_return('some_sha')
218
+
219
+ app.method(:last_commit).call.should == 'some_sha'
220
+ end
221
+
222
+ it "should use current git HEAD if in git repo and development mode" do
223
+ File.stub(:exists?).with(File.join(app.file_root, 'REVISION')).and_return(false)
224
+ app.stub(:`).with('git show').and_return("commit some_sha")
225
+ app.stub(:environment).and_return('development')
226
+
227
+ app.method(:last_commit).call.should == 'some_sha'
228
+ end
229
+
230
+ it "should be unknown if not in git repo" do
231
+ File.stub(:exists?).with(File.join(app.file_root, 'REVISION')).and_return(false)
232
+ app.stub(:`).with('git show').and_return("fatal: Not a git repository (or any of the parent directories): .git")
233
+ app.stub(:environment).and_return('development')
234
+
235
+ app.method(:last_commit).call.should match('^Unknown')
236
+ end
237
+
238
+ it "should be unknown if not in development mode" do
239
+ File.stub(:exists?).with(File.join(app.file_root, 'REVISION')).and_return(false)
240
+ app.stub(:`).with('git show').and_return("commit some_sha")
241
+ app.stub(:environment).and_return('production')
242
+
243
+ app.method(:last_commit).call.should match('^Unknown')
244
+ end
245
+
246
+ end
247
+
248
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ -fn
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ gem 'rack', '1.0.1'
4
+ require 'operations_middleware'
5
+ require 'spec'
6
+ require 'spec/autorun'
7
+ require 'rack/test'
8
+ require 'rspec_tag_matchers'
9
+
10
+ Spec::Runner.configure do |config|
11
+ include Rack::Test::Methods
12
+ config.include(RspecTagMatchers)
13
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: operations_middleware
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
+ platform: ruby
11
+ authors:
12
+ - Primedia Team
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-07-19 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rack
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 0
30
+ - 1
31
+ version: 1.0.1
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 1
43
+ - 2
44
+ - 9
45
+ version: 1.2.9
46
+ type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: rack-test
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id003
60
+ - !ruby/object:Gem::Dependency
61
+ name: rspec_tag_matchers
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ type: :development
71
+ version_requirements: *id004
72
+ description: "Rack middleware to provide route for heartbeat and version pages. Includes links to github repo. "
73
+ email: ""
74
+ executables: []
75
+
76
+ extensions: []
77
+
78
+ extra_rdoc_files:
79
+ - LICENSE
80
+ - README.rdoc
81
+ files:
82
+ - .document
83
+ - .gitignore
84
+ - LICENSE
85
+ - README.rdoc
86
+ - Rakefile
87
+ - VERSION
88
+ - lib/operations_middleware.rb
89
+ - operations_middleware.gemspec
90
+ - spec/operations_middleware_spec.rb
91
+ - spec/spec.opts
92
+ - spec/spec_helper.rb
93
+ has_rdoc: true
94
+ homepage: http://github.com/primedia/operations_middleware
95
+ licenses: []
96
+
97
+ post_install_message:
98
+ rdoc_options:
99
+ - --charset=UTF-8
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ requirements: []
117
+
118
+ rubyforge_project:
119
+ rubygems_version: 1.3.6
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Rack middleware to provide route for heartbeat and version pages.
123
+ test_files:
124
+ - spec/operations_middleware_spec.rb
125
+ - spec/spec_helper.rb