rapporteur 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Y2MzZjBlZWExMWYyZGZhNDU1YTI2MTc2NzUxYjQ2YTg2N2IzMWQwMA==
4
+ NjZhNjRmZjgwNmMyZjAxMWMzNTAyYTZlYzYxNzI4NmI5ZDFkZWRiMQ==
5
5
  data.tar.gz: !binary |-
6
- Mjk0ODE3NWFmMWE0Yzg5M2NiNTM5YWE1MDRjYTlmYTliOTk5NDFhZg==
6
+ Zjg4ZDViM2IwOTg3OTc3OWU5MmNkYTlmNjVhMjgxNDg5YWZlZWJiYg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MTc2M2M2ZDIxMzMzNjRlNGEyMmE4YjllZTZlZDkzMGQ0YTUyODNmNGMyMmIz
10
- OTNiNzVjYjMzMTY1YWZlODg3YTcyMjY4NDFhNzI2MmE5YTVkY2VlOGVkMjI4
11
- NmQzMWJmYTVmZjczNDY1YjEyYjcxOThkYjJhNzQyMGNkNmEwMTA=
9
+ ODMxNTQ2ZjY1MjlmMTE1NDY2OTM3ZGZlYzIxMDY0MDE0ZGE3NDBhY2NmZWVl
10
+ YjFlMWU2Zjg5ZmMwNDZhNjBmODc4YTFlMDNlODhmZDI2Yjg3MmEwNjRkOGFm
11
+ ODkxZTM1MTJhMWJjMjI5NTU0MjU5ZWNlMzI1MmJkZjM0NjY0MzU=
12
12
  data.tar.gz: !binary |-
13
- MzEwMTc4Y2NjODViMGQ0ZmQ4ZjA0YjFlMTc0ZGFiMzY2Njg5MDM0NDY2ZTAz
14
- M2I1MDdkOTlhYmZiMGZiYTNkNTBiZTA0NGJhMjZiMDAwYWQyZjRkOTBlZjA5
15
- NTdjMTk4YzQ2YjFiNDhlN2RmZTc1ZDg1NjY3MTc2YTM4YTEzMTg=
13
+ ZjU5MWUwNzA5YjYwNmE1OTc3NmQ1MTM0ZmYxMjNhYjdlN2NjY2JlMDYxODU1
14
+ YWJkMWU4YmRmZmE3ODJhZWYyZmE1ZjIwOWU5MDBiNmEwMTNjMDI2MjIwNWRj
15
+ YjU4MGU0ZmVmYTA5ODg4MzZlNzI5MjQwMGI0ODA2NTA5YjljZmE=
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 1.8.7
3
4
  - 1.9.3
4
5
  - 2.0.0
5
6
  - jruby-19mode
@@ -7,6 +8,10 @@ gemfile:
7
8
  - gemfiles/rails3.1.gemfile
8
9
  - gemfiles/rails3.2.gemfile
9
10
  - gemfiles/rails4.0.gemfile
11
+ matrix:
12
+ exclude:
13
+ - rvm: 1.8.7
14
+ gemfile: gemfiles/rails4.0.gemfile
10
15
  notifications:
11
16
  email: false
12
17
  campfire:
data/CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@
4
4
 
5
5
  * No significant changes.
6
6
 
7
+ ## [3.0.0][v3.0.0] / 2013-08-23
8
+
9
+ * Fix/add Ruby 1.8 compatibility. Because this library was built to work with
10
+ Rails 3.1 and 3.2 (as well as 4.0), not supporting Ruby 1.8 was dishonest.
11
+ That has now been rectified.
12
+ * Update message and error handling to allow for both I18n/Proc/String support
13
+ for both types of messages, by replacing ActiveModel::Errors with a local
14
+ message list. This provides better consistency between the error message and
15
+ success message implementations.
16
+ * Use a customized check list registry to ensure order persistence and object
17
+ uniqueness across Ruby versions.
18
+ * Upgrade Combustion development support gem to fix deprecations in Rails 4.0.
19
+
20
+ ### :boom: Backward incompatible changes
21
+
22
+ * Attributes may now have multiple success messages bound to them for
23
+ reporting. This means that there are now, possibly, more than one message per
24
+ key.
25
+
7
26
  ## [2.1.0][v2.1.0] / 2013-06-28
