active_model-better_errors 1.6.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.
Files changed (45) hide show
  1. data/.document +5 -0
  2. data/.gitmodules +3 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +17 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.md +183 -0
  8. data/Rakefile +57 -0
  9. data/VERSION +1 -0
  10. data/active_model-better_errors.gemspec +113 -0
  11. data/lib/active_model/better_errors.rb +15 -0
  12. data/lib/active_model/error_collecting.rb +49 -0
  13. data/lib/active_model/error_collecting/array_reporter.rb +9 -0
  14. data/lib/active_model/error_collecting/core_ext.rb +6 -0
  15. data/lib/active_model/error_collecting/emulation.rb +65 -0
  16. data/lib/active_model/error_collecting/error_collection.rb +86 -0
  17. data/lib/active_model/error_collecting/error_message.rb +88 -0
  18. data/lib/active_model/error_collecting/error_message_set.rb +35 -0
  19. data/lib/active_model/error_collecting/errors.rb +52 -0
  20. data/lib/active_model/error_collecting/hash_reporter.rb +9 -0
  21. data/lib/active_model/error_collecting/human_array_reporter.rb +9 -0
  22. data/lib/active_model/error_collecting/human_hash_reporter.rb +15 -0
  23. data/lib/active_model/error_collecting/human_message_formatter.rb +60 -0
  24. data/lib/active_model/error_collecting/human_message_reporter.rb +32 -0
  25. data/lib/active_model/error_collecting/machine_array_reporter.rb +19 -0
  26. data/lib/active_model/error_collecting/machine_hash_reporter.rb +22 -0
  27. data/lib/active_model/error_collecting/message_reporter.rb +17 -0
  28. data/lib/active_model/error_collecting/reporter.rb +14 -0
  29. data/spec/lib/active_model/better_errors_spec.rb +7 -0
  30. data/spec/lib/active_model/error_collecting/emulation_spec.rb +45 -0
  31. data/spec/lib/active_model/error_collecting/error_collection_spec.rb +205 -0
  32. data/spec/lib/active_model/error_collecting/error_message_set_spec.rb +96 -0
  33. data/spec/lib/active_model/error_collecting/error_message_spec.rb +293 -0
  34. data/spec/lib/active_model/error_collecting/errors_spec.rb +95 -0
  35. data/spec/lib/active_model/error_collecting/human_array_reporter_spec.rb +33 -0
  36. data/spec/lib/active_model/error_collecting/human_hash_reporter_spec.rb +32 -0
  37. data/spec/lib/active_model/error_collecting/human_message_formatter_spec.rb +22 -0
  38. data/spec/lib/active_model/error_collecting/human_message_reporter_spec.rb +61 -0
  39. data/spec/lib/active_model/error_collecting/machine_array_reporter_spec.rb +40 -0
  40. data/spec/lib/active_model/error_collecting/machine_hash_reporter_spec.rb +40 -0
  41. data/spec/lib/active_model/error_collecting_spec.rb +22 -0
  42. data/spec/spec_helper.rb +15 -0
  43. data/spec/support/models.rb +28 -0
  44. data/test/integration.rb +10 -0
  45. metadata +274 -0
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModel::ErrorCollecting::HumanMessageFormatter do
4
+ subject(:formatter) { klass.new base, error_message }
5
+ let(:klass) { ActiveModel::ErrorCollecting::HumanMessageFormatter }
6
+ let(:base) { User.new }
7
+ let(:error_message) { ActiveModel::ErrorCollecting::ErrorMessage.build base, :first_name, :invalid }
8
+
9
+ describe "#initialize" do
10
+ its(:base) { should be base }
11
+ its(:error_message) { should be error_message }
12
+ its(:attribute) { should be error_message.attribute }
13
+ its(:type) { should be error_message.type }
14
+ its(:message) { should be error_message.message }
15
+ its(:options) { should be error_message.options }
16
+ end
17
+
18
+ describe "#format_message" do
19
+ subject { formatter.format_message }
20
+ it { should == "is invalid" }
21
+ end
22
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModel::ErrorCollecting::HumanMessageReporter do
4
+ subject(:reporter) { klass.new collection }
5
+ let(:klass) { ActiveModel::ErrorCollecting::HumanMessageReporter }
6
+ let(:collection) { ActiveModel::ErrorCollecting::ErrorCollection.new base}
7
+ let(:base) { User.new }
8
+
9
+
10
+ describe "#initialize" do
11
+ its(:collection) { should be collection }
12
+ end
13
+
14
+ describe "#base" do
15
+ its(:base) { should be base }
16
+ end
17
+
18
+ describe "#full_message" do
19
+ subject { reporter.full_message attribute, message }
20
+ let(:attribute) { :first_name }
21
+ let(:message) { "is invalid" }
22
+
23
+ it { should == "First name is invalid" }
24
+ end
25
+
26
+ describe "#full_messages" do
27
+ subject { reporter.full_messages }
28
+ let(:expected) {[
29
+ "First name is invalid",
30
+ "First name can't be empty",
31
+ "Last name is invalid"
32
+ ]}
33
+
34
+ before do
35
+ collection[:first_name] << :invalid
36
+ collection[:first_name] << :empty
37
+ collection[:last_name] << :invalid
38
+ end
39
+
40
+ it { should == expected }
41
+ end
42
+
43
+ describe "#generate_message" do
44
+ subject { reporter.generate_message attribute, type, options }
45
+ let(:attribute) { :first_name }
46
+
47
+ context "when passing symbols as message" do
48
+ let(:type) { :too_short }
49
+ let(:options) { {count: 3} }
50
+ let(:expected) { "is too short (minimum is 3 characters)" }
51
+ it { should == expected }
52
+ end
53
+
54
+ context "when passing strings as message" do
55
+ let(:type) { "foo" }
56
+ let(:options) { nil }
57
+ let(:expected) { type }
58
+ it { should == expected }
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModel::ErrorCollecting::MachineArrayReporter do
4
+ subject(:reporter) { klass.new collection }
5
+ let(:klass) { ActiveModel::ErrorCollecting::MachineArrayReporter }
6
+ let(:collection) { ActiveModel::ErrorCollecting::ErrorCollection.new base}
7
+ let(:base) { User.new }
8
+
9
+ describe "#initialize" do
10
+ its(:collection) { should be collection }
11
+ end
12
+
13
+ describe "#base" do
14
+ its(:base) { should be base }
15
+ end
16
+
17
+ describe "#to_a" do
18
+ subject { reporter.to_a }
19
+
20
+ before do
21
+ collection[:first_name] << :invalid
22
+ collection[:first_name] << [ :too_short, { count: 3 } ]
23
+ collection[:last_name] << :invalid
24
+ end
25
+
26
+ let(:expected) {[{
27
+ attribute: 'first_name',
28
+ type: :invalid
29
+ }, {
30
+ attribute: 'first_name',
31
+ type: :too_short,
32
+ options: { count: 3 }
33
+ },{
34
+ attribute: 'last_name',
35
+ type: :invalid
36
+ }]}
37
+
38
+ it { should == expected }
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModel::ErrorCollecting::MachineHashReporter do
4
+ subject(:reporter) { klass.new collection }
5
+ let(:klass) { ActiveModel::ErrorCollecting::MachineHashReporter }
6
+ let(:collection) { ActiveModel::ErrorCollecting::ErrorCollection.new base}
7
+ let(:base) { User.new }
8
+
9
+ describe "#initialize" do
10
+ its(:collection) { should be collection }
11
+ end
12
+
13
+ describe "#base" do
14
+ its(:base) { should be base }
15
+ end
16
+
17
+ describe "#to_hash" do
18
+ subject { reporter.to_hash }
19
+
20
+ before do
21
+ collection[:first_name] << :invalid
22
+ collection[:first_name] << [ :too_short, { count: 3 } ]
23
+ collection[:last_name] << :invalid
24
+ end
25
+
26
+ let(:expected) {{
27
+ first_name: [{
28
+ type: :invalid
29
+ }, {
30
+ type: :too_short,
31
+ options: { count: 3 }
32
+ }],
33
+ last_name: [{
34
+ type: :invalid
35
+ }]
36
+ }}
37
+
38
+ it { should == expected }
39
+ end
40
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModel::ErrorCollecting do
4
+ describe ".set_reporter" do
5
+ subject { ActiveModel::ErrorCollecting.reporters[name.to_s] }
6
+ before { ActiveModel::ErrorCollecting.set_reporter name, reporter }
7
+ after { ActiveModel::ErrorCollecting.set_reporter name, nil }
8
+ let(:name) { :mock }
9
+ let(:reporter) { Class.new }
10
+ it { should be reporter }
11
+ end
12
+
13
+ describe ".reporters" do
14
+ subject { ActiveModel::ErrorCollecting.reporters }
15
+ let(:expected) {{
16
+ 'message' => ActiveModel::ErrorCollecting::HumanMessageReporter,
17
+ 'array' => ActiveModel::ErrorCollecting::HumanArrayReporter,
18
+ 'hash' => ActiveModel::ErrorCollecting::HumanHashReporter
19
+ }}
20
+ it { should == expected }
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'pry'
5
+
6
+ require 'active_model'
7
+ require 'active_model/better_errors'
8
+
9
+ # Requires supporting files with custom matchers and macros, etc,
10
+ # in ./support/ and its subdirectories.
11
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
12
+
13
+ RSpec.configure do |config|
14
+
15
+ end
@@ -0,0 +1,28 @@
1
+ class BasicModel
2
+ extend ActiveModel::Naming
3
+ extend ActiveModel::Translation
4
+ include ActiveModel::Validations
5
+ include ActiveModel::Conversion
6
+
7
+ def initialize(params={})
8
+ params.each do |attr, value|
9
+ self.public_send("#{attr}=", value)
10
+ end
11
+ end
12
+
13
+ def persisted?
14
+ false
15
+ end
16
+ end
17
+
18
+ class User < BasicModel
19
+ attr_accessor :first_name, :last_name, :email
20
+
21
+ validates :first_name, :last_name, presence: { message: "plz...?" }
22
+ end
23
+
24
+ class Ruler < BasicModel
25
+ attr_accessor :length
26
+
27
+ validates_numericality_of :length, less_than_or_equal_to: 12, greater_than_or_equal_to: 4
28
+ end
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'active_model/better_errors'
5
+ require 'minitest/unit'
6
+
7
+ MiniTest::Unit::TestCase.add_setup_hook do
8
+ @__old_errors_class = ActiveModel::Errors
9
+ ActiveModel.stubs(:Errors).returns(ActiveModel::ErrorCollecting::Errors)
10
+ end
metadata ADDED
@@ -0,0 +1,274 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_model-better_errors
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.6.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Aaron Qian
9
+ - Byron Anderson
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-01-22 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activemodel
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '3.0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: rake
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.12.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 2.12.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: pry
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: yard
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rdoc
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
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
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: jeweler
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: simplecov
145
+ requirement: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: bcrypt-ruby
161
+ requirement: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ~>
165
+ - !ruby/object:Gem::Version
166
+ version: 3.0.0
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ~>
173
+ - !ruby/object:Gem::Version
174
+ version: 3.0.0
175
+ - !ruby/object:Gem::Dependency
176
+ name: mocha
177
+ requirement: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ version: 0.12.1
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: 0.12.1
191
+ description: ActiveModel::Errors class is not designed for API consumption. This gem
192
+ allows for that while keeping compatibility with existing rails API.
193
+ email:
194
+ - aq1018@gmail.com
195
+ - byronanderson32@gmail.com
196
+ executables: []
197
+ extensions: []
198
+ extra_rdoc_files:
199
+ - LICENSE.txt
200
+ - README.md
201
+ files:
202
+ - .document
203
+ - .gitmodules
204
+ - .rspec
205
+ - .travis.yml
206
+ - Gemfile
207
+ - LICENSE.txt
208
+ - README.md
209
+ - Rakefile
210
+ - VERSION
211
+ - active_model-better_errors.gemspec
212
+ - lib/active_model/better_errors.rb
213
+ - lib/active_model/error_collecting.rb
214
+ - lib/active_model/error_collecting/array_reporter.rb
215
+ - lib/active_model/error_collecting/core_ext.rb
216
+ - lib/active_model/error_collecting/emulation.rb
217
+ - lib/active_model/error_collecting/error_collection.rb
218
+ - lib/active_model/error_collecting/error_message.rb
219
+ - lib/active_model/error_collecting/error_message_set.rb
220
+ - lib/active_model/error_collecting/errors.rb
221
+ - lib/active_model/error_collecting/hash_reporter.rb
222
+ - lib/active_model/error_collecting/human_array_reporter.rb
223
+ - lib/active_model/error_collecting/human_hash_reporter.rb
224
+ - lib/active_model/error_collecting/human_message_formatter.rb
225
+ - lib/active_model/error_collecting/human_message_reporter.rb
226
+ - lib/active_model/error_collecting/machine_array_reporter.rb
227
+ - lib/active_model/error_collecting/machine_hash_reporter.rb
228
+ - lib/active_model/error_collecting/message_reporter.rb
229
+ - lib/active_model/error_collecting/reporter.rb
230
+ - spec/lib/active_model/better_errors_spec.rb
231
+ - spec/lib/active_model/error_collecting/emulation_spec.rb
232
+ - spec/lib/active_model/error_collecting/error_collection_spec.rb
233
+ - spec/lib/active_model/error_collecting/error_message_set_spec.rb
234
+ - spec/lib/active_model/error_collecting/error_message_spec.rb
235
+ - spec/lib/active_model/error_collecting/errors_spec.rb
236
+ - spec/lib/active_model/error_collecting/human_array_reporter_spec.rb
237
+ - spec/lib/active_model/error_collecting/human_hash_reporter_spec.rb
238
+ - spec/lib/active_model/error_collecting/human_message_formatter_spec.rb
239
+ - spec/lib/active_model/error_collecting/human_message_reporter_spec.rb
240
+ - spec/lib/active_model/error_collecting/machine_array_reporter_spec.rb
241
+ - spec/lib/active_model/error_collecting/machine_hash_reporter_spec.rb
242
+ - spec/lib/active_model/error_collecting_spec.rb
243
+ - spec/spec_helper.rb
244
+ - spec/support/models.rb
245
+ - test/integration.rb
246
+ homepage: http://github.com/aq1018/active_model-better_errors
247
+ licenses:
248
+ - MIT
249
+ post_install_message:
250
+ rdoc_options: []
251
+ require_paths:
252
+ - lib
253
+ required_ruby_version: !ruby/object:Gem::Requirement
254
+ none: false
255
+ requirements:
256
+ - - ! '>='
257
+ - !ruby/object:Gem::Version
258
+ version: '0'
259
+ segments:
260
+ - 0
261
+ hash: 1834962608414084255
262
+ required_rubygems_version: !ruby/object:Gem::Requirement
263
+ none: false
264
+ requirements:
265
+ - - ! '>='
266
+ - !ruby/object:Gem::Version
267
+ version: '0'
268
+ requirements: []
269
+ rubyforge_project:
270
+ rubygems_version: 1.8.24
271
+ signing_key:
272
+ specification_version: 3
273
+ summary: API consumable error messages with ActiveModel::Errors drop-in compatibility.
274
+ test_files: []