pingable 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *~
2
+ /.rspec
3
+ /Gemfile.lock
4
+ *.gem
5
+ .bundle
6
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,54 @@
1
+ Pinger
2
+ ======
3
+
4
+ Pinger is a simple framework to implement a 'ping' URL in Rack-based web applications.
5
+
6
+ For example, a Rails or Sinatra app's `config.ru` may look like this:
7
+
8
+ map '/ping' do
9
+ use Pingable::Handler
10
+ end
11
+ run MyApp
12
+
13
+ Now you can add checks in a modular fashion:
14
+
15
+ Pingable.add_check lambda {
16
+ unless check_something
17
+ "Oh noes, something failed"
18
+ end
19
+ }
20
+
21
+ Something a bit more complex:
22
+
23
+ class TwitterCheck
24
+ def initialize(url)
25
+ @url = url
26
+ end
27
+
28
+ def call
29
+ # ... check the URL ...
30
+ end
31
+ end
32
+
33
+ Pingable.add_check TwitterCheck.new(:url => "http://twitter.com/")
34
+
35
+ A check is simply an object which:
36
+
37
+ * implements `call` with no arguments.
38
+ * returns one of the following on error:
39
+ * a string
40
+ * a hash of {:message => message}
41
+ * an array of the above
42
+ * returns nil on success.
43
+
44
+ Common checks
45
+ -------------
46
+
47
+ Pingable comes with a set of checks that are commonly needed for web applications. To install these, add the following:
48
+
49
+ Pingable.common_checks!
50
+
51
+ These include:
52
+
53
+ * A check to verify ActiveRecord's current connection.
54
+ * A check to check the ability for Rails' cache to read and write values.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/example/config.ru ADDED
@@ -0,0 +1,14 @@
1
+ require 'pingable'
2
+ require 'active_record'
3
+
4
+ Pingable.common_checks!
5
+ Pingable.add_check lambda {
6
+ {:message => "oh noes"}
7
+ }
8
+
9
+ map '/ping' do
10
+ use Pingable::Handler
11
+ end
12
+ run lambda { |env|
13
+ [200, {'Content-Type' => 'text/plain'}, ['OK']]
14
+ }
@@ -0,0 +1,51 @@
1
+ module Pingable
2
+
3
+ class << self
4
+ @@common_checks_added ||= false
5
+
6
+ # Add checks for standard gems such as Active Record.
7
+ def common_checks!
8
+ unless @@common_checks_added
9
+ add_active_record!
10
+ add_rails_cache!
11
+ @@common_checks_added = true
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def add_active_record!
18
+ if defined?(ActiveRecord)
19
+ add_check lambda {
20
+ begin
21
+ ActiveRecord::Base.verify_active_connections!
22
+ ActiveRecord::Base.connection.execute('select 1')
23
+ nil
24
+ rescue Exception => e
25
+ if e.class.name == e.message
26
+ "ActiveRecord: #{e}"
27
+ else
28
+ "ActiveRecord: #{e.class}: #{e.message}"
29
+ end
30
+ end
31
+ }
32
+ end
33
+ end
34
+
35
+ def add_rails_cache!
36
+ if defined?(Rails) and Rails.respond_to?(:cache)
37
+ add_check lambda {
38
+ begin
39
+ Rails.cache.read('ping_check')
40
+ Rails.cache.write('ping_check', 'ok')
41
+ nil
42
+ rescue Exception => e
43
+ "Rails cache: #{e.class}: #{e.message}"
44
+ end
45
+ }
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,34 @@
1
+ module Pingable
2
+ class << self
3
+
4
+ @@checks ||= []
5
+
6
+ def add_check(check)
7
+ @@checks << check
8
+ end
9
+
10
+ def run_checks!
11
+ failures = []
12
+ @@checks.each do |check|
13
+ begin
14
+ result = check.call
15
+ rescue Exception => e
16
+ failures.push(:message => "Pinger check failed: #{e}")
17
+ else
18
+ if result
19
+ case result
20
+ when Array
21
+ failures.concat result
22
+ when String
23
+ failures.push(:message => result)
24
+ else
25
+ failures.push(result)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ failures
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Pingable
2
+
3
+ class Handler
4
+
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ failures = Pingable.run_checks!
11
+ if failures.any?
12
+ [500, HEADERS, failures.map { |f| f[:message] }.join("\n")]
13
+ else
14
+ app_name = env['pingable.name']
15
+ app_name ||= ''
16
+ [200, HEADERS, app_name]
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ HEADERS = {'Cache-Control' => 'private'}
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,3 @@
1
+ module Pingable
2
+ VERSION = "0.0.1"
3
+ end
data/lib/pingable.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "pingable/core"
2
+ require "pingable/version"
3
+ require "pingable/handler"
4
+ require "pingable/common_checks"
data/pingable.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require "pingable/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "pingable"
8
+ s.version = Pingable::VERSION
9
+ s.authors = ["Alexander Staubo"]
10
+ s.email = ["alex@origo.no"]
11
+ s.homepage = "http://github.com/origo/pingable"
12
+ s.summary = s.description = %q{Pingable is a Rack handler that let an app respond to a path /ping, with pluggable checks}
13
+
14
+ s.rubyforge_project = "pingable"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rspec"
22
+
23
+ s.add_runtime_dependency "rack", '>= 1.0.0'
24
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pingable
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Alexander Staubo
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-01-27 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rack
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 23
43
+ segments:
44
+ - 1
45
+ - 0
46
+ - 0
47
+ version: 1.0.0
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ description: Pingable is a Rack handler that let an app respond to a path /ping, with pluggable checks
51
+ email:
52
+ - alex@origo.no
53
+ executables: []
54
+
55
+ extensions: []
56
+
57
+ extra_rdoc_files: []
58
+
59
+ files:
60
+ - .gitignore
61
+ - Gemfile
62
+ - README.md
63
+ - Rakefile
64
+ - example/config.ru
65
+ - lib/pingable.rb
66
+ - lib/pingable/common_checks.rb
67
+ - lib/pingable/core.rb
68
+ - lib/pingable/handler.rb
69
+ - lib/pingable/version.rb
70
+ - pingable.gemspec
71
+ homepage: http://github.com/origo/pingable
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options: []
76
+
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ version: "0"
97
+ requirements: []
98
+
99
+ rubyforge_project: pingable
100
+ rubygems_version: 1.8.6
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: Pingable is a Rack handler that let an app respond to a path /ping, with pluggable checks
104
+ test_files: []
105
+