8
27
 
9
28
  * Update the gemspec to allow for Rails 4.0 environments.
data/README.md CHANGED
@@ -32,11 +32,26 @@ validations:
32
32
 
33
33
  ## Installation
34
34
 
35
+ To install, add this line to your application's Gemfile:
36
+
37
+ ```ruby
38
+ gem 'rapporteur'
39
+ ```
40
+
41
+ And then execute:
42
+
43
+ ```bash
44
+ $ bundle install
45
+ ```
46
+
47
+ ### Supported environments
48
+
35
49
  Supported Ruby versions:
36
50
 
37
51
  * MRI 2.0.0
38
52
  * MRI 1.9.3
39
53
  * MRI 1.9.2
54
+ * MRI 1.8.7
40
55
  * JRuby 1.7.4
41
56
 
42
57
  Supported Rails versions:
@@ -45,18 +60,6 @@ Supported Rails versions:
45
60
  * Rails 3.2.x.
46
61
  * Rails 3.1.x.
47
62
 
48
- To install, add this line to your application's Gemfile:
49
-
50
- ```ruby
51
- gem 'rapporteur'
52
- ```
53
-
54
- And then execute:
55
-
56
- ```bash
57
- $ bundle
58
- ```
59
-
60
63
  ## Usage
61
64
 
62
65
  Simply adding the gem requirement to your Gemfile is enough to install and
@@ -137,24 +140,25 @@ happy with it, add an error to the given `checker` instance:
137
140
  ```ruby
138
141
  # config/initializers/rapporteur.rb
139
142
 
143
+ # Define a simple check as a block:
140
144
  Rapporteur.add_check do |checker|
141
145
  checker.add_message(:paid, "too much")
142
146
  end
143
147
 
148
+ # Make and use a reusable Proc or lambda:
144
149
  my_proc_check = lambda { |checker|
145
150
  checker.add_error(:luck, :bad) if rand(2) > 0
146
151
  checker.add_message(:luck, :good)
147
152
  }
148
-
149
153
  Rapporteur.add_check(my_proc_check)
150
154
 
155
+ # Package a check into a Class:
151
156
  class MyClassCheck
152
157
  def self.call(checker)
153
158
  @@counter ||= 0
154
159
  checker.add_error(:count, :exceeded) if @@counter > 50
155
160
  end
156
161
  end
157
-
158
162
  Rapporteur.add_check(MyClassCheck)
159
163
  ```
160
164
 
@@ -199,23 +203,25 @@ Rapporteur::Revision.current = Rails.root.join("REVISION").read.strip
199
203
  # Force a particular directory and use Git
200
204
  Rapporteur::Revision.current = `cd "#{Rails.root}" && git rev-parse HEAD`.strip
201
205
 
202
- # Use an ENV variable (Heroku)
206
+ # Use an ENV variable (Heroku Bamboo Stack)
203
207
  Rapporteur::Revision.current = ENV["REVISION"]
204
208
 
205
209
  # Do some crazy calculation
206
210
  Rapporteur::Revision.current = lambda { MyRevisionCalculator.execute! }
207
211
  ```
208
212
 
209
- ### Customizing the error messages
213
+ ### Customizing the messages
210
214
 
211
- The error messages displayed in the event that application validations fail are
212
- all collected through I18n. There are default localization strings provided
213
- with the gem, but you may override them as necessary, simply by redefining them
214
- in a locales file within your local application.
215
+ The success and error messages displayed in the event that application
216
+ validations pass or fail are all optionally passed through I18n. There are
217
+ default localization strings provided with the gem, but you may override them
218
+ as necessary, by simply redefining the proper locale keys in a locale file
219
+ within your local application.
215
220
 
216
221
  For example, to override the database check failure message:
217
222
 
218
223
  ```yaml
224
+ # /config/locales/en.yml
219
225
  en:
