okcomputer 0.2.0 → 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/README.markdown CHANGED
@@ -1,3 +1,6 @@
1
+ [![Code Climate](https://codeclimate.com/github/tstmedia/okcomputer.png)](https://codeclimate.com/github/tstmedia/okcomputer)
2
+ [![Build Status](https://travis-ci.org/tstmedia/okcomputer.png)](https://travis-ci.org/tstmedia/okcomputer)
3
+
1
4
  # OK Computer
2
5
 
3
6
  Inspired by the ease of installing and setting up [fitter-happier] as a Rails
@@ -39,9 +42,18 @@ build your own database check and register it with the name "database" to
39
42
  replace the built-in check, or use `OKComputer::Registry.deregister "database"`
40
43
  to stop checking your database altogether.
41
44
 
45
+ ### Requiring Authentication
46
+
47
+ Optionally require HTTP Basic authentication to view the results of checks in an initializer, like so:
48
+
49
+ ```ruby
50
+ # config/initializers/okcomputer.rb
51
+ OKComputer.require_authentication("username", "password")
52
+ ```
53
+
42
54
  ### Registering Additional Checks
43
55
 
44
- Register additional checks in an initializer, like do:
56
+ Register additional checks in an initializer, like so:
45
57
 
46
58
  ```ruby
47
59
  # config/initializers/okcomputer.rb
@@ -72,6 +84,18 @@ end
72
84
  OKComputer::Registry.register "check_for_odds", MyCustomCheck.new
73
85
  ```
74
86
 
87
+ ## Performing Checks
88
+
89
+ * Perform a simple up check: http://example.com/okcomputer
90
+ * Perform all installed checks: http://example.com/okcomputer/all
91
+ * Perform a specific installed check: http://example.com/okcomputer/database
92
+
93
+ Checks are available as plain text (by default) or JSON by appending .json, e.g.:
94
+ * http://example.com/okcomputer.json
95
+ * http://example.com/okcomputer/all.json
96
+
97
+ ## Deprecations and Breaking Changes
98
+
75
99
  #### Deprecation of Check#call
76
100
 
77
101
  Versions before 0.2.0 implemented a "#call" method which returned the message.
@@ -80,15 +104,22 @@ define a #check method which calls `mark_failure` and `mark_message` as
80
104
  appropriate. In the meantime, OKComputer displays a warning and uses the result
81
105
  of the #call method as the message.
82
106
 
83
- ## Performing Checks
107
+ #### Breaking Change of JSON Output
84
108
 
85
- * Perform a simple up check: http://example.com/okcomputer
86
- * Perform all installed checks: http://example.com/okcomputer/all
87
- * Perform a specific installed check: http://example.com/okcomputer/database
109
+ Versions before 0.3.0, when performing multiple checks, returned an Array of
110
+ the check results, each being a JSON object. Starting with 0.3.0, these are
111
+ combined into a single JSON object with each check having its own key. For
112
+ example:
88
113
 
89
- Checks are available as plain text (by default) or JSON by appending .json, e.g.:
90
- * http://example.com/okcomputer.json
91
- * http://example.com/okcomputer/all.json
114
+ **before 0.3.0**
115
+ ```json
116
+ [{"check": "result"}, {"other": "result"}]
117
+ ```
118
+
119
+ **0.3.0 and above**
120
+ ```json
121
+ {"check": "result", "other": "result"}
122
+ ```
92
123
 
93
124
  ## Contributing
94
125
 
@@ -99,3 +130,4 @@ Checks are available as plain text (by default) or JSON by appending .json, e.g.
99
130
  5. Create new Pull Request
100
131
 
101
132
  [fitter-happier]:https://rubygems.org/gems/fitter-happier
133
+
@@ -2,6 +2,15 @@ class OkComputerController < ActionController::Base
2
2
  layout nil
3
3
  respond_to :text, :json
4
4
 
5
+ before_filter :authenticate
6
+
7
+ rescue_from OKComputer::Registry::CheckNotFound do |e|
8
+ respond_to do |f|
9
+ f.text { render text: e.message, status: :not_found }
10
+ f.json { render json: { error: e.message }, status: :not_found }
11
+ end
12
+ end
13
+
5
14
  def index
6
15
  checks = OKComputer::Registry.all
7
16
  checks.run
@@ -20,4 +29,13 @@ class OkComputerController < ActionController::Base
20
29
  check.success? ? :ok : :error
21
30
  end
22
31
  private :status_code
32
+
33
+ def authenticate
34
+ if OKComputer.requires_authentication?
35
+ authenticate_or_request_with_http_basic do |username, password|
36
+ OKComputer.authenticate(username, password)
37
+ end
38
+ end
39
+ end
40
+ private :authenticate
23
41
  end
data/lib/okcomputer.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "okcomputer/engine"
2
+ require "okcomputer/configuration"
2
3
  require "okcomputer/check"
3
4
  require "okcomputer/check_collection"
4
5
  require "okcomputer/registry"
@@ -33,8 +33,13 @@ module OKComputer
33
33
  #
34
34
  # Returns a String containing a JSON array of hashes
35
35
  def to_json(*args)
36
- # smooshing their #to_json objects into a JSON array
37
- "[#{checks.map(&:to_json).join(",")}]"
36
+ # smooshing their #to_json objects into one JSON hash
37
+ combined = {}
38
+ checks.each do |check|
39
+ combined.merge!(JSON.parse(check.to_json))
40
+ end
41
+
42
+ combined.to_json
38
43
  end
39
44
 
40
45
  # Public: Whether all the checks succeed
@@ -0,0 +1,55 @@
1
+ module OKComputer
2
+ # Public: Configure HTTP Basic authentication
3
+ #
4
+ # username - Username required to view checks
5
+ # password - Password required to view checks
6
+ def self.require_authentication(username, password)
7
+ self.username = username
8
+ self.password = password
9
+ end
10
+
11
+ # Public: Attempt to authenticate against required username and password
12
+ #
13
+ # username - Username to authenticate with
14
+ # password - Password to authenticate with
15
+ #
16
+ # Returns a Boolean
17
+ def self.authenticate(username_try, password_try)
18
+ return true unless requires_authentication?
19
+
20
+ username == username_try && password == password_try
21
+ end
22
+
23
+ # Public: Whether OKComputer is configured to require authentication
24
+ #
25
+ # Returns a Boolean
26
+ def self.requires_authentication?
27
+ username && password
28
+ end
29
+
30
+ # attr_accessor isn't doing what I want inside a module, so here we go.
31
+
32
+ # Private: The username configured for access to checks
33
+ def self.username
34
+ @username
35
+ end
36
+ private_class_method :username
37
+
38
+ # Private: Configure the username to access checks
39
+ def self.username=(username)
40
+ @username = username
41
+ end
42
+ private_class_method :username=
43
+
44
+ # Private: The password configured for access to checks
45
+ def self.password
46
+ @password
47
+ end
48
+ private_class_method :password
49
+
50
+ # Private: Configure the password to access checks
51
+ def self.password=(password)
52
+ @password = password
53
+ end
54
+ private_class_method :password=
55
+ end
@@ -1,3 +1,3 @@
1
1
  module OKComputer
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: okcomputer
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.0
5
+ version: 0.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Patrick Byrne
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-04 00:00:00.000000000 Z
12
+ date: 2013-03-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  version_requirements: !ruby/object:Gem::Requirement
@@ -78,6 +78,7 @@ files:
78
78
  - lib/okcomputer/built_in_checks/resque_down_check.rb
79
79
  - lib/okcomputer/check.rb
80
80
  - lib/okcomputer/check_collection.rb
81
+ - lib/okcomputer/configuration.rb
81
82
  - lib/okcomputer/engine.rb
82
83
  - lib/okcomputer/registry.rb
83
84
  - lib/okcomputer/version.rb
@@ -99,7 +100,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
100
  version: '0'
100
101
  segments:
101
102
  - 0
102
- hash: -1241122917546608114
103
+ hash: -2545106061881900479
103
104
  none: false
104
105
  required_rubygems_version: !ruby/object:Gem::Requirement
105
106
  requirements:
@@ -108,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
109
  version: '0'
109
110
  segments:
110
111
  - 0
111
- hash: -1241122917546608114
112
+ hash: -2545106061881900479
112
113
  none: false
113
114
  requirements: []
114
115
  rubyforge_project: