simple_params 1.6.4 → 1.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +1 -1
- data/lib/simple_params/concerns/rails_helpers.rb +1 -1
- data/lib/simple_params/concerns/validations.rb +4 -13
- data/lib/simple_params/errors.rb +7 -6
- data/lib/simple_params/nested_class_list.rb +46 -0
- data/lib/simple_params/nested_errors.rb +89 -0
- data/lib/simple_params/nested_params.rb +14 -7
- data/lib/simple_params/nested_params_class_builder.rb +7 -0
- data/lib/simple_params/params.rb +23 -9
- data/lib/simple_params/validation_matchers/validation_matcher.rb +1 -1
- data/lib/simple_params/version.rb +1 -1
- data/lib/simple_params.rb +2 -0
- data/spec/acceptance_spec.rb +18 -7
- data/spec/nested_errors_spec.rb +333 -0
- data/spec/nested_params_spec.rb +8 -4
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YWNlZDM0YjZkNWQxNjhhOGRjZDJjMWJiMzBiMTU1NGQ3ZjljNTZmMQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MTExMDdjMmE1MWJkOWEzNWJkOWEyOTg5MThmMWQ5ZTNhNjRiY2U5YQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmY4ZDg1NjFjNDYxNTBjZGRhNDhkMTBjNGI3Y2RmOTEyZWExYWVjZmQ0OWQz
|
10
|
+
YTBiNzBhMjY4N2NlYzgyNmQwNTg0MjQxZGNkMmU5ZDNkOWI5MDhiY2VhZTg3
|
11
|
+
ZmE5MTYxMThjNWU1OTBiZTk2MGVkNTJiZjBlNzNiYWIyM2YxN2Y=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjVkZTVmNWRlZWJmNzVhOWI3ZWE5NDllMDg2NGZlZWQzYWJlMmFiZTlkOTc1
|
14
|
+
NWJhZTdjNGE2MTQ4NDk5YjdhZTFiYjlhOTc4OWYyZTg2Y2EzNjg2Y2U5ZDFm
|
15
|
+
ZDJiZmFkNGVlZmU3OGU4MzU0NTczYjZmNjg0NjU5YTEwYTA1OWQ=
|
data/Gemfile.lock
CHANGED
@@ -23,19 +23,10 @@ module SimpleParams
|
|
23
23
|
|
24
24
|
private
|
25
25
|
def nested_classes_valid?
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def nested_class_valid?(nested_class)
|
32
|
-
if nested_class.is_a?(Array)
|
33
|
-
# Have to map? & THEN all?, or else it won't
|
34
|
-
# necessarily call valid? on every object
|
35
|
-
nested_class.map { |klass| klass.nil? || klass.valid? }.all?
|
36
|
-
else
|
37
|
-
nested_class.nil? || nested_class.valid?
|
38
|
-
end
|
26
|
+
# Need to map them, THEN call all?, otherwise validations won't get run
|
27
|
+
# on every nested class
|
28
|
+
validations = all_nested_classes.map { |klass| klass.valid? }
|
29
|
+
validations.all?
|
39
30
|
end
|
40
31
|
end
|
41
32
|
end
|
data/lib/simple_params/errors.rb
CHANGED
@@ -4,10 +4,11 @@ module SimpleParams
|
|
4
4
|
class Errors < ActiveModel::Errors
|
5
5
|
attr_reader :base
|
6
6
|
|
7
|
-
def initialize(base, nested_classes = {})
|
7
|
+
def initialize(base, nested_classes = {}, nested_classes_array = [])
|
8
8
|
super(base)
|
9
9
|
@base = base
|
10
10
|
@nested_classes = symbolize_nested(nested_classes)
|
11
|
+
@nested_classes_array = nested_classes_array
|
11
12
|
end
|
12
13
|
|
13
14
|
def [](attribute)
|
@@ -98,11 +99,6 @@ module SimpleParams
|
|
98
99
|
@nested_classes.keys.include?(attribute.to_sym)
|
99
100
|
end
|
100
101
|
|
101
|
-
def set_nested(attribute)
|
102
|
-
klass = nested_class(attribute)
|
103
|
-
errors = run_or_mapped_run(klass) { |k| k.errors if k.present? }
|
104
|
-
set(attribute.to_sym, errors)
|
105
|
-
end
|
106
102
|
|
107
103
|
def add_error_to_attribute(attribute, error)
|
108
104
|
if nested_attribute?(attribute)
|
@@ -138,6 +134,11 @@ module SimpleParams
|
|
138
134
|
nested.inject({}) { |memo,(k,v) | memo[k.to_sym] = v; memo }
|
139
135
|
end
|
140
136
|
|
137
|
+
def set_nested(attribute)
|
138
|
+
klass = nested_class(attribute)
|
139
|
+
errors = run_or_mapped_run(klass) { |k| k.errors if k.present? }
|
140
|
+
set(attribute.to_sym, errors)
|
141
|
+
end
|
141
142
|
|
142
143
|
def nested_instances
|
143
144
|
array =[]
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SimpleParams
|
2
|
+
class NestedClassList
|
3
|
+
attr_reader :parent
|
4
|
+
|
5
|
+
def initialize(parent)
|
6
|
+
@parent = parent
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_hash
|
10
|
+
nested_class_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_class_key(klass)
|
14
|
+
nested_class_hash.each do |key, value|
|
15
|
+
if value.is_a?(Array)
|
16
|
+
return key if value.include?(klass)
|
17
|
+
else
|
18
|
+
return key if value == klass
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def class_instances
|
24
|
+
nested_class_hash.each_pair.inject([]) do |array, (key, value)|
|
25
|
+
array << value
|
26
|
+
array.flatten.compact
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def nested_class_hash
|
32
|
+
@nested_class_hash ||= nested_class_attributes.inject({}) do |hash, param|
|
33
|
+
hash[param.to_sym] = get_nested_class_from_parent(param)
|
34
|
+
hash
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def nested_class_attributes
|
39
|
+
@parent.nested_class_attributes
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_nested_class_from_parent(klass)
|
43
|
+
@parent.send(klass)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "active_model"
|
2
|
+
|
3
|
+
module SimpleParams
|
4
|
+
class NestedErrors < ActiveModel::Errors
|
5
|
+
attr_reader :base
|
6
|
+
|
7
|
+
def initialize(base)
|
8
|
+
super(base)
|
9
|
+
@base = base
|
10
|
+
end
|
11
|
+
|
12
|
+
def array?
|
13
|
+
@base.array?
|
14
|
+
end
|
15
|
+
|
16
|
+
def hash?
|
17
|
+
@base.hash?
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](attribute)
|
21
|
+
get(attribute.to_sym) || set(attribute.to_sym, [])
|
22
|
+
end
|
23
|
+
|
24
|
+
def []=(attribute, error)
|
25
|
+
add_error_to_attribute(attribute, error)
|
26
|
+
end
|
27
|
+
|
28
|
+
def add(attribute, message = :invalid, options = {})
|
29
|
+
message = normalize_message(attribute, message, options)
|
30
|
+
if exception = options[:strict]
|
31
|
+
exception = ActiveModel::StrictValidationFailed if exception == true
|
32
|
+
raise exception, full_message(attribute, message)
|
33
|
+
end
|
34
|
+
|
35
|
+
add_error_to_attribute(attribute, message)
|
36
|
+
end
|
37
|
+
|
38
|
+
def clear
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
def empty?
|
43
|
+
super
|
44
|
+
end
|
45
|
+
alias_method :blank?, :empty?
|
46
|
+
|
47
|
+
def include?(attribute)
|
48
|
+
messages[attribute].present?
|
49
|
+
end
|
50
|
+
alias_method :has_key?, :include?
|
51
|
+
alias_method :key?, :include?
|
52
|
+
|
53
|
+
def values
|
54
|
+
messages.values
|
55
|
+
end
|
56
|
+
|
57
|
+
def full_messages
|
58
|
+
map { |attribute, message| full_message(attribute, message) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_hash(full_messages = false)
|
62
|
+
get_messages(self, full_messages)
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_s(full_messages = false)
|
66
|
+
array = to_a.compact
|
67
|
+
array.join(', ')
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def add_error_to_attribute(attribute, error)
|
72
|
+
self[attribute] << error
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_messages(object, full_messages = false)
|
76
|
+
if full_messages
|
77
|
+
object.messages.each_with_object({}) do |(attribute, array), messages|
|
78
|
+
messages[attribute] = array.map { |message| object.full_message(attribute, message) }
|
79
|
+
end
|
80
|
+
else
|
81
|
+
object.messages.dup
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def empty_messages?(msgs)
|
86
|
+
msgs.nil? || msgs.empty?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -31,11 +31,11 @@ module SimpleParams
|
|
31
31
|
|
32
32
|
def build(params, parent, name)
|
33
33
|
if params.is_a?(Array)
|
34
|
-
params.map { |p| build_instance(p, parent
|
34
|
+
params.map { |p| build_instance(p, parent) }.compact
|
35
35
|
elsif with_ids?
|
36
|
-
params.each_pair.map { |key, val| build_instance({key => val}, parent
|
36
|
+
params.each_pair.map { |key, val| build_instance({key => val}, parent) }.compact
|
37
37
|
else
|
38
|
-
build_instance(params, parent
|
38
|
+
build_instance(params, parent)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -44,8 +44,8 @@ module SimpleParams
|
|
44
44
|
NestedParamsClassBuilder.new(parent).build(self, name, options, &block)
|
45
45
|
end
|
46
46
|
|
47
|
-
def build_instance(params, parent
|
48
|
-
instance = self.new(params, parent
|
47
|
+
def build_instance(params, parent)
|
48
|
+
instance = self.new(params, parent)
|
49
49
|
instance.destroyed? ? nil : instance
|
50
50
|
end
|
51
51
|
end
|
@@ -54,14 +54,21 @@ module SimpleParams
|
|
54
54
|
|
55
55
|
# Should allow NestedParams to be initialized with no arguments, in order
|
56
56
|
# to be compatible with some Rails form gems like 'nested_form'
|
57
|
-
def initialize(params={}, parent = nil
|
57
|
+
def initialize(params={}, parent = nil)
|
58
58
|
@parent = parent
|
59
|
-
@parent_attribute_name = parent_attribute_name
|
60
59
|
@id = extract_id(params)
|
61
60
|
@params = extract_initialization_params(params)
|
62
61
|
super(@params)
|
63
62
|
end
|
64
63
|
|
64
|
+
def array?
|
65
|
+
self.class.array?
|
66
|
+
end
|
67
|
+
|
68
|
+
def symbol
|
69
|
+
self.class.name_symbol
|
70
|
+
end
|
71
|
+
|
65
72
|
def destroyed?
|
66
73
|
sym_params = symbolize_params(params)
|
67
74
|
[true, 1, "1", "true"].include?(sym_params[:_destroy])
|
@@ -7,14 +7,21 @@ module SimpleParams
|
|
7
7
|
#TODO: Need to test this!
|
8
8
|
def build(nested_params, name, options, &block)
|
9
9
|
klass_name = name.to_s.split('_').collect(&:capitalize).join
|
10
|
+
name_symbol = name.to_sym
|
10
11
|
Class.new(nested_params).tap do |klass|
|
11
12
|
@parent.send(:remove_const, klass_name) if @parent.const_defined?(klass_name)
|
12
13
|
@parent.const_set(klass_name, klass)
|
14
|
+
|
13
15
|
klass.instance_eval <<-DEF
|
14
16
|
def parent_class
|
15
17
|
#{@parent}
|
16
18
|
end
|
19
|
+
|
20
|
+
def name_symbol
|
21
|
+
:#{name_symbol}
|
22
|
+
end
|
17
23
|
DEF
|
24
|
+
|
18
25
|
klass.class_eval('extend ActiveModel::Naming')
|
19
26
|
klass.class_eval(&block)
|
20
27
|
klass.class_eval("self.options = #{options}")
|
data/lib/simple_params/params.rb
CHANGED
@@ -78,13 +78,18 @@ module SimpleParams
|
|
78
78
|
init_value = if opts[:optional]
|
79
79
|
klass.hash? ? nil : []
|
80
80
|
else
|
81
|
-
klass_instance = klass.new({}, self
|
81
|
+
klass_instance = klass.new({}, self)
|
82
82
|
klass.hash? ? klass_instance : [klass_instance]
|
83
83
|
end
|
84
84
|
instance_variable_set("@#{name}", init_value)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
define_method("#{name}_params") do
|
89
|
+
original_params = instance_variable_get("@original_params")
|
90
|
+
original_params[:"#{name}"] || original_params[:"#{name}_attributes"]
|
91
|
+
end
|
92
|
+
|
88
93
|
define_method("#{name}=") do |initializer|
|
89
94
|
init_value = klass.build(initializer, self, name)
|
90
95
|
instance_variable_set("@#{name}", init_value)
|
@@ -101,15 +106,12 @@ module SimpleParams
|
|
101
106
|
params = InitializationHash.new(params)
|
102
107
|
@original_params = params.original_params
|
103
108
|
define_attributes(@original_params)
|
104
|
-
|
105
|
-
# Nested Classes
|
106
|
-
@nested_classes = nested_classes.keys
|
107
109
|
set_accessors(params)
|
108
110
|
end
|
109
111
|
|
110
112
|
def define_attributes(params)
|
111
113
|
self.class.defined_attributes.each_pair do |key, opts|
|
112
|
-
send("#{key}_attribute=", Attribute.new(self, key, opts))
|
114
|
+
self.send("#{key}_attribute=", Attribute.new(self, key, opts))
|
113
115
|
end
|
114
116
|
end
|
115
117
|
|
@@ -117,11 +119,19 @@ module SimpleParams
|
|
117
119
|
HashBuilder.new(self).build
|
118
120
|
end
|
119
121
|
|
122
|
+
def nested_class_attributes
|
123
|
+
nested_classes.keys
|
124
|
+
end
|
125
|
+
|
126
|
+
def nested_class_hash
|
127
|
+
nested_class_list.to_hash
|
128
|
+
end
|
129
|
+
|
130
|
+
def all_nested_classes
|
131
|
+
nested_class_list.class_instances
|
132
|
+
end
|
133
|
+
|
120
134
|
def errors
|
121
|
-
nested_class_hash = {}
|
122
|
-
@nested_classes.each do |param|
|
123
|
-
nested_class_hash[param.to_sym] = send(param)
|
124
|
-
end
|
125
135
|
@errors ||= SimpleParams::Errors.new(self, nested_class_hash)
|
126
136
|
end
|
127
137
|
|
@@ -132,6 +142,10 @@ module SimpleParams
|
|
132
142
|
end
|
133
143
|
end
|
134
144
|
|
145
|
+
def nested_class_list
|
146
|
+
@nested_class_list ||= NestedClassList.new(self)
|
147
|
+
end
|
148
|
+
|
135
149
|
def defined_attributes
|
136
150
|
self.class.defined_attributes
|
137
151
|
end
|
data/lib/simple_params.rb
CHANGED
@@ -11,6 +11,8 @@ require 'simple_params/concerns/validations'
|
|
11
11
|
require 'simple_params/params'
|
12
12
|
require 'simple_params/initialization_hash'
|
13
13
|
require 'simple_params/hash_builder'
|
14
|
+
require 'simple_params/nested_class_list'
|
15
|
+
require 'simple_params/nested_errors'
|
14
16
|
require 'simple_params/nested_params'
|
15
17
|
require 'simple_params/nested_params_class_builder'
|
16
18
|
require 'simple_params/simple_params_error'
|
data/spec/acceptance_spec.rb
CHANGED
@@ -104,6 +104,23 @@ describe SimpleParams::Params do
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
+
|
108
|
+
describe "nested_parameter_accessors", nested_parameter_accessors: true do
|
109
|
+
it "returns params hash for nested attribute" do
|
110
|
+
params = AcceptanceParams.new(name: "Tom", address: { "street" => "1 Main St."} )
|
111
|
+
params.address_params.should eq({
|
112
|
+
street: "1 Main St."
|
113
|
+
})
|
114
|
+
end
|
115
|
+
|
116
|
+
it "returns params hash for nested attribute" do
|
117
|
+
params = AcceptanceParams.new(name: "Tom", address_attributes: { "street" => "1 Main St."} )
|
118
|
+
params.address_params.should eq({
|
119
|
+
street: "1 Main St."
|
120
|
+
})
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
107
124
|
describe "to_hash", to_hash: true do
|
108
125
|
it "returns params hash" do
|
109
126
|
params = AcceptanceParams.new(
|
@@ -282,12 +299,6 @@ describe SimpleParams::Params do
|
|
282
299
|
params.attributes.should eq([:reference, :name, :date_of_birth, :content, :current_time, :age, :color, :sibling_names, :address, :phone, :dogs, :cats, :birds])
|
283
300
|
end
|
284
301
|
|
285
|
-
it "returns array of attribute symbols for nested class" do
|
286
|
-
params = AcceptanceParams::Address.new({}, nil, :address)
|
287
|
-
params.parent_attribute_name.should eq(:address)
|
288
|
-
params.attributes.should eq([:street, :city, :zip_code, :state, :company, :_destroy])
|
289
|
-
end
|
290
|
-
|
291
302
|
it "initializes attributes correctly" do
|
292
303
|
params = AcceptanceParams.new
|
293
304
|
attribute = params.instance_variable_get("@age_attribute")
|
@@ -600,7 +611,7 @@ describe SimpleParams::Params do
|
|
600
611
|
}
|
601
612
|
end
|
602
613
|
|
603
|
-
it "is valid after multiple times" do
|
614
|
+
it "is valid after multiple times", failing: true do
|
604
615
|
acceptance_params = AcceptanceParams.new(params)
|
605
616
|
acceptance_params.valid?
|
606
617
|
acceptance_params.should be_valid
|
@@ -0,0 +1,333 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleParams::NestedErrors do
|
4
|
+
class Car
|
5
|
+
extend ActiveModel::Naming
|
6
|
+
def initialize
|
7
|
+
@errors = SimpleParams::NestedErrors.new(self)
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :make
|
11
|
+
attr_accessor :model
|
12
|
+
attr_reader :errors
|
13
|
+
|
14
|
+
def array?; false; end
|
15
|
+
def hash?; true; end
|
16
|
+
|
17
|
+
def read_attribute_for_validation(attr)
|
18
|
+
send(attr)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.human_attribute_name(attr, options = {})
|
22
|
+
attr
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.lookup_ancestors
|
26
|
+
[self]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Plane
|
31
|
+
extend ActiveModel::Naming
|
32
|
+
def initialize
|
33
|
+
@errors = SimpleParams::NestedErrors.new(self)
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_accessor :pilot
|
37
|
+
attr_accessor :number
|
38
|
+
attr_reader :errors
|
39
|
+
|
40
|
+
def array?; true; end
|
41
|
+
def hash?; false; end
|
42
|
+
|
43
|
+
def read_attribute_for_validation(attr)
|
44
|
+
send(attr)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.human_attribute_name(attr, options = {})
|
48
|
+
attr
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.lookup_ancestors
|
52
|
+
[self]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "setting and getting errors", setters_getters: true do
|
57
|
+
it "get returns the errors for the provided key" do
|
58
|
+
errors = SimpleParams::Errors.new(self)
|
59
|
+
errors[:foo] = "omg"
|
60
|
+
errors.get(:foo).should eq(["omg"])
|
61
|
+
end
|
62
|
+
|
63
|
+
it "sets the error with the provided key" do
|
64
|
+
errors = SimpleParams::Errors.new(self)
|
65
|
+
errors.set(:foo, "omg")
|
66
|
+
errors.messages.should eq({ foo: "omg" })
|
67
|
+
end
|
68
|
+
|
69
|
+
it "values returns an array of messages" do
|
70
|
+
errors = SimpleParams::Errors.new(self)
|
71
|
+
errors.set(:foo, "omg")
|
72
|
+
errors.set(:baz, "zomg")
|
73
|
+
errors.values.should eq(["omg", "zomg"])
|
74
|
+
end
|
75
|
+
|
76
|
+
it "keys returns the error keys" do
|
77
|
+
errors = SimpleParams::Errors.new(self)
|
78
|
+
errors.set(:foo, "omg")
|
79
|
+
errors.set(:baz, "zomg")
|
80
|
+
errors.keys.should eq([:foo, :baz])
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "setting on model" do
|
84
|
+
it "assign error" do
|
85
|
+
car = Car.new
|
86
|
+
car.errors[:make] = 'should not be nil'
|
87
|
+
car.errors[:make].should eq(["should not be nil"])
|
88
|
+
end
|
89
|
+
|
90
|
+
it "add an error message on a specific attribute" do
|
91
|
+
car = Car.new
|
92
|
+
car.errors.add(:make, "can not be blank")
|
93
|
+
car.errors[:make].should eq(["can not be blank"])
|
94
|
+
end
|
95
|
+
|
96
|
+
it "add an error with a symbol" do
|
97
|
+
car = Car.new
|
98
|
+
car.errors.add(:make, :blank)
|
99
|
+
message = car.errors.generate_message(:make, :blank)
|
100
|
+
car.errors[:make].should eq([message])
|
101
|
+
end
|
102
|
+
|
103
|
+
it "add an error with a proc" do
|
104
|
+
car = Car.new
|
105
|
+
message = Proc.new { "can not be blank" }
|
106
|
+
car.errors.add(:make, message)
|
107
|
+
car.errors[:make].should eq(["can not be blank"])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#clear", clear: true do
|
113
|
+
it "clears errors" do
|
114
|
+
car = Car.new
|
115
|
+
car.errors[:make] = 'should not be nil'
|
116
|
+
car.errors[:make].should eq(["should not be nil"])
|
117
|
+
car.errors.clear
|
118
|
+
car.errors.should be_empty
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "#empty?, #blank?, and #include?", empty: true do
|
123
|
+
it "is empty without any errors" do
|
124
|
+
car = Car.new
|
125
|
+
car.errors.should be_empty
|
126
|
+
car.errors.should be_blank
|
127
|
+
car.errors.should_not have_key(:make)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "is not empty with errors" do
|
131
|
+
car = Car.new
|
132
|
+
car.errors[:make] = 'should not be nil'
|
133
|
+
car.errors.should_not be_empty
|
134
|
+
car.errors.should_not be_blank
|
135
|
+
car.errors.should have_key(:make)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "#added?", added: true do
|
140
|
+
it "added? detects if a specific error was added to the object" do
|
141
|
+
car = Car.new
|
142
|
+
car.errors.add(:make, "can not be blank")
|
143
|
+
car.errors.added?(:make, "can not be blank").should be_truthy
|
144
|
+
end
|
145
|
+
|
146
|
+
it "added? handles symbol message" do
|
147
|
+
car = Car.new
|
148
|
+
car.errors.add(:make, :blank)
|
149
|
+
car.errors.added?(:make, :blank).should be_truthy
|
150
|
+
end
|
151
|
+
|
152
|
+
it "added? handles proc messages" do
|
153
|
+
car = Car.new
|
154
|
+
message = Proc.new { "can not be blank" }
|
155
|
+
car.errors.add(:make, message)
|
156
|
+
car.errors.added?(:make, message).should be_truthy
|
157
|
+
end
|
158
|
+
|
159
|
+
it "added? defaults message to :invalid" do
|
160
|
+
car = Car.new
|
161
|
+
car.errors.add(:make)
|
162
|
+
car.errors.added?(:make).should be_truthy
|
163
|
+
end
|
164
|
+
|
165
|
+
it "added? matches the given message when several errors are present for the same attribute" do
|
166
|
+
car = Car.new
|
167
|
+
car.errors.add(:make, "can not be blank")
|
168
|
+
car.errors.add(:make, "is invalid")
|
169
|
+
car.errors.added?(:make, "can not be blank").should be_truthy
|
170
|
+
end
|
171
|
+
|
172
|
+
it "added? returns false when no errors are present" do
|
173
|
+
car = Car.new
|
174
|
+
car.errors.added?(:make).should_not be_truthy
|
175
|
+
end
|
176
|
+
|
177
|
+
it "added? returns false when checking a nonexisting error and other errors are present for the given attribute" do
|
178
|
+
car = Car.new
|
179
|
+
car.errors.add(:make, "is invalid")
|
180
|
+
car.errors.added?(:make, "can not be blank").should_not be_truthy
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "#size", size: true do
|
185
|
+
it "size calculates the number of error messages" do
|
186
|
+
car = Car.new
|
187
|
+
car.errors.add(:make, "can not be blank")
|
188
|
+
car.errors.size.should eq(1)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "#to_a", to_a: true do
|
193
|
+
it "to_a returns the list of errors with complete messages containing the attribute names" do
|
194
|
+
car = Car.new
|
195
|
+
car.errors.add(:make, "can not be blank")
|
196
|
+
car.errors.add(:make, "can not be nil")
|
197
|
+
car.errors.to_a.should eq(["make can not be blank", "make can not be nil"])
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "#to_s", to_s: true do
|
202
|
+
it "to_a returns the list of errors with complete messages containing the attribute names" do
|
203
|
+
car = Car.new
|
204
|
+
car.errors.add(:make, "can not be blank")
|
205
|
+
car.errors.add(:make, "can not be nil")
|
206
|
+
car.errors.to_s.should eq("make can not be blank, make can not be nil")
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "#to_hash", to_hash: true do
|
212
|
+
it "to_hash returns the error messages hash" do
|
213
|
+
car = Car.new
|
214
|
+
car.errors.add(:make, "can not be blank")
|
215
|
+
car.errors.to_hash.should eq({ make: ["can not be blank"] })
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe "#as_json", as_json: true do
|
220
|
+
it "as_json creates a json formatted representation of the errors hash" do
|
221
|
+
car = Car.new
|
222
|
+
car.errors[:make] = 'can not be nil'
|
223
|
+
car.errors[:make].should eq(["can not be nil"])
|
224
|
+
car.errors.as_json.should eq({ make: ["can not be nil"] })
|
225
|
+
end
|
226
|
+
|
227
|
+
it "as_json with :full_messages option creates a json formatted representation of the errors containing complete messages" do
|
228
|
+
car = Car.new
|
229
|
+
car.errors[:make] = 'can not be nil'
|
230
|
+
car.errors[:make].should eq(["can not be nil"])
|
231
|
+
car.errors.as_json(full_messages: true).should eq({ make: ["make can not be nil"] })
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "#full_messages", full_messages: true do
|
236
|
+
it "full_messages creates a list of error messages with the attribute name included" do
|
237
|
+
car = Car.new
|
238
|
+
car.errors.add(:make, "can not be blank")
|
239
|
+
car.errors.add(:make, "can not be nil")
|
240
|
+
car.errors.full_messages.should eq(["make can not be blank", "make can not be nil"])
|
241
|
+
end
|
242
|
+
|
243
|
+
it "full_messages_for contains all the error messages for the given attribute" do
|
244
|
+
car = Car.new
|
245
|
+
car.errors.add(:make, "can not be blank")
|
246
|
+
car.errors.add(:make, "can not be nil")
|
247
|
+
car.errors.full_messages_for(:make).should eq(["make can not be blank", "make can not be nil"])
|
248
|
+
end
|
249
|
+
|
250
|
+
it "full_messages_for does not contain error messages from other attributes" do
|
251
|
+
car = Car.new
|
252
|
+
car.errors.add(:make, "can not be blank")
|
253
|
+
car.errors.add(:model, "can not be blank")
|
254
|
+
car.errors.full_messages_for(:make).should eq(["make can not be blank"])
|
255
|
+
end
|
256
|
+
|
257
|
+
it "full_messages_for returns an empty list in case there are no errors for the given attribute" do
|
258
|
+
car = Car.new
|
259
|
+
car.errors.add(:make, "can not be blank")
|
260
|
+
car.errors.full_messages_for(:model).should eq([])
|
261
|
+
end
|
262
|
+
|
263
|
+
it "full_message returns the given message when attribute is :base" do
|
264
|
+
car = Car.new
|
265
|
+
car.errors.full_message(:base, "press the button").should eq("press the button")
|
266
|
+
end
|
267
|
+
|
268
|
+
it "full_message returns the given message with the attribute name included" do
|
269
|
+
car = Car.new
|
270
|
+
car.errors.full_message(:make, "can not be blank").should eq("make can not be blank")
|
271
|
+
car.errors.full_message(:model, "can not be blank").should eq("model can not be blank")
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
describe "#generate_message", generate_message: true do
|
276
|
+
it "generate_message works without i18n_scope" do
|
277
|
+
car = Car.new
|
278
|
+
Car.should_not respond_to(:i18n_scope)
|
279
|
+
expect {
|
280
|
+
car.errors.generate_message(:make, :blank)
|
281
|
+
}.to_not raise_error
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe "#adds_on_empty", add_on_empty: true do
|
286
|
+
it "add_on_empty generates message" do
|
287
|
+
car = Car.new
|
288
|
+
car.errors.should_receive(:generate_message).with(:make, :empty, {})
|
289
|
+
car.errors.add_on_empty :make
|
290
|
+
end
|
291
|
+
|
292
|
+
it "add_on_empty generates message for multiple attributes" do
|
293
|
+
car = Car.new
|
294
|
+
car.errors.should_receive(:generate_message).with(:make, :empty, {})
|
295
|
+
car.errors.should_receive(:generate_message).with(:model, :empty, {})
|
296
|
+
car.errors.add_on_empty [:make, :model]
|
297
|
+
end
|
298
|
+
|
299
|
+
it "add_on_empty generates message with custom default message" do
|
300
|
+
car = Car.new
|
301
|
+
car.errors.should_receive(:generate_message).with(:make, :empty, { message: 'custom' })
|
302
|
+
car.errors.add_on_empty :make, message: 'custom'
|
303
|
+
end
|
304
|
+
|
305
|
+
it "add_on_empty generates message with empty string value" do
|
306
|
+
car = Car.new
|
307
|
+
car.make = ''
|
308
|
+
car.errors.should_receive(:generate_message).with(:make, :empty, {})
|
309
|
+
car.errors.add_on_empty :make
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
describe "#adds_on_blank", add_on_blank: true do
|
314
|
+
it "add_on_blank generates message" do
|
315
|
+
car = Car.new
|
316
|
+
car.errors.should_receive(:generate_message).with(:make, :blank, {})
|
317
|
+
car.errors.add_on_blank :make
|
318
|
+
end
|
319
|
+
|
320
|
+
it "add_on_blank generates message for multiple attributes" do
|
321
|
+
car = Car.new
|
322
|
+
car.errors.should_receive(:generate_message).with(:make, :blank, {})
|
323
|
+
car.errors.should_receive(:generate_message).with(:model, :blank, {})
|
324
|
+
car.errors.add_on_blank [:make, :model]
|
325
|
+
end
|
326
|
+
|
327
|
+
it "add_on_blank generates message with custom default message" do
|
328
|
+
car = Car.new
|
329
|
+
car.errors.should_receive(:generate_message).with(:make, :blank, { message: 'custom' })
|
330
|
+
car.errors.add_on_blank :make, message: 'custom'
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
data/spec/nested_params_spec.rb
CHANGED
@@ -28,6 +28,10 @@ describe SimpleParams::NestedParams do
|
|
28
28
|
defined_class.name.should eq("DummyParentClass::MySpecialParams")
|
29
29
|
end
|
30
30
|
|
31
|
+
it "has correct name_symbol", failing: true do
|
32
|
+
defined_class.name_symbol.should eq(:my_special_params)
|
33
|
+
end
|
34
|
+
|
31
35
|
it "has correct parent class" do
|
32
36
|
defined_class.parent_class.should eq(DummyParentClass)
|
33
37
|
end
|
@@ -102,7 +106,7 @@ describe SimpleParams::NestedParams do
|
|
102
106
|
end
|
103
107
|
end
|
104
108
|
|
105
|
-
subject { defined_class.new(
|
109
|
+
subject { defined_class.new(name: "Bill", age: 21) }
|
106
110
|
|
107
111
|
specify "name" do
|
108
112
|
expect(subject.name).to eq "Bill"
|
@@ -125,7 +129,7 @@ describe SimpleParams::NestedParams do
|
|
125
129
|
end
|
126
130
|
end
|
127
131
|
|
128
|
-
subject { defined_class.new({ "132" => { name: "Bill", age: 21 } }
|
132
|
+
subject { defined_class.new({ "132" => { name: "Bill", age: 21 } }) }
|
129
133
|
|
130
134
|
specify "name" do
|
131
135
|
expect(subject.name).to eq "Bill"
|
@@ -150,7 +154,7 @@ describe SimpleParams::NestedParams do
|
|
150
154
|
end
|
151
155
|
end
|
152
156
|
|
153
|
-
subject { defined_class.new(
|
157
|
+
subject { defined_class.new(name: "Bill", age: 21) }
|
154
158
|
|
155
159
|
specify "name" do
|
156
160
|
expect(subject.name).to eq "Bill"
|
@@ -173,7 +177,7 @@ describe SimpleParams::NestedParams do
|
|
173
177
|
end
|
174
178
|
end
|
175
179
|
|
176
|
-
subject { defined_class.new({ "132" => { name: "Bill", age: 21 } }
|
180
|
+
subject { defined_class.new({ "132" => { name: "Bill", age: 21 } }) }
|
177
181
|
|
178
182
|
specify "name" do
|
179
183
|
expect(subject.name).to eq "Bill"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- brycesenz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -143,6 +143,8 @@ files:
|
|
143
143
|
- lib/simple_params/formatter.rb
|
144
144
|
- lib/simple_params/hash_builder.rb
|
145
145
|
- lib/simple_params/initialization_hash.rb
|
146
|
+
- lib/simple_params/nested_class_list.rb
|
147
|
+
- lib/simple_params/nested_errors.rb
|
146
148
|
- lib/simple_params/nested_params.rb
|
147
149
|
- lib/simple_params/nested_params_class_builder.rb
|
148
150
|
- lib/simple_params/params.rb
|
@@ -169,6 +171,7 @@ files:
|
|
169
171
|
- spec/formatter_spec.rb
|
170
172
|
- spec/initialization_hash_spec.rb
|
171
173
|
- spec/multiple_classes_spec.rb
|
174
|
+
- spec/nested_errors_spec.rb
|
172
175
|
- spec/nested_params_spec.rb
|
173
176
|
- spec/params_spec.rb
|
174
177
|
- spec/rails_integration_spec.rb
|
@@ -217,6 +220,7 @@ test_files:
|
|
217
220
|
- spec/formatter_spec.rb
|
218
221
|
- spec/initialization_hash_spec.rb
|
219
222
|
- spec/multiple_classes_spec.rb
|
223
|
+
- spec/nested_errors_spec.rb
|
220
224
|
- spec/nested_params_spec.rb
|
221
225
|
- spec/params_spec.rb
|
222
226
|
- spec/rails_integration_spec.rb
|