220
226
  rapporteur:
221
227
  errors:
@@ -223,6 +229,25 @@ en:
223
229
  unavailable: "Something went wrong"
224
230
  ```
225
231
 
232
+ If you created a custom checker which reports the current sky color, for
233
+ example, and wanted the success messages to be localized, you could do the
234
+ following:
235
+
236
+ ```ruby
237
+ # /config/initializers/rapporteur.rb
238
+ sky_check = lambda { |checker| checker.add_message(:sky, :blue) }
239
+ Rapporteur.add_check(sky_check)
240
+ ```
241
+
242
+ ```yaml
243
+ # /config/locales/fr.yml
244
+ fr:
245
+ rapporteur:
246
+ messages:
247
+ sky:
248
+ blue: "bleu"
249
+ ```
250
+
226
251
  ## Contributing
227
252
 
228
253
  1. Fork it
data/Rakefile CHANGED
@@ -3,4 +3,4 @@ require "rspec/core/rake_task"
3
3
  require 'appraisal'
4
4
 
5
5
  RSpec::Core::RakeTask.new(:spec)
6
- task default: :spec
6
+ task :default => :spec
data/config/routes.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  Rails.application.routes.draw do
2
- get 'status.json', to: 'statuses#show', defaults: {format: 'json'}, as: :status
2
+ get 'status.json', :to => 'statuses#show', :defaults => {:format => 'json'}, :as => :status
3
3
  end
data/lib/rapporteur.rb CHANGED
@@ -5,9 +5,11 @@ require "rapporteur/version"
5
5
  # application status endpoint.
6
6
  #
7
7
  module Rapporteur
8
+ autoload :CheckList, 'rapporteur/check_list'
8
9
  autoload :Checker, 'rapporteur/checker'
9
10
  autoload :CheckerDeprecations, 'rapporteur/checker_deprecations'
10
11
  autoload :Checks, 'rapporteur/checks'
12
+ autoload :MessageList, 'rapporteur/message_list'
11
13
  autoload :Responder, 'rapporteur/responder'
12
14
  autoload :Revision, 'rapporteur/revision'
13
15
 
@@ -0,0 +1,61 @@
1
+ module Rapporteur
2
+ # Manages a list of checks.
3
+ #
4
+ # The goals of this object are to store and return the check objects given to
5
+ # it in the same order they were given (in Ruby 1.8 and newer). And, to
6
+ # ensure that the same check is not added twice to be run.
7
+ #
8
+ # Previously, a native Ruby Set was used. However, Sets do not guarantee
9
+ # order, particularly in Ruby 1.8. A simple Array is possible, but loses the
10
+ # uniqueness constraint of the objects added.
11
+ #
12
+ class CheckList
13
+ # Public: Returns a new, empty CheckList instance.
14
+ #
15
+ def initialize
16
+ @list = Array.new
17
+ end
18
+
19
+
20
+ # Public: Add a new check to the list.
21
+ #
22
+ # Returns the CheckList instance.
23
+ #
24
+ def add(check)
25
+ @list << check unless @list.include?(check)
26
+ self
27
+ end
28
+
29
+ # Public: Empties all checks from the list. This functionally resets the
30
+ # list to an initial state.
31
+ #
32
+ # Returns the CheckList instance.
33
+ #
34
+ def clear
35
+ @list.clear
36
+ self
37
+ end
38
+
39
+ # Public: Iterates over all of the contained objects and yields them out,
40
+ # individually.
41
+ #
42
+ # Returns the CheckList instance.
43
+ #
44
+ def each(&block)
45
+ @list.each(&block)
46
+ self
47
+ end
48
+
49
+ # Public: Returns true if the list is empty.
50
+ #
51
+ def empty?
52
+ @list.empty?
53
+ end
54
+
55
+ # Public: Returns the objects in the list in an Array.
56
+ #
57
+ def to_a
58
+ @list.dup
59
+ end
60
+ end
61
+ end
@@ -1,18 +1,16 @@
1
- require 'set'
2
-
3
1
  module Rapporteur
4
2
  # The center of the Rapporteur library, Checker manages holding and running
5
3
  # the custom checks, holding any application error messages, and provides the
6
4
  # controller with that data for rendering.
7
5
  #
8
6
  class Checker
9
- include ActiveModel::Validations
10
7
  extend CheckerDeprecations
11
8
 
12
9
 
13
10
  def initialize
14
- @messages = Hash.new
15
- @checks = Set.new
11
+ @messages = MessageList.new(:messages)
12
+ @errors = MessageList.new(:errors)
13
+ @check_list = CheckList.new
16
14
  reset
17
15
  end
18
16
 
@@ -36,9 +34,9 @@ module Rapporteur
36
34
  #
37
35
  def add_check(object_or_nil_with_block=nil, &block)
38
36
  if block_given?
39
- @checks << block
37
+ @check_list.add(block)
40
38
  elsif object_or_nil_with_block.respond_to?(:call)
41
- @checks << object_or_nil_with_block
39
+ @check_list.add(object_or_nil_with_block)
42
40
  else
43
41
  raise ArgumentError, "A check must respond to #call."
44
42
  end
@@ -53,7 +51,7 @@ module Rapporteur
53
51
  # Returns self.
54
52
  #
55
53
  def clear
56
- @checks.clear
54
+ @check_list.clear
57
55
  self
58
56
  end
59
57
 
@@ -78,7 +76,7 @@ module Rapporteur
78
76
  #
79
77
  def run
80
78
  reset
81
- @checks.each do |object|
79
+ @check_list.each do |object|
82
80
  object.call(self)
83
81
  break if @halted
84
82
  end
@@ -106,9 +104,7 @@ module Rapporteur
106
104
  # Returns self.
107
105
  #
108
106
  def add_error(key, message, options={})
109
- options[:scope] = [:rapporteur, :errors, key]
110
- options[:default] = [message, message.to_s.humanize]
111
- errors.add(key, message, options)
107
+ @errors.add(key, message)
112
108
  self
113
109
  end
114
110
 
@@ -128,7 +124,7 @@ module Rapporteur
128
124
  # Returns self.
129
125
  #
130
126
  def add_message(name, message)
131
- @messages[name] = message
127
+ @messages.add(name, message)
132
128
  self
133
129
  end
134
130
 
@@ -136,7 +132,14 @@ module Rapporteur
136
132
  # Internal: Returns a hash of messages suitable for conversion into JSON.
137
133
  #
138
134
  def as_json(args={})
139
- @messages
135
+ @messages.to_hash
136
+ end
137
+
138
+ ##
139
+ # Internal: Used by Rails' JSON serialization to render error messages.
140
+ #
141
+ def errors
142
+ @errors
140
143
  end
141
144
 
142
145
  ##
@@ -156,7 +159,7 @@ module Rapporteur
156
159
  def reset
157
160
  @halted = false
158
161
  @messages.clear
159
- errors.clear
162
+ @errors.clear
160
163
  end
161
164
  end
162
165
  end
@@ -0,0 +1,129 @@
1
+ require 'forwardable'
2
+ require 'set'
3
+
4
+ module Rapporteur
5
+ # A container of keys and one or more messages per key. This acts similarly
6
+ # to an ActiveModel::Errors collection from Ruby on Rails.
7
+ #
8
+ class MessageList
9
+ extend Forwardable
10
+
11
+
12
+ def_delegator :@messages, :clear
13
+ def_delegator :@messages, :empty?
14
+
15
+
16
+ # Public: Initialize a new MessageList instance.
17
+ #
18
+ # list_type - A Symbol representing the type of this list. This Symbol is
19
+ # used to determine the structure of the I18n key used when
20
+ # translating the given message Symbols.
21
+ # Allowed values: :messages or :errors.
22
+ #
23
+ # Returns a MessageList instance.
24
+ #
25
+ def initialize(list_type)
26
+ @list_type = list_type
27
+ @messages = Hash.new { |hash, key| hash[key] = Set.new }
28
+ end
29
+
30
+
31
+ # Public: Adds a new message to the list for the given attribute.
32
+ #
33
+ # attribute - A Symbol describing the category, attribute, or name to which
34
+ # the message pertains.
35
+ # message - A Symbol, String, or Proc which contains the message for the
36
+ # attribute.
37
+ #
38
+ # If a String is given, it is directly used for the message.
39
+ #
40
+ # If a Symbol is given, it is used to lookup the full message
41
+ # from I18n, under the "rapporteur.<list_type>.<message Symbol>"
42
+ # key. For instance, if this is a :messages list, and the
43
+ # attribute is :time, then I18n would be queried for
44
+ # "rapporteur.messages.time".
45
+ #
46
+ # If a Proc is given, it is `.call`'d with no parameters. The
47
+ # return value from the Proc is directly used for the message.
48
+ #
49
+ # Examples
50
+ #
51
+ # list.add(:time, '2013-08-23T12:34:00Z')
52
+ # list.add(:time, :too_late)
53
+ # list.add(:time, lambda { Time.now.iso8601 })
54
+ #
55
+ # Returns the MessageList instance.
56
+ #
57
+ def add(attribute, message)
58
+ @messages[attribute.to_sym].add(normalize_message(attribute, message))
59
+ self
60
+ end
61
+
62
+ # Public: Generates an Array containing the combination of all of the added
63
+ # attributes and their messages.
64
+ #
65
+ # Examples
66
+ #
67
+ # list.add(:time, 'is now')
68
+ # list.add(:time, 'is valuable')
69
+ # list.add(:day, 'is today')
70
+ # list.full_messages
71
+ # # => ["time is now", "time is valuable", "day is today"]
72
+ #
73
+ # Returns an Array containing Strings of messages.
74
+ #
75
+ def full_messages
76
+ @messages.map { |attribute, attribute_messages|
77
+ attribute_messages.collect { |message| "#{attribute} #{message}" }
78
+ }.flatten
79
+ end
80
+
81
+ # Public: Returns the added attributes and their messages as a Hash, keyed
82
+ # by the attribute, with either an Array containing all of the added
83
+ # messages or just the single attribute message.
84
+ #
85
+ # Examples
86
+ #
87
+ # list.add(:time, 'is now')
88
+ # list.add(:time, 'is valuable')
89
+ # list.add(:day, 'is today')
90
+ # list.full_messages
91
+ # # => {:time => ["is now", "is valuable"], :day => "is today"}
92
+ #
93
+ # Returns a Hash instance.
94
+ #
95
+ def to_hash
96
+ hash = Hash.new
97
+ @messages.each_pair do |key, value|
98
+ if value.size == 1
99
+ hash[key] = value.first
100
+ else
101
+ hash[key] = value.to_a
102
+ end
103
+ end
104
+ hash
105
+ end
106
+
107
+
108
+ private
109
+
110
+
111
+ def generate_message(key, type)
112
+ I18n.translate(type, {
113
+ :default => [type, type.to_s],
114
+ :scope => [:rapporteur, @list_type, key]
115
+ })
116
+ end
117
+
118
+ def normalize_message(attribute, message)
119
+ case message
120
+ when Symbol
121
+ generate_message(attribute, message)
122
+ when Proc
123
+ message.call
124
+ else
125
+ message
126
+ end
127
+ end
128
+ end
129
+ end
@@ -21,11 +21,11 @@ module Rapporteur
21
21
 
22
22
  if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 1
23
23
  def display_errors
24
- controller.render format => {errors: resource.errors}, status: :internal_server_error
24
+ controller.render format => {:errors => resource.errors}, :status => :internal_server_error
25
25
  end
26
26
  else
27
27
  def display_errors
28
- controller.render format => resource_errors, status: :internal_server_error
28
+ controller.render format => resource_errors, :status => :internal_server_error
29
29
  end
30
30
  end
31
31
  end
@@ -59,7 +59,7 @@ end
59
59
  RSpec::Matchers.define :include_status_message do |name, message|
60
60
  match do |response|
61
61
  @body = JSON.parse(response.body)
62
- @body.has_key?(name) && @body.fetch(name) == message
62
+ @body.has_key?(name) && @body.fetch(name).include?(message)
63
63
  end
64
64
 
65
65
  failure_message_for_should do |actual|
@@ -1,3 +1,3 @@
1
1
  module Rapporteur
2
- VERSION = "2.1.0"
2
+ VERSION = "3.0.0"
3
3
  end
data/rapporteur.gemspec CHANGED
@@ -18,12 +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 'i18n', '~> 0.6'
21
22
  spec.add_dependency 'railties', '>= 3.1', '< 4.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
- spec.add_development_dependency "combustion", "~> 0.5"
26
+ spec.add_development_dependency "combustion", "~> 0.5", ">= 0.5.1"
27
27
  spec.add_development_dependency "rails", ">= 3.1", "< 4.1"
28
28
  spec.add_development_dependency "rspec-rails", "~> 2.11"
29
29
  end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rapporteur::CheckList do
4
+ let(:list) { described_class.new }
5
+
6
+ context '#add' do
7
+ it 'adds the given object to the list' do
8
+ list.add(check = double)
9
+ expect(list.to_a).to include(check)
10
+ end
11
+
12
+ it 'does not return duplicate entries' do
13
+ list.add(check = double)
14
+ list.add(check)
15
+ expect(list.to_a).to have(1).check
16
+ end
17
+ end
18
+
19
+ context '#clear' do
20
+ it 'empties the list of objects' do
21
+ list.add(double)
22
+ expect { list.clear }.to change(list, :empty?).to(true)
23
+ end
24
+ end
25
+
26
+ context '#each' do
27
+ it 'yields each contained object in the order added' do
28
+ list.add(check0 = double)
29
+ list.add(check1 = double)
30
+ list.add(check2 = double)
31
+ returns = Array.new
32
+
33
+ list.each do |object|
34
+ returns << object
35
+ end
36
+
37
+ expect(returns[0]).to equal(check0)
38
+ expect(returns[1]).to equal(check1)
39
+ expect(returns[2]).to equal(check2)
40
+ end
41
+
42
+ it 'returns itself' do
43
+ expect(list.each).to equal(list)
44
+ end
45
+ end
46
+
47
+ context '#to_a' do
48
+ it 'returns an Array' do
49
+ expect(list.to_a).to be_an(Array)
50
+ end
51
+
52
+ it 'returns new different but equivalent Array instances' do
53
+ return1 = list.to_a
54
+ return2 = list.to_a
55
+ expect(return1).to_not equal(return2)
56
+ expect(return1).to eq(return2)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rapporteur::MessageList do
4
+ let(:list) { Rapporteur::MessageList.new(:errors) }
5
+
6
+ before { I18n.backend.reload! }
7
+
8
+ context '#add' do
9
+ it 'returns the MessageList instance.' do
10
+ expect(list.add(:test, 'message')).to equal(list)
11
+ end
12
+
13
+ it 'adds a String message to the #full_messages' do
14
+ list.add(:test, 'message')
15
+ expect(list.full_messages).to include('test message')
16
+ end
17
+
18
+ it 'adds unrecognized Symbols as Strings to the #full_messages' do
19
+ list.add(:test, :message)
20
+ expect(list.full_messages).to include('test message')
21
+ end
22
+
23
+ it 'adds multiple messages to an attribute' do
24
+ list.add(:test, 'message 1')
25
+ list.add(:test, 'message 2')
26
+ expect(list.full_messages).to include('test message 1')
27
+ expect(list.full_messages).to include('test message 2')
28
+ end
29
+
30
+ it 'translates and adds recognized I18n keys in the #full_messages' do
31
+ add_translation(:errors, :test, :i18n_message, 'translated')
32
+ list.add(:test, :i18n_message)
33
+ expect(list.full_messages).to include('test translated')
34
+ end
35
+
36
+ it 'translates based on the initialized list type' do
37
+ add_translation(:string, :test, :i18n_message, 'strings')
38
+ add_translation(:messages, :test, :i18n_message, 'messages')
39
+ add_translation(:errors, :test, :i18n_message, 'errors')
40
+ message_list = Rapporteur::MessageList.new(:messages)
41
+ error_list = Rapporteur::MessageList.new(:errors)
42
+ message_list.add(:test, :i18n_message)
43
+ error_list.add(:test, :i18n_message)
44
+ expect(message_list.full_messages).to include('test messages')
45
+ expect(message_list.full_messages).not_to include('test errors')
46
+ expect(error_list.full_messages).to include('test errors')
47
+ expect(error_list.full_messages).not_to include('test messages')
48
+ end
49
+ end
50
+
51
+ context '#to_hash' do
52
+ it 'flattens key/value pairs with only one value' do
53
+ list.add(:test, 'message')
54
+ expect(list.to_hash).to eq({:test => 'message'})
55
+ end
56
+
57
+ it 'retains multiple values for a single key' do
58
+ list.add(:test, 'message1')
59
+ list.add(:test, 'message2')
60
+ result = list.to_hash
61
+ expect(result).to have_key(:test)
62
+ expect(result[:test]).to include('message1')
63
+ expect(result[:test]).to include('message2')
64
+ end
65
+
66
+ it 'returns a new, unique, but equivalent Hash with each call' do
67
+ list.add(:test, 'message')
68
+ return1 = list.to_hash
69
+ return2 = list.to_hash
70
+ expect(return1).not_to equal(return2)
71
+ expect(return1).to eq(return2)
72
+ end
73
+ end
74
+
75
+
76
+ private
77
+
78
+
79
+ def add_translation(type, key, message, string)
80
+ I18n.backend.store_translations('en', {:rapporteur => {type.to_sym => {key.to_sym => {message.to_sym => string}}}})
81
+ end
82
+ end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe 'A status request with a RevisionCheck' do
4
4
  before do
5
+ Rapporteur::Revision.stub(:current) { 'revisionidentifier' }
5
6
  Rapporteur.add_check(Rapporteur::Checks::RevisionCheck)
6
7
  end
7
8
 
@@ -10,10 +11,8 @@ describe 'A status request with a RevisionCheck' do
10
11
  it_behaves_like 'a successful status response'
11
12
 
12
13
  context 'the response payload' do
13
- subject { get(status_path) ; JSON.parse(response.body) }
14
-
15
14
  it 'contains the current application revision' do
16
- expect(subject.fetch('revision')).to(match(/^[a-f0-9]{40}$/))
15
+ expect(subject).to include_status_message('revision', 'revisionidentifier')
17
16
  end
18
17
  end
19
18
  end
@@ -10,13 +10,9 @@ describe 'A status request with a TimeCheck' do
10
10
  it_behaves_like 'a successful status response'
11
11
 
12
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))
13
+ it 'contains the time in ISO8601' do
14
+ Time.stub(:now).and_return(Time.gm(2013,8,23))
15
+ expect(subject).to include_status_message('time', Time.gm(2013,8,23).iso8601)
20
16
  end
21
17
  end
22
18
  end
@@ -2,22 +2,22 @@ require 'spec_helper.rb'
2
2
 
3
3
  describe "status routes" do
4
4
  it 'routes /status.json to statuses#show' do
5
- expect({ get: '/status.json'}).to route_to({
6
- action: 'show',
7
- controller: 'statuses',
8
- format: 'json',
5
+ expect({ :get => '/status.json'}).to route_to({
6
+ :action => 'show',
7
+ :controller => 'statuses',
8
+ :format => 'json',
9
9
  })
10
10
  end
11
11
 
12
12
  it 'does not route /status' do
13
- expect({ get: '/status'}).to_not be_routable
13
+ expect({ :get => '/status'}).to_not be_routable
14
14
  end
15
15
 
16
16
  it 'does not route /status.html' do
17
- expect({ get: '/status.html'}).to_not be_routable
17
+ expect({ :get => '/status.html'}).to_not be_routable
18
18
  end
19
19
 
20
20
  it 'does not route /status.xml' do
21
- expect({ get: '/status.xml'}).to_not be_routable
21
+ expect({ :get => '/status.xml'}).to_not be_routable
22
22
  end
23
23
  end
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: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Envy Labs
@@ -9,42 +9,42 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-29 00:00:00.000000000 Z
12
+ date: 2013-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: railties
15
+ name: i18n
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ! '>='
19
- - !ruby/object:Gem::Version
20
- version: '3.1'
21
- - - <
18
+ - - ~>
22
19
  - !ruby/object:Gem::Version
23
- version: '4.1'
20
+ version: '0.6'
24
21
  type: :runtime
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
24
  requirements:
28
- - - ! '>='
29
- - !ruby/object:Gem::Version
30
- version: '3.1'
31
- - - <
25
+ - - ~>
32
26
  - !ruby/object:Gem::Version
33
- version: '4.1'
27
+ version: '0.6'
34
28
  - !ruby/object:Gem::Dependency
35
- name: activesupport
29
+ name: railties
36
30
  requirement: !ruby/object:Gem::Requirement
37
31
  requirements:
38
32
  - - ! '>='
39
33
  - !ruby/object:Gem::Version
40
- version: '0'
34
+ version: '3.1'
35
+ - - <
36
+ - !ruby/object:Gem::Version
37
+ version: '4.1'
41
38
  type: :runtime
42
39
  prerelease: false
43
40
  version_requirements: !ruby/object:Gem::Requirement
44
41
  requirements:
45
42
  - - ! '>='
46
43
  - !ruby/object:Gem::Version
47
- version: '0'
44
+ version: '3.1'
45
+ - - <
46
+ - !ruby/object:Gem::Version
47
+ version: '4.1'
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: appraisal
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,9 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.5'
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 0.5.1
83
86
  type: :development
84
87
  prerelease: false
85
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -87,6 +90,9 @@ dependencies:
87
90
  - - ~>
88
91
  - !ruby/object:Gem::Version
89
92
  version: '0.5'
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: 0.5.1
90
96
  - !ruby/object:Gem::Dependency
91
97
  name: rails
92
98
  requirement: !ruby/object:Gem::Requirement
@@ -145,11 +151,13 @@ files:
145
151
  - gemfiles/rails3.2.gemfile
146
152
  - gemfiles/rails4.0.gemfile
147
153
  - lib/rapporteur.rb
154
+ - lib/rapporteur/check_list.rb
148
155
  - lib/rapporteur/checker.rb
149
156
  - lib/rapporteur/checker_deprecations.rb
150
157
  - lib/rapporteur/checks.rb
151
158
  - lib/rapporteur/checks/active_record_check.rb
152
159
  - lib/rapporteur/engine.rb
160
+ - lib/rapporteur/message_list.rb
153
161
  - lib/rapporteur/responder.rb
154
162
  - lib/rapporteur/revision.rb
155
163
  - lib/rapporteur/rspec.rb
@@ -160,6 +168,8 @@ files:
160
168
  - spec/internal/db/schema.rb
161
169
  - spec/internal/log/.gitignore
162
170
  - spec/internal/public/favicon.ico
171
+ - spec/models/check_list_spec.rb
172
+ - spec/models/message_list_spec.rb
163
173
  - spec/requests/active_record_check_spec.rb
164
174
  - spec/requests/halt_spec.rb
165
175
  - spec/requests/messsage_addition_spec.rb
@@ -188,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
198
  version: '0'
189
199
  requirements: []
190
200
  rubyforge_project:
191
- rubygems_version: 2.0.3
201
+ rubygems_version: 2.0.7
192
202
  signing_key:
193
203
  specification_version: 4
194
204
  summary: An engine that provides common status polling endpoint.
@@ -198,6 +208,8 @@ test_files:
198
208
  - spec/internal/db/schema.rb
199
209
  - spec/internal/log/.gitignore
200
210
  - spec/internal/public/favicon.ico
211
+ - spec/models/check_list_spec.rb
212
+ - spec/models/message_list_spec.rb
201
213
  - spec/requests/active_record_check_spec.rb
202
214
  - spec/requests/halt_spec.rb
203
215
  - spec/requests/messsage_addition_spec.rb