rapporteur 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +1 -0
- data/CHANGELOG.md +25 -1
- data/Gemfile +3 -0
- data/README.md +9 -4
- data/app/controllers/statuses_controller.rb +1 -3
- data/config/locales/en.yml +3 -6
- data/gemfiles/rails3.1.gemfile +2 -0
- data/gemfiles/rails3.2.gemfile +2 -0
- data/lib/rapporteur.rb +56 -3
- data/lib/rapporteur/checker.rb +67 -49
- data/lib/rapporteur/checker_deprecations.rb +20 -0
- data/lib/rapporteur/checks.rb +3 -0
- data/lib/rapporteur/checks/active_record_check.rb +1 -1
- data/lib/rapporteur/rspec.rb +5 -17
- data/lib/rapporteur/version.rb +1 -1
- data/rapporteur.gemspec +1 -2
- data/spec/requests/active_record_check_spec.rb +2 -2
- data/spec/requests/halt_spec.rb +23 -0
- data/spec/requests/messsage_addition_spec.rb +3 -6
- data/spec/requests/no_checks_spec.rb +0 -2
- data/spec/requests/revision_check_spec.rb +19 -0
- data/spec/requests/time_check_spec.rb +23 -0
- data/spec/spec_helper.rb +1 -1
- metadata +17 -25
- data/lib/rapporteur/serializer.rb +0 -30
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzExOTM1MmZmNjFhYWY1MTRiN2QwMDcyOTMwMzNmZTk3MmY3MmZmMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MjBjMDgxMGI1ZDg0NzY0YWUwZGVmOGFlNDY0MDBmN2IxMmNkNGZlNw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDNhMzI1ZWUyOTE3OTllOTA3NjVkZDQ1YjZmNGJiMGJmMzBhNDAwYjE2YWQ0
|
10
|
+
YWQ5NDliZTFkOGY4MzkyMWFiMWNiODZhNTI5OGY0OTYwYmNlMDRiZTUyZmQz
|
11
|
+
OGYzNmVhZjYxZTJiMmUzNmJiODY0NGQxYjhmMzI4NDkxMzRkNDI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmNkYzlkYzQ2NTZlNTNiZmExNzM3Y2JiM2FiYTgxMDczZjdmNjI2YzA5MzZj
|
14
|
+
NTJiNzYxY2YxYjQ0OWM0ODRiZjA3YWU3MTdjNDllYzdjMTM0MjkyOTA2OTEz
|
15
|
+
NjcyMjg3OWI2NzMyZDkzYTE2ZGI1YjAwOTA1ZDVjNDkxYTZlNTE=
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,29 @@
|
|
4
4
|
|
5
5
|
* No significant changes.
|
6
6
|
|
7
|
+
## [2.0.0][v2.0.0] / 2013-05-31
|
8
|
+
|
9
|
+
* Removed active_model_serializers dependency.
|
10
|
+
* Extracted time and revision checks into Checks::TimeCheck and
|
11
|
+
Checks::RevisionCheck, and applied them as the default checks.
|
12
|
+
* Updated Checker#add_error to allow for I18n interpolated values.
|
13
|
+
* Updated Checker#add_check to take a block in addition to a lambda or object
|
14
|
+
that responds to #call.
|
15
|
+
* Added Checker#halt! which checks can call to short-circuit processing of any
|
16
|
+
further checks.
|
17
|
+
|
18
|
+
### :boom: Backward incompatible changes
|
19
|
+
|
20
|
+
* Flattened the messages key in the JSON response. All messages are now
|
21
|
+
included at the top level of the hash.
|
22
|
+
* It's now possible to remove all checks by calling Checker#clear. This
|
23
|
+
includes the default TimeCheck and RevisionCheck checks.
|
24
|
+
* Simplified the I18n scope to "rapporteur.errors.{attribute}.{key}". This
|
25
|
+
means that Checker#add_error now takes at least 2 arguments, similarly to
|
26
|
+
ActiveModel::Errors#add.
|
27
|
+
* Added a facade for all Checker interaction. Clients should not use
|
28
|
+
Rapporteur::Checker.add_check et al, in favor of using Rapporteur.add_check.
|
29
|
+
|
7
30
|
## [1.1.0][v1.1.0] / 2013-05-30
|
8
31
|
|
9
32
|
* Add the ability to define custom successful response messages via
|
@@ -20,6 +43,7 @@
|
|
20
43
|
* Initial public release.
|
21
44
|
|
22
45
|
|
23
|
-
[unreleased]: https://github.com/codeschool/rapporteur/compare/
|
46
|
+
[unreleased]: https://github.com/codeschool/rapporteur/compare/v2.0.0...master
|
47
|
+
[v2.0.0]: https://github.com/codeschool/rapporteur/compare/v1.1.0...v2.0.0
|
24
48
|
[v1.1.0]: https://github.com/codeschool/rapporteur/compare/v1.0.1...v1.1.0
|
25
49
|
[v1.0.1]: https://github.com/codeschool/rapporteur/compare/v1.0.0...v1.0.1
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -36,6 +36,7 @@ Supported Ruby versions:
|
|
36
36
|
|
37
37
|
* MRI 1.9.2
|
38
38
|
* MRI 1.9.3
|
39
|
+
* JRuby 1.7.4
|
39
40
|
|
40
41
|
Supported Rails versions:
|
41
42
|
|
@@ -106,7 +107,7 @@ environment or application configuration files or initializers, such as:
|
|
106
107
|
|
107
108
|
```ruby
|
108
109
|
# config/initializers/rapporteur.rb
|
109
|
-
Rapporteur
|
110
|
+
Rapporteur.add_check(Rapporteur::Checks::ActiveRecordCheck)
|
110
111
|
```
|
111
112
|
|
112
113
|
Or, make an environment specific check with:
|
@@ -115,7 +116,7 @@ Or, make an environment specific check with:
|
|
115
116
|
# config/environments/production.rb
|
116
117
|
MyApplication.configure do
|
117
118
|
config.to_prepare do
|
118
|
-
Rapporteur
|
119
|
+
Rapporteur.add_check(Rapporteur::Checks::ActiveRecordCheck)
|
119
120
|
end
|
120
121
|
end
|
121
122
|
```
|
@@ -130,12 +131,16 @@ happy with it, add an error to the given `checker` instance:
|
|
130
131
|
```ruby
|
131
132
|
# config/initializers/rapporteur.rb
|
132
133
|
|
134
|
+
Rapporteur.add_check do |checker|
|
135
|
+
checker.add_message(:paid, "too much")
|
136
|
+
end
|
137
|
+
|
133
138
|
my_proc_check = lambda { |checker|
|
134
139
|
checker.add_error("You have bad luck!") if rand(10) > 5
|
135
140
|
checker.add_message(:luck, "good")
|
136
141
|
}
|
137
142
|
|
138
|
-
Rapporteur
|
143
|
+
Rapporteur.add_check(my_proc_check)
|
139
144
|
|
140
145
|
class MyClassCheck
|
141
146
|
def self.call(checker)
|
@@ -144,7 +149,7 @@ class MyClassCheck
|
|
144
149
|
end
|
145
150
|
end
|
146
151
|
|
147
|
-
Rapporteur
|
152
|
+
Rapporteur.add_check(MyClassCheck)
|
148
153
|
```
|
149
154
|
|
150
155
|
Certainly, the definition and registration of the checks do not need to occur
|
data/config/locales/en.yml
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
en:
|
2
|
-
|
2
|
+
rapporteur:
|
3
3
|
errors:
|
4
|
-
|
5
|
-
|
6
|
-
attributes:
|
7
|
-
base:
|
8
|
-
database_unavailable: "The application database is inaccessible or unavailable"
|
4
|
+
database:
|
5
|
+
unavailable: "The application database is inaccessible or unavailable"
|
data/gemfiles/rails3.1.gemfile
CHANGED
data/gemfiles/rails3.2.gemfile
CHANGED
data/lib/rapporteur.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_model_serializers'
|
2
|
-
|
3
1
|
require "rapporteur/engine" if defined?(Rails)
|
4
2
|
require "rapporteur/version"
|
5
3
|
|
@@ -8,8 +6,63 @@ require "rapporteur/version"
|
|
8
6
|
#
|
9
7
|
module Rapporteur
|
10
8
|
autoload :Checker, 'rapporteur/checker'
|
9
|
+
autoload :CheckerDeprecations, 'rapporteur/checker_deprecations'
|
11
10
|
autoload :Checks, 'rapporteur/checks'
|
12
11
|
autoload :Responder, 'rapporteur/responder'
|
13
12
|
autoload :Revision, 'rapporteur/revision'
|
14
|
-
|
13
|
+
|
14
|
+
|
15
|
+
# Public: Add a pre-built or custom check to your status endpoint. These
|
16
|
+
# checks are used to test the state of the world of the application, and
|
17
|
+
# need only respond to `#call`.
|
18
|
+
#
|
19
|
+
# Once added, the given check will be called and passed an instance of this
|
20
|
+
# checker. If everything is good, do nothing! If there is a problem, use
|
21
|
+
# `add_error` to add an error message to the checker.
|
22
|
+
#
|
23
|
+
# Examples
|
24
|
+
#
|
25
|
+
# Rapporteur.add_check { |checker|
|
26
|
+
# checker.add_error("Bad luck.") if rand(2) == 1
|
27
|
+
# }
|
28
|
+
#
|
29
|
+
# Returns the Checker instance.
|
30
|
+
# Raises ArgumentError if the given check does not respond to call.
|
31
|
+
#
|
32
|
+
def self.add_check(object_or_nil_with_block=nil, &block)
|
33
|
+
checker.add_check(object_or_nil_with_block, &block)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Internal: The Checker instance. All toplevel calls on Rapporteur are
|
37
|
+
# delgated to this object.
|
38
|
+
#
|
39
|
+
def self.checker
|
40
|
+
unless @checker
|
41
|
+
@checker = Checker.new
|
42
|
+
add_check(Checks::RevisionCheck)
|
43
|
+
add_check(Checks::TimeCheck)
|
44
|
+
end
|
45
|
+
@checker
|
46
|
+
end
|
47
|
+
|
48
|
+
# Public: Empties all configured checks from the checker. This may be
|
49
|
+
# useful for testing and for cases where you might've built up some basic
|
50
|
+
# checks but for one reason or another (environment constraint) need to
|
51
|
+
# start from scratch.
|
52
|
+
#
|
53
|
+
# Returns the Checker instance.
|
54
|
+
#
|
55
|
+
def self.clear_checks
|
56
|
+
checker.clear
|
57
|
+
end
|
58
|
+
|
59
|
+
# Public: This is the primary execution point for this class. Use run to
|
60
|
+
# exercise the configured checker and collect any application errors or
|
61
|
+
# data for rendering.
|
62
|
+
#
|
63
|
+
# Returns the Checker instance.
|
64
|
+
#
|
65
|
+
def self.run
|
66
|
+
checker.run
|
67
|
+
end
|
15
68
|
end
|
data/lib/rapporteur/checker.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'singleton'
|
2
1
|
require 'set'
|
3
2
|
|
4
3
|
module Rapporteur
|
@@ -7,9 +6,15 @@ module Rapporteur
|
|
7
6
|
# controller with that data for rendering.
|
8
7
|
#
|
9
8
|
class Checker
|
10
|
-
include Singleton
|
11
9
|
include ActiveModel::Validations
|
12
|
-
|
10
|
+
extend CheckerDeprecations
|
11
|
+
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@messages = Hash.new
|
15
|
+
@checks = Set.new
|
16
|
+
reset
|
17
|
+
end
|
13
18
|
|
14
19
|
|
15
20
|
# Public: Add a pre-built or custom check to your status endpoint. These
|
@@ -22,16 +27,21 @@ module Rapporteur
|
|
22
27
|
#
|
23
28
|
# Examples
|
24
29
|
#
|
25
|
-
# Rapporteur
|
30
|
+
# Rapporteur.add_check { |checker|
|
26
31
|
# checker.add_error("Bad luck.") if rand(2) == 1
|
27
|
-
# }
|
32
|
+
# }
|
28
33
|
#
|
29
|
-
# Returns
|
34
|
+
# Returns self.
|
30
35
|
# Raises ArgumentError if the given check does not respond to call.
|
31
36
|
#
|
32
|
-
def
|
33
|
-
|
34
|
-
|
37
|
+
def add_check(object_or_nil_with_block=nil, &block)
|
38
|
+
if block_given?
|
39
|
+
@checks << block
|
40
|
+
elsif object_or_nil_with_block.respond_to?(:call)
|
41
|
+
@checks << object_or_nil_with_block
|
42
|
+
else
|
43
|
+
raise ArgumentError, "A check must respond to #call."
|
44
|
+
end
|
35
45
|
self
|
36
46
|
end
|
37
47
|
|
@@ -40,26 +50,41 @@ module Rapporteur
|
|
40
50
|
# checks but for one reason or another (environment constraint) need to
|
41
51
|
# start from scratch.
|
42
52
|
#
|
43
|
-
# Returns
|
53
|
+
# Returns self.
|
44
54
|
#
|
45
|
-
def
|
46
|
-
|
55
|
+
def clear
|
56
|
+
@checks.clear
|
47
57
|
self
|
48
58
|
end
|
49
59
|
|
60
|
+
##
|
61
|
+
# Public: Checks can call this method to halt any further processing. This
|
62
|
+
# is useful for critical or fatal check failures.
|
63
|
+
#
|
64
|
+
# For example, if load is too high on a machine you may not want to run any
|
65
|
+
# other checks.
|
66
|
+
#
|
67
|
+
# Returns true.
|
68
|
+
#
|
69
|
+
def halt!
|
70
|
+
@halted = true
|
71
|
+
end
|
72
|
+
|
50
73
|
# Public: This is the primary execution point for this class. Use run to
|
51
74
|
# exercise the configured checker and collect any application errors or
|
52
75
|
# data for rendering.
|
53
76
|
#
|
54
|
-
# Returns
|
77
|
+
# Returns self.
|
55
78
|
#
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
79
|
+
def run
|
80
|
+
reset
|
81
|
+
@checks.each do |object|
|
82
|
+
object.call(self)
|
83
|
+
break if @halted
|
84
|
+
end
|
85
|
+
self
|
60
86
|
end
|
61
87
|
|
62
|
-
|
63
88
|
# Public: Add an error message to the checker in order to have it rendered
|
64
89
|
# in the status request.
|
65
90
|
#
|
@@ -72,10 +97,12 @@ module Rapporteur
|
|
72
97
|
# checker.add_error("You failed.")
|
73
98
|
# checker.add_error(:i18n_key_is_better)
|
74
99
|
#
|
75
|
-
# Returns
|
100
|
+
# Returns self.
|
76
101
|
#
|
77
|
-
def add_error(message)
|
78
|
-
|
102
|
+
def add_error(key, message, options={})
|
103
|
+
options[:scope] = [:rapporteur, :errors, key]
|
104
|
+
options[:default] = [message, message.to_s.humanize]
|
105
|
+
errors.add(key, message, options)
|
79
106
|
self
|
80
107
|
end
|
81
108
|
|
@@ -92,47 +119,38 @@ module Rapporteur
|
|
92
119
|
# checker.add_message(:repository, 'git@github.com/user/repo.git')
|
93
120
|
# checker.add_message(:load, 0.934)
|
94
121
|
#
|
95
|
-
# Returns
|
122
|
+
# Returns self.
|
96
123
|
#
|
97
124
|
def add_message(name, message)
|
98
|
-
messages[name] = message
|
125
|
+
@messages[name] = message
|
99
126
|
self
|
100
127
|
end
|
101
128
|
|
102
|
-
|
129
|
+
##
|
130
|
+
# Internal: Returns a hash of messages suitable for conversion into JSON.
|
103
131
|
#
|
104
|
-
def
|
105
|
-
@
|
132
|
+
def as_json(args={})
|
133
|
+
@messages
|
106
134
|
end
|
107
135
|
|
108
|
-
|
136
|
+
##
|
137
|
+
# Internal: Used by Rails' JSON serialization, specifically in
|
138
|
+
# ActionController::Responder.
|
109
139
|
#
|
110
|
-
def
|
111
|
-
@messages
|
140
|
+
def read_attribute_for_serialization(key)
|
141
|
+
@messages[key]
|
112
142
|
end
|
113
143
|
|
114
|
-
|
115
|
-
# application.
|
116
|
-
#
|
117
|
-
def revision
|
118
|
-
Revision.current
|
119
|
-
end
|
144
|
+
alias read_attribute_for_validation read_attribute_for_serialization
|
120
145
|
|
121
|
-
# Public: Executes the configured checks.
|
122
|
-
#
|
123
|
-
# Returns the Rapporteur::Checker instance.
|
124
|
-
#
|
125
|
-
def run
|
126
|
-
checks.each do |object|
|
127
|
-
object.call(self)
|
128
|
-
end
|
129
|
-
self
|
130
|
-
end
|
131
146
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
147
|
+
private
|
148
|
+
|
149
|
+
|
150
|
+
def reset
|
151
|
+
@halted = false
|
152
|
+
@messages.clear
|
153
|
+
errors.clear
|
136
154
|
end
|
137
155
|
end
|
138
156
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
|
3
|
+
module Rapporteur
|
4
|
+
module CheckerDeprecations
|
5
|
+
def add_check(*args, &block)
|
6
|
+
ActiveSupport::Deprecation.warn("use Rapporteur.add_check", caller)
|
7
|
+
Rapporteur.add_check(*args, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def clear
|
11
|
+
ActiveSupport::Deprecation.warn("use Rapporteur.clear", caller)
|
12
|
+
Rapporteur.clear
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
ActiveSupport::Deprecation.warn("use Rapporteur.run", caller)
|
17
|
+
Rapporteur.run
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rapporteur/checks.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module Rapporteur
|
2
2
|
module Checks
|
3
3
|
autoload :ActiveRecordCheck, 'rapporteur/checks/active_record_check'
|
4
|
+
|
5
|
+
TimeCheck = lambda { |checker| checker.add_message(:time, Time.now.utc) }
|
6
|
+
RevisionCheck = lambda { |checker| checker.add_message(:revision, Revision.current) }
|
4
7
|
end
|
5
8
|
end
|
data/lib/rapporteur/rspec.rb
CHANGED
@@ -19,17 +19,6 @@ shared_examples_for 'a successful status response' do
|
|
19
19
|
it 'does not contain errors' do
|
20
20
|
expect(subject).not_to(have_key('errors'))
|
21
21
|
end
|
22
|
-
|
23
|
-
it 'contains the current application revision' do
|
24
|
-
expect(subject.fetch('revision')).to(match(/^[a-f0-9]{40}$/))
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'contains the current time in ISO8601' do
|
28
|
-
time = Time.now
|
29
|
-
Time.stub(:now).and_return(time)
|
30
|
-
expect(subject.fetch('time')).to(match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/))
|
31
|
-
expect(subject.fetch('time')).to(eq(time.utc.iso8601))
|
32
|
-
end
|
33
22
|
end
|
34
23
|
end
|
35
24
|
|
@@ -52,26 +41,25 @@ shared_examples_for 'an erred status response' do
|
|
52
41
|
end
|
53
42
|
end
|
54
43
|
|
55
|
-
RSpec::Matchers.define :include_status_error_message do |message|
|
44
|
+
RSpec::Matchers.define :include_status_error_message do |attribute, message|
|
56
45
|
match do |response|
|
57
46
|
@body = JSON.parse(response.body)
|
58
|
-
@body.fetch('errors', {}).fetch(
|
47
|
+
@body.fetch('errors', {}).fetch(attribute.to_s).include?(message)
|
59
48
|
end
|
60
49
|
|
61
50
|
failure_message_for_should do |actual|
|
62
|
-
"expected #{@body.inspect} to include a #{message.inspect} error message"
|
51
|
+
"expected #{@body.inspect} to include a #{attribute}:#{message.inspect} error message"
|
63
52
|
end
|
64
53
|
|
65
54
|
failure_message_for_should_not do |actual|
|
66
|
-
"expected #{@body.inspect} to not include a #{message.inspect} error message"
|
55
|
+
"expected #{@body.inspect} to not include a #{attribute}:#{message.inspect} error message"
|
67
56
|
end
|
68
57
|
end
|
69
58
|
|
70
59
|
RSpec::Matchers.define :include_status_message do |name, message|
|
71
60
|
match do |response|
|
72
61
|
@body = JSON.parse(response.body)
|
73
|
-
|
74
|
-
messages.has_key?(name) && messages.fetch(name) == message
|
62
|
+
@body.has_key?(name) && @body.fetch(name) == message
|
75
63
|
end
|
76
64
|
|
77
65
|
failure_message_for_should do |actual|
|
data/lib/rapporteur/version.rb
CHANGED
data/rapporteur.gemspec
CHANGED
@@ -18,13 +18,12 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'active_model_serializers', '~> 0.7'
|
22
21
|
spec.add_dependency 'railties', '~> 3.1'
|
22
|
+
spec.add_dependency 'activesupport'
|
23
23
|
|
24
24
|
spec.add_development_dependency "appraisal", "~> 0.5"
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
26
|
spec.add_development_dependency "combustion", "~> 0.5"
|
27
27
|
spec.add_development_dependency "rails", "~> 3.1"
|
28
28
|
spec.add_development_dependency "rspec-rails", "~> 2.11"
|
29
|
-
spec.add_development_dependency "sqlite3"
|
30
29
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'A status request with an ActiveRecordCheck' do
|
4
4
|
before do
|
5
|
-
Rapporteur
|
5
|
+
Rapporteur.add_check(Rapporteur::Checks::ActiveRecordCheck)
|
6
6
|
end
|
7
7
|
|
8
8
|
subject { get(status_path) ; response }
|
@@ -20,7 +20,7 @@ describe 'A status request with an ActiveRecordCheck' do
|
|
20
20
|
it_behaves_like 'an erred status response'
|
21
21
|
|
22
22
|
it 'contains a message regarding the database failure' do
|
23
|
-
expect(subject).to include_status_error_message(I18n.t('
|
23
|
+
expect(subject).to include_status_error_message(:database, I18n.t('rapporteur.errors.database.unavailable'))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'A check calling #halt!' do
|
4
|
+
before do
|
5
|
+
Rapporteur.add_check { |checker| checker.add_message(:one, 1) }
|
6
|
+
Rapporteur.add_check { |checker| checker.add_message(:two, 2).halt! }
|
7
|
+
Rapporteur.add_check { |checker| checker.add_message(:three, 3) }
|
8
|
+
end
|
9
|
+
|
10
|
+
subject { get(status_path) ; JSON.parse(response.body) }
|
11
|
+
|
12
|
+
it 'runs the first check' do
|
13
|
+
expect(subject).to include('one')
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'runs the second check' do
|
17
|
+
expect(subject).to include('two')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'does not run any checks after #halt! is called' do
|
21
|
+
expect(subject).not_to include('three')
|
22
|
+
end
|
23
|
+
end
|
@@ -3,10 +3,9 @@ require 'spec_helper'
|
|
3
3
|
describe 'A status request with a check that modifies messages' do
|
4
4
|
subject { get(status_path) ; response }
|
5
5
|
|
6
|
-
context 'creating a message with a
|
6
|
+
context 'creating a message with a block' do
|
7
7
|
before do
|
8
|
-
Rapporteur
|
9
|
-
Rapporteur::Checker.add_check(Proc.new { |checker| checker.add_message('git_repo', 'git@github.com:organization/repo.git') })
|
8
|
+
Rapporteur.add_check { |checker| checker.add_message('git_repo', 'git@github.com:organization/repo.git') }
|
10
9
|
end
|
11
10
|
|
12
11
|
context 'with an unerring response' do
|
@@ -19,7 +18,7 @@ describe 'A status request with a check that modifies messages' do
|
|
19
18
|
|
20
19
|
context 'with an erring response' do
|
21
20
|
before do
|
22
|
-
Rapporteur
|
21
|
+
Rapporteur.add_check { |checker| checker.add_error(:base, 'failed') }
|
23
22
|
end
|
24
23
|
|
25
24
|
it_behaves_like 'an erred status response'
|
@@ -30,8 +29,6 @@ describe 'A status request with a check that modifies messages' do
|
|
30
29
|
end
|
31
30
|
|
32
31
|
context 'with no message-modifying checks' do
|
33
|
-
before { Rapporteur::Checker.clear }
|
34
|
-
|
35
32
|
it_behaves_like 'a successful status response'
|
36
33
|
|
37
34
|
it 'does not respond with a messages list' do
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'A status request with a RevisionCheck' do
|
4
|
+
before do
|
5
|
+
Rapporteur.add_check(Rapporteur::Checks::RevisionCheck)
|
6
|
+
end
|
7
|
+
|
8
|
+
subject { get(status_path) ; response }
|
9
|
+
|
10
|
+
it_behaves_like 'a successful status response'
|
11
|
+
|
12
|
+
context 'the response payload' do
|
13
|
+
subject { get(status_path) ; JSON.parse(response.body) }
|
14
|
+
|
15
|
+
it 'contains the current application revision' do
|
16
|
+
expect(subject.fetch('revision')).to(match(/^[a-f0-9]{40}$/))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'A status request with a TimeCheck' do
|
4
|
+
before do
|
5
|
+
Rapporteur.add_check(Rapporteur::Checks::TimeCheck)
|
6
|
+
end
|
7
|
+
|
8
|
+
subject { get(status_path) ; response }
|
9
|
+
|
10
|
+
it_behaves_like 'a successful status response'
|
11
|
+
|
12
|
+
context 'the response payload' do
|
13
|
+
subject { get(status_path) ; JSON.parse(response.body) }
|
14
|
+
|
15
|
+
it 'contains the current time in ISO8601' do
|
16
|
+
time = Time.now
|
17
|
+
Time.stub(:now).and_return(time)
|
18
|
+
expect(subject.fetch('time')).to(match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/))
|
19
|
+
expect(subject.fetch('time')).to(eq(time.utc.iso8601))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rapporteur
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Envy Labs
|
@@ -9,36 +9,36 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: railties
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '3.1'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '3.1'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: activesupport
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ! '>='
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ! '>='
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: appraisal
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,20 +109,6 @@ dependencies:
|
|
109
109
|
- - ~>
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '2.11'
|
112
|
-
- !ruby/object:Gem::Dependency
|
113
|
-
name: sqlite3
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
115
|
-
requirements:
|
116
|
-
- - ! '>='
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '0'
|
119
|
-
type: :development
|
120
|
-
prerelease: false
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
112
|
description: An engine that provides common status polling endpoint.
|
127
113
|
email:
|
128
114
|
- ''
|
@@ -147,13 +133,13 @@ files:
|
|
147
133
|
- gemfiles/rails3.2.gemfile
|
148
134
|
- lib/rapporteur.rb
|
149
135
|
- lib/rapporteur/checker.rb
|
136
|
+
- lib/rapporteur/checker_deprecations.rb
|
150
137
|
- lib/rapporteur/checks.rb
|
151
138
|
- lib/rapporteur/checks/active_record_check.rb
|
152
139
|
- lib/rapporteur/engine.rb
|
153
140
|
- lib/rapporteur/responder.rb
|
154
141
|
- lib/rapporteur/revision.rb
|
155
142
|
- lib/rapporteur/rspec.rb
|
156
|
-
- lib/rapporteur/serializer.rb
|
157
143
|
- lib/rapporteur/version.rb
|
158
144
|
- rapporteur.gemspec
|
159
145
|
- spec/internal/config/database.yml
|
@@ -162,8 +148,11 @@ files:
|
|
162
148
|
- spec/internal/log/.gitignore
|
163
149
|
- spec/internal/public/favicon.ico
|
164
150
|
- spec/requests/active_record_check_spec.rb
|
151
|
+
- spec/requests/halt_spec.rb
|
165
152
|
- spec/requests/messsage_addition_spec.rb
|
166
153
|
- spec/requests/no_checks_spec.rb
|
154
|
+
- spec/requests/revision_check_spec.rb
|
155
|
+
- spec/requests/time_check_spec.rb
|
167
156
|
- spec/routing/routes_spec.rb
|
168
157
|
- spec/spec_helper.rb
|
169
158
|
homepage: ''
|
@@ -197,7 +186,10 @@ test_files:
|
|
197
186
|
- spec/internal/log/.gitignore
|
198
187
|
- spec/internal/public/favicon.ico
|
199
188
|
- spec/requests/active_record_check_spec.rb
|
189
|
+
- spec/requests/halt_spec.rb
|
200
190
|
- spec/requests/messsage_addition_spec.rb
|
201
191
|
- spec/requests/no_checks_spec.rb
|
192
|
+
- spec/requests/revision_check_spec.rb
|
193
|
+
- spec/requests/time_check_spec.rb
|
202
194
|
- spec/routing/routes_spec.rb
|
203
195
|
- spec/spec_helper.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Rapporteur
|
2
|
-
# An ActiveModel::Serializer used to serialize the checker data for JSON
|
3
|
-
# rendering.
|
4
|
-
#
|
5
|
-
class Serializer < ActiveModel::Serializer
|
6
|
-
self.root = false
|
7
|
-
|
8
|
-
attributes :revision,
|
9
|
-
:time,
|
10
|
-
:messages
|
11
|
-
|
12
|
-
# Internal: Converts the checker instance time into UTC to provide a
|
13
|
-
# consistent public representation.
|
14
|
-
#
|
15
|
-
# Returns a Time instance in UTC.
|
16
|
-
#
|
17
|
-
def time
|
18
|
-
object.time.utc
|
19
|
-
end
|
20
|
-
|
21
|
-
# Internal: Used by ActiveModel::Serializer to determine whether or not to
|
22
|
-
# include the messages attribute.
|
23
|
-
#
|
24
|
-
# Returns false if the messages are empty.
|
25
|
-
#
|
26
|
-
def include_messages?
|
27
|
-
!object.messages.empty?
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|