remarkable_activerecord 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +46 -46
- data/LICENSE +1 -1
- data/README +64 -64
- data/lib/remarkable_activerecord.rb +1 -1
- data/lib/remarkable_activerecord/base.rb +40 -40
- data/lib/remarkable_activerecord/human_names.rb +24 -24
- data/lib/remarkable_activerecord/matchers/allow_mass_assignment_of_matcher.rb +14 -14
- data/lib/remarkable_activerecord/matchers/allow_values_for_matcher.rb +70 -70
- data/lib/remarkable_activerecord/matchers/association_matcher.rb +197 -197
- data/lib/remarkable_activerecord/matchers/have_column_matcher.rb +29 -29
- data/lib/remarkable_activerecord/matchers/have_index_matcher.rb +20 -20
- data/lib/remarkable_activerecord/matchers/have_readonly_attributes_matcher.rb +7 -7
- data/lib/remarkable_activerecord/matchers/have_scope_matcher.rb +34 -34
- data/lib/remarkable_activerecord/matchers/validate_acceptance_of_matcher.rb +37 -37
- data/lib/remarkable_activerecord/matchers/validate_associated_matcher.rb +75 -75
- data/lib/remarkable_activerecord/matchers/validate_confirmation_of_matcher.rb +44 -44
- data/lib/remarkable_activerecord/matchers/validate_exclusion_of_matcher.rb +17 -17
- data/lib/remarkable_activerecord/matchers/validate_inclusion_of_matcher.rb +20 -20
- data/lib/remarkable_activerecord/matchers/validate_numericality_of_matcher.rb +14 -14
- data/lib/remarkable_activerecord/matchers/validate_uniqueness_of_matcher.rb +80 -61
- data/locale/en.yml +253 -253
- data/spec/allow_mass_assignment_of_matcher_spec.rb +50 -50
- data/spec/allow_values_for_matcher_spec.rb +45 -45
- data/spec/association_matcher_spec.rb +612 -612
- data/spec/have_column_matcher_spec.rb +67 -67
- data/spec/have_index_matcher_spec.rb +61 -61
- data/spec/have_readonly_attributes_matcher_spec.rb +40 -40
- data/spec/have_scope_matcher_spec.rb +60 -60
- data/spec/model_builder.rb +101 -101
- data/spec/spec_helper.rb +25 -25
- data/spec/validate_acceptance_of_matcher_spec.rb +64 -64
- data/spec/validate_associated_matcher_spec.rb +118 -118
- data/spec/validate_confirmation_of_matcher_spec.rb +54 -54
- data/spec/validate_exclusion_of_matcher_spec.rb +76 -76
- data/spec/validate_inclusion_of_matcher_spec.rb +72 -72
- data/spec/validate_numericality_of_matcher_spec.rb +100 -100
- data/spec/validate_presence_of_matcher_spec.rb +40 -40
- data/spec/validate_uniqueness_of_matcher_spec.rb +158 -139
- metadata +3 -3
@@ -1,44 +1,44 @@
|
|
1
|
-
module Remarkable
|
2
|
-
module ActiveRecord
|
3
|
-
module Matchers
|
4
|
-
class ValidateConfirmationOfMatcher < Remarkable::ActiveRecord::Base #:nodoc:
|
5
|
-
arguments :collection => :attributes, :as => :attribute
|
6
|
-
|
7
|
-
optional :message
|
8
|
-
collection_assertions :responds_to_confirmation?, :confirms?
|
9
|
-
|
10
|
-
default_options :message => :confirmation
|
11
|
-
|
12
|
-
protected
|
13
|
-
|
14
|
-
def responds_to_confirmation?
|
15
|
-
@subject.respond_to?(:"#{@attribute}_confirmation=")
|
16
|
-
end
|
17
|
-
|
18
|
-
def confirms?
|
19
|
-
@subject.send(:"#{@attribute}_confirmation=", 'something')
|
20
|
-
bad?('different')
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
# Ensures that the model cannot be saved if one of the attributes is not confirmed.
|
26
|
-
#
|
27
|
-
# == Options
|
28
|
-
#
|
29
|
-
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
30
|
-
# Regexp, string or symbol. Default = <tt>I18n.translate('activerecord.errors.messages.confirmation')</tt>
|
31
|
-
#
|
32
|
-
# == Examples
|
33
|
-
#
|
34
|
-
# should_validate_confirmation_of :email, :password
|
35
|
-
#
|
36
|
-
# it { should validate_confirmation_of(:email, :password) }
|
37
|
-
#
|
38
|
-
def validate_confirmation_of(*attributes)
|
39
|
-
ValidateConfirmationOfMatcher.new(*attributes).spec(self)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
1
|
+
module Remarkable
|
2
|
+
module ActiveRecord
|
3
|
+
module Matchers
|
4
|
+
class ValidateConfirmationOfMatcher < Remarkable::ActiveRecord::Base #:nodoc:
|
5
|
+
arguments :collection => :attributes, :as => :attribute
|
6
|
+
|
7
|
+
optional :message
|
8
|
+
collection_assertions :responds_to_confirmation?, :confirms?
|
9
|
+
|
10
|
+
default_options :message => :confirmation
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
def responds_to_confirmation?
|
15
|
+
@subject.respond_to?(:"#{@attribute}_confirmation=")
|
16
|
+
end
|
17
|
+
|
18
|
+
def confirms?
|
19
|
+
@subject.send(:"#{@attribute}_confirmation=", 'something')
|
20
|
+
bad?('different')
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
# Ensures that the model cannot be saved if one of the attributes is not confirmed.
|
26
|
+
#
|
27
|
+
# == Options
|
28
|
+
#
|
29
|
+
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
30
|
+
# Regexp, string or symbol. Default = <tt>I18n.translate('activerecord.errors.messages.confirmation')</tt>
|
31
|
+
#
|
32
|
+
# == Examples
|
33
|
+
#
|
34
|
+
# should_validate_confirmation_of :email, :password
|
35
|
+
#
|
36
|
+
# it { should validate_confirmation_of(:email, :password) }
|
37
|
+
#
|
38
|
+
def validate_confirmation_of(*attributes)
|
39
|
+
ValidateConfirmationOfMatcher.new(*attributes).spec(self)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'allow_values_for_matcher')
|
2
|
-
|
1
|
+
require File.join(File.dirname(__FILE__), 'allow_values_for_matcher')
|
2
|
+
|
3
3
|
module Remarkable
|
4
4
|
module ActiveRecord
|
5
|
-
module Matchers
|
6
|
-
class ValidateExclusionOfMatcher < AllowValuesForMatcher #:nodoc:
|
7
|
-
|
8
|
-
default_options :message => :exclusion
|
9
|
-
|
10
|
-
protected
|
11
|
-
|
12
|
-
def valid_values
|
13
|
-
@in_range ? [ @options[:in].first - 1, @options[:in].last + 1 ] : []
|
14
|
-
end
|
15
|
-
|
16
|
-
def invalid_values
|
17
|
-
@options[:in]
|
18
|
-
end
|
5
|
+
module Matchers
|
6
|
+
class ValidateExclusionOfMatcher < AllowValuesForMatcher #:nodoc:
|
7
|
+
|
8
|
+
default_options :message => :exclusion
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def valid_values
|
13
|
+
@in_range ? [ @options[:in].first - 1, @options[:in].last + 1 ] : []
|
14
|
+
end
|
15
|
+
|
16
|
+
def invalid_values
|
17
|
+
@options[:in]
|
18
|
+
end
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Ensures that given values are not valid for the attribute. If a range
|
23
|
-
# is given, ensures that the attribute is not valid in the given range.
|
23
|
+
# is given, ensures that the attribute is not valid in the given range.
|
24
24
|
#
|
25
25
|
# == Options
|
26
26
|
#
|
@@ -1,27 +1,27 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'allow_values_for_matcher')
|
2
|
-
|
1
|
+
require File.join(File.dirname(__FILE__), 'allow_values_for_matcher')
|
2
|
+
|
3
3
|
module Remarkable
|
4
4
|
module ActiveRecord
|
5
|
-
module Matchers
|
6
|
-
class ValidateInclusionOfMatcher < AllowValuesForMatcher #:nodoc:
|
7
|
-
|
8
|
-
default_options :message => :inclusion
|
9
|
-
|
10
|
-
protected
|
11
|
-
|
12
|
-
def valid_values
|
13
|
-
@options[:in]
|
14
|
-
end
|
15
|
-
|
16
|
-
def invalid_values
|
17
|
-
@in_range ? [ @options[:in].first - 1, @options[:in].last + 1 ] : []
|
18
|
-
end
|
5
|
+
module Matchers
|
6
|
+
class ValidateInclusionOfMatcher < AllowValuesForMatcher #:nodoc:
|
7
|
+
|
8
|
+
default_options :message => :inclusion
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def valid_values
|
13
|
+
@options[:in]
|
14
|
+
end
|
15
|
+
|
16
|
+
def invalid_values
|
17
|
+
@in_range ? [ @options[:in].first - 1, @options[:in].last + 1 ] : []
|
18
|
+
end
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Ensures that given values are valid for the attribute. If a range
|
23
|
-
# is given, ensures that the attribute is valid in the given range.
|
24
|
-
#
|
23
|
+
# is given, ensures that the attribute is valid in the given range.
|
24
|
+
#
|
25
25
|
# == Options
|
26
26
|
#
|
27
27
|
# * <tt>:in</tt> - values to test inclusion.
|
@@ -31,9 +31,9 @@ module Remarkable
|
|
31
31
|
# Regexp, string or symbol. Default = <tt>I18n.translate('activerecord.errors.messages.inclusion')</tt>
|
32
32
|
#
|
33
33
|
# == Examples
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# should_validate_inclusion_of :size, :in => ["S", "M", "L", "XL"]
|
36
|
-
# should_validate_inclusion_of :age, :in => 18..100
|
36
|
+
# should_validate_inclusion_of :age, :in => 18..100
|
37
37
|
#
|
38
38
|
# it { should validate_inclusion_of(:size, :in => ["S", "M", "L", "XL"]) }
|
39
39
|
# it { should validate_inclusion_of(:age, :in => 18..100) }
|
@@ -130,20 +130,20 @@ module Remarkable
|
|
130
130
|
(valid_value_for_test / 2) * 2
|
131
131
|
end
|
132
132
|
|
133
|
-
# Returns the default message for each key (:odd, :even, :equal_to, ...).
|
134
|
-
# If the user provided a message, we use it, otherwise we should use
|
135
|
-
# the given key as message.
|
136
|
-
#
|
137
|
-
# For example, a default_message_for(:odd), if none is provided, will be
|
138
|
-
# :odd. So we have create :odd_message in the options hash, that when
|
139
|
-
# called later, will return :odd.
|
140
|
-
#
|
141
|
-
def default_message_for(key)
|
142
|
-
if @options[:message]
|
143
|
-
:message
|
144
|
-
else
|
145
|
-
@options[:"#{key}_message"] = key
|
146
|
-
:"#{key}_message"
|
133
|
+
# Returns the default message for each key (:odd, :even, :equal_to, ...).
|
134
|
+
# If the user provided a message, we use it, otherwise we should use
|
135
|
+
# the given key as message.
|
136
|
+
#
|
137
|
+
# For example, a default_message_for(:odd), if none is provided, will be
|
138
|
+
# :odd. So we have create :odd_message in the options hash, that when
|
139
|
+
# called later, will return :odd.
|
140
|
+
#
|
141
|
+
def default_message_for(key)
|
142
|
+
if @options[:message]
|
143
|
+
:message
|
144
|
+
else
|
145
|
+
@options[:"#{key}_message"] = key
|
146
|
+
:"#{key}_message"
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
@@ -2,56 +2,56 @@ module Remarkable
|
|
2
2
|
module ActiveRecord
|
3
3
|
module Matchers
|
4
4
|
class ValidateUniquenessOfMatcher < Remarkable::ActiveRecord::Base #:nodoc:
|
5
|
-
arguments :collection => :attributes, :as => :attribute
|
6
|
-
|
7
|
-
optional :message
|
5
|
+
arguments :collection => :attributes, :as => :attribute
|
6
|
+
|
7
|
+
optional :message
|
8
8
|
optional :scope, :splat => true
|
9
|
-
optional :case_sensitive, :allow_nil, :allow_blank, :default => true
|
9
|
+
optional :case_sensitive, :allow_nil, :allow_blank, :default => true
|
10
10
|
|
11
11
|
collection_assertions :find_first_object?, :responds_to_scope?, :is_unique?, :case_sensitive?,
|
12
12
|
:valid_with_new_scope?, :allow_nil?, :allow_blank?
|
13
|
-
|
14
|
-
default_options :message => :taken
|
15
|
-
|
16
|
-
before_assert do
|
17
|
-
@options[:scope] = [*@options[:scope]].compact if @options[:scope]
|
18
|
-
end
|
13
|
+
|
14
|
+
default_options :message => :taken
|
15
|
+
|
16
|
+
before_assert do
|
17
|
+
@options[:scope] = [*@options[:scope]].compact if @options[:scope]
|
18
|
+
end
|
19
19
|
|
20
20
|
private
|
21
21
|
|
22
|
-
# Tries to find an object in the database. If allow_nil and/or allow_blank
|
22
|
+
# Tries to find an object in the database. If allow_nil and/or allow_blank
|
23
23
|
# is given, we must find a record which is not nil or not blank.
|
24
24
|
#
|
25
25
|
# If any of these attempts fail, the validation fail.
|
26
26
|
#
|
27
27
|
def find_first_object?
|
28
28
|
@existing, message = if @options[:allow_nil]
|
29
|
-
[ subject_class.find(:first, :conditions => "#{@attribute} IS NOT NULL"), " with #{@attribute} not nil" ]
|
29
|
+
[ subject_class.find(:first, :conditions => "#{@attribute} IS NOT NULL"), " with #{@attribute} not nil" ]
|
30
30
|
elsif @options[:allow_blank]
|
31
|
-
[ subject_class.find(:first, :conditions => "#{@attribute} != ''"), " with #{@attribute} not blank" ]
|
31
|
+
[ subject_class.find(:first, :conditions => "#{@attribute} != ''"), " with #{@attribute} not blank" ]
|
32
32
|
else
|
33
33
|
[ subject_class.find(:first), "" ]
|
34
|
-
end
|
35
|
-
|
36
|
-
return true if @existing
|
34
|
+
end
|
35
|
+
|
36
|
+
return true if @existing
|
37
37
|
raise ScriptError, "could not find a #{subject_class} in the database" + message
|
38
|
-
end
|
39
|
-
|
38
|
+
end
|
39
|
+
|
40
40
|
# Set subject scope to be equal to the object found.
|
41
|
-
#
|
42
|
-
def responds_to_scope?
|
43
|
-
(@options[:scope] || []).each do |scope|
|
44
|
-
method = :"#{scope}="
|
45
|
-
return false, :method => method unless @subject.respond_to?(method)
|
41
|
+
#
|
42
|
+
def responds_to_scope?
|
43
|
+
(@options[:scope] || []).each do |scope|
|
44
|
+
method = :"#{scope}="
|
45
|
+
return false, :method => method unless @subject.respond_to?(method)
|
46
46
|
|
47
47
|
@subject.send(method, @existing.send(scope))
|
48
|
-
end
|
49
|
-
true
|
48
|
+
end
|
49
|
+
true
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
# Check if the attribute given is valid and if the validation fails for equal values.
|
53
53
|
#
|
54
|
-
def is_unique?
|
54
|
+
def is_unique?
|
55
55
|
@value = @existing.send(@attribute)
|
56
56
|
return bad?(@value)
|
57
57
|
end
|
@@ -71,52 +71,71 @@ module Remarkable
|
|
71
71
|
|
72
72
|
# Now test that the object is valid when changing the scoped attribute.
|
73
73
|
#
|
74
|
-
def valid_with_new_scope?
|
75
|
-
(@options[:scope] || []).each do |scope|
|
76
|
-
previous_scope_value = @subject.send(scope)
|
74
|
+
def valid_with_new_scope?
|
75
|
+
(@options[:scope] || []).each do |scope|
|
76
|
+
previous_scope_value = @subject.send(scope)
|
77
|
+
|
78
|
+
@subject.send("#{scope}=", new_value_for_scope(scope))
|
79
|
+
return false, :method => scope unless good?(@value)
|
77
80
|
|
78
|
-
@subject.send("#{scope}=", new_value_for_scope(scope))
|
79
|
-
return false, :method => scope unless good?(@value)
|
80
|
-
|
81
81
|
@subject.send("#{scope}=", previous_scope_value)
|
82
82
|
end
|
83
83
|
true
|
84
84
|
end
|
85
|
-
|
86
|
-
# Change the existing object attribute to nil to run allow nil
|
87
|
-
#
|
85
|
+
|
86
|
+
# Change the existing object attribute to nil to run allow nil
|
87
|
+
# validations. If we find any problem while updating the @existing
|
88
|
+
# record, it's because we can't save nil values in the database. So it
|
89
|
+
# passes when :allow_nil is false, but should raise an error when
|
90
|
+
# :allow_nil is true
|
91
|
+
#
|
88
92
|
def allow_nil?
|
89
|
-
@
|
93
|
+
return true unless @options.key?(:allow_nil)
|
94
|
+
|
95
|
+
@existing.update_attribute(@attribute, nil)
|
90
96
|
super
|
91
|
-
|
97
|
+
rescue Exception => e
|
98
|
+
raise ScriptError, "You declared that #{@attribute} accepts nil values in validate_uniqueness_of, " <<
|
99
|
+
"but I cannot save nil values in the database, got: #{e.message}" if @options[:allow_nil]
|
92
100
|
|
93
|
-
|
94
|
-
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
# Change the existing object attribute to blank to run allow blank
|
105
|
+
# validation. It uses the same logic as :allow_nil.
|
106
|
+
#
|
95
107
|
def allow_blank?
|
96
|
-
@
|
108
|
+
return true unless @options.key?(:allow_blank)
|
109
|
+
|
110
|
+
@existing.update_attribute(@attribute, '')
|
97
111
|
super
|
98
|
-
|
112
|
+
rescue Exception => e
|
113
|
+
raise ScriptError, "You declared that #{@attribute} accepts blank values in validate_uniqueness_of, " <<
|
114
|
+
"but I cannot save blank values in the database, got: #{e.message}" if @options[:allow_blank]
|
115
|
+
|
116
|
+
true
|
117
|
+
end
|
99
118
|
|
100
|
-
# Returns a value to be used as new scope. It does a range query in the
|
119
|
+
# Returns a value to be used as new scope. It does a range query in the
|
101
120
|
# database and tries to return a new value which does not belong to it.
|
102
121
|
#
|
103
|
-
def new_value_for_scope(scope)
|
104
|
-
new_scope = (@existing.send(scope) || 999).next.to_s
|
105
|
-
|
106
|
-
# Generate a range of values to search in the database
|
107
|
-
values = 100.times.inject([new_scope]) {|v,i| v << v.last.next }
|
108
|
-
conditions = { scope => values, @attribute => @value }
|
109
|
-
|
110
|
-
# Get values from the database, get the scope attribute and map them to string.
|
111
|
-
db_values = subject_class.find(:all, :conditions => conditions, :select => scope)
|
112
|
-
db_values.map!{ |r| r.send(scope).to_s }
|
113
|
-
|
114
|
-
if value_to_return = (values - db_values).first
|
115
|
-
value_to_return
|
116
|
-
else
|
117
|
-
raise ScriptError, "Tried to find an unique scope value for #{scope} but I could not. " <<
|
118
|
-
"The conditions hash was #{conditions.inspect} and it returned all records."
|
119
|
-
end
|
122
|
+
def new_value_for_scope(scope)
|
123
|
+
new_scope = (@existing.send(scope) || 999).next.to_s
|
124
|
+
|
125
|
+
# Generate a range of values to search in the database
|
126
|
+
values = 100.times.inject([new_scope]) {|v,i| v << v.last.next }
|
127
|
+
conditions = { scope => values, @attribute => @value }
|
128
|
+
|
129
|
+
# Get values from the database, get the scope attribute and map them to string.
|
130
|
+
db_values = subject_class.find(:all, :conditions => conditions, :select => scope)
|
131
|
+
db_values.map!{ |r| r.send(scope).to_s }
|
132
|
+
|
133
|
+
if value_to_return = (values - db_values).first
|
134
|
+
value_to_return
|
135
|
+
else
|
136
|
+
raise ScriptError, "Tried to find an unique scope value for #{scope} but I could not. " <<
|
137
|
+
"The conditions hash was #{conditions.inspect} and it returned all records."
|
138
|
+
end
|
120
139
|
end
|
121
140
|
end
|
122
141
|
|
@@ -124,7 +143,7 @@ module Remarkable
|
|
124
143
|
# is not unique.
|
125
144
|
#
|
126
145
|
# Requires an existing record in the database. If you supply :allow_nil as
|
127
|
-
# option, you need to have in the database a record which is not nil in the
|
146
|
+
# option, you need to have in the database a record which is not nil in the
|
128
147
|
# given attributes. The same is required for allow_blank option.
|
129
148
|
#
|
130
149
|
# == Options
|
data/locale/en.yml
CHANGED
@@ -1,253 +1,253 @@
|
|
1
|
-
en:
|
2
|
-
remarkable:
|
3
|
-
active_record:
|
4
|
-
allow_nil: "{{subject_name}} to {{not}}allow nil values for {{attribute}}"
|
5
|
-
allow_blank: "{{subject_name}} to {{not}}allow blank values for {{attribute}}"
|
6
|
-
|
7
|
-
allow_values_for:
|
8
|
-
description: "allow {{in}} as values for {{attributes}}"
|
9
|
-
expectations:
|
10
|
-
is_valid: "{{subject_name}} to be valid when {{attribute}} is set to {{value}}"
|
11
|
-
optionals:
|
12
|
-
allow_nil:
|
13
|
-
positive: "allowing nil values"
|
14
|
-
negative: "not allowing nil values"
|
15
|
-
allow_blank:
|
16
|
-
positive: "allowing blank values"
|
17
|
-
negative: "not allowing blank values"
|
18
|
-
|
19
|
-
allow_mass_assignment_of:
|
20
|
-
description: "allow mass assignment of {{attributes}}"
|
21
|
-
expectations:
|
22
|
-
is_protected: "{{subject_name}} to allow mass assignment of {{attribute}} ({{subject_name}} is protecting {{attribute}})"
|
23
|
-
is_accessible: "{{subject_name}} to allow mass assignment of {{attribute}} ({{subject_name}} has not made {{attribute}} accessible)"
|
24
|
-
|
25
|
-
association:
|
26
|
-
belongs_to: belong to
|
27
|
-
has_many: have many
|
28
|
-
has_and_belongs_to_many: have and belong to many
|
29
|
-
has_one: have one
|
30
|
-
description: "{{macro}} {{associations}}"
|
31
|
-
expectations:
|
32
|
-
association_exists: "{{subject_name}} records {{macro}} {{association}}, got no association"
|
33
|
-
macro_matches: "{{subject_name}} records {{macro}} {{association}}, got {{subject_name}} records {{actual_macro}} {{association}}"
|
34
|
-
through_exists: "{{subject_name}} records {{macro}} {{association}} through {{through}}, through association does not exist"
|
35
|
-
join_table_exists: "join table {{actual_join_table}} to exist, but does not"
|
36
|
-
foreign_key_exists: "foreign key {{actual_foreign_key}} to exist on {{foreign_key_table}}, but does not"
|
37
|
-
polymorphic_exists: "{{subject_table}} to have {{polymorphic_column}} as column, but does not"
|
38
|
-
counter_cache_exists: "{{reflection_table}} to have {{counter_cache_column}} as column, but does not"
|
39
|
-
through_matches: "{{association}} association through {{through}}, got {{actual_through}}"
|
40
|
-
class_name_matches: "{{association}} association with class name {{class_name}}, got {{actual_class_name}}"
|
41
|
-
foreign_key_matches: "{{association}} association with foreign key {{foreign_key}}, got {{actual_foreign_key}}"
|
42
|
-
dependent_matches: "{{association}} association with dependent {{dependent}}, got {{actual_dependent}}"
|
43
|
-
join_table_matches: "{{association}} association with join table {{join_table}}, got {{actual_join_table}}"
|
44
|
-
uniq_matches: "{{association}} association with uniq equals to {{uniq}}, got {{actual_uniq}}"
|
45
|
-
readonly_matches: "{{association}} association with readonly equals to {{readonly}}, got {{actual_readonly}}"
|
46
|
-
validate_matches: "{{association}} association with validate equals to {{validate}}, got {{actual_validate}}"
|
47
|
-
autosave_matches: "{{association}} association with autosave equals to {{autosave}}, got {{actual_autosave}}"
|
48
|
-
polymorphic_matches: "{{association}} association with polymorphic equals to {{polymorphic}}, got {{actual_polymorphic}}"
|
49
|
-
as_matches: "{{association}} association with polymorphic interface {{as}}, got {{actual_as}}"
|
50
|
-
counter_cache_matches: "{{association}} association with counter cache {{counter_cache}}, got {{actual_counter_cache}}"
|
51
|
-
optionals:
|
52
|
-
through:
|
53
|
-
positive: "through {{value}}"
|
54
|
-
class_name:
|
55
|
-
positive: "with class name {{inspect}}"
|
56
|
-
foreign_key:
|
57
|
-
positive: "with foreign key {{inspect}}"
|
58
|
-
dependent:
|
59
|
-
positive: "with dependent {{inspect}}"
|
60
|
-
join_table:
|
61
|
-
positive: "with join table {{inspect}}"
|
62
|
-
uniq:
|
63
|
-
positive: "with unique records"
|
64
|
-
negative: "without unique records"
|
65
|
-
readonly:
|
66
|
-
positive: "with readonly records"
|
67
|
-
negative: "without readonly records"
|
68
|
-
validate:
|
69
|
-
positive: "validating associated records"
|
70
|
-
negative: "not validating associated records"
|
71
|
-
autosave:
|
72
|
-
positive: "autosaving associated records"
|
73
|
-
negative: "not autosaving associated records"
|
74
|
-
polymorphic:
|
75
|
-
positive: "through a polymorphic interface"
|
76
|
-
as:
|
77
|
-
positive: "through the polymorphic interface {{inspect}}"
|
78
|
-
counter_cache:
|
79
|
-
positive: "with counter cache {{inspect}}"
|
80
|
-
negative: "without counter cache"
|
81
|
-
|
82
|
-
have_column:
|
83
|
-
description: "have column(s) named {{columns}}"
|
84
|
-
expectations:
|
85
|
-
column_exists: "{{subject_name}} to have column named {{column}}"
|
86
|
-
options_match: "{{subject_name}} to have column {{column}} with options {{options}}, got {{actual}}"
|
87
|
-
optionals:
|
88
|
-
type:
|
89
|
-
positive: "with type {{inspect}}"
|
90
|
-
null:
|
91
|
-
positive: "allowing null values"
|
92
|
-
negative: "not allowing null values"
|
93
|
-
default:
|
94
|
-
positive: "with default {{inspect}}"
|
95
|
-
negative: "with default {{inspect}}"
|
96
|
-
limit:
|
97
|
-
positive: "with limit {{inspect}}"
|
98
|
-
|
99
|
-
have_index:
|
100
|
-
description: "have index for column(s) {{columns}}"
|
101
|
-
expectations:
|
102
|
-
index_exists: "index {{column}} to exist on table {{table_name}}"
|
103
|
-
is_unique: "index on {{column}} with unique equals to {{unique}}, got {{actual}}"
|
104
|
-
optionals:
|
105
|
-
unique:
|
106
|
-
positive: "with unique values"
|
107
|
-
negative: "with non unique values"
|
108
|
-
|
109
|
-
have_readonly_attributes:
|
110
|
-
description: "make {{attributes}} read-only"
|
111
|
-
expectations:
|
112
|
-
is_readonly: "{{subject_name}} to make {{attribute}} read-only, got {{actual}}"
|
113
|
-
|
114
|
-
have_scope:
|
115
|
-
description: "have to scope itself to {{options}} when {{scope_name}} is called"
|
116
|
-
expectations:
|
117
|
-
is_scope: "{{scope_name}} when called on {{subject_name}} return a ActiveRecord::NamedScope::Scope object"
|
118
|
-
options_match: "{{scope_name}} when called on {{subject_name}} scope to {{options}}, got {{actual}}"
|
119
|
-
optionals:
|
120
|
-
with:
|
121
|
-
positive: "with {{inspect}} as argument"
|
122
|
-
|
123
|
-
validate_acceptance_of:
|
124
|
-
description: "require {{attributes}} to be accepted"
|
125
|
-
expectations:
|
126
|
-
requires_acceptance: "{{subject_name}} to be invalid if {{attribute}} is not accepted"
|
127
|
-
accept_is_valid: "{{subject_name}} to be valid when {{attribute}} is accepted with value {{accept}}"
|
128
|
-
optionals:
|
129
|
-
accept:
|
130
|
-
positive: "with value {{inspect}}"
|
131
|
-
allow_nil:
|
132
|
-
positive: "allowing nil values"
|
133
|
-
negative: "not allowing nil values"
|
134
|
-
|
135
|
-
validate_associated:
|
136
|
-
description: "require associated {{associations}} to be valid"
|
137
|
-
expectations:
|
138
|
-
is_valid: "{{subject_name}} to be invalid when {{association}} is invalid"
|
139
|
-
|
140
|
-
validate_confirmation_of:
|
141
|
-
description: "require {{attributes}} to be confirmed"
|
142
|
-
expectations:
|
143
|
-
responds_to_confirmation: "{{subject_name}} instance responds to {{attribute}}_confirmation"
|
144
|
-
confirms: "{{subject_name}} to be valid only when {{attribute}} is confirmed"
|
145
|
-
|
146
|
-
validate_exclusion_of:
|
147
|
-
description: "ensure exclusion of {{attributes}} in {{in}}"
|
148
|
-
expectations:
|
149
|
-
is_valid: "{{subject_name}} to be valid when {{attribute}} is set to {{value}}"
|
150
|
-
is_invalid: "{{subject_name}} to be invalid when {{attribute}} is set to {{value}}"
|
151
|
-
optionals:
|
152
|
-
allow_nil:
|
153
|
-
positive: "allowing nil values"
|
154
|
-
negative: "not allowing nil values"
|
155
|
-
allow_blank:
|
156
|
-
positive: "allowing blank values"
|
157
|
-
negative: "not allowing blank values"
|
158
|
-
|
159
|
-
validate_inclusion_of:
|
160
|
-
description: "ensure inclusion of {{attributes}} in {{in}}"
|
161
|
-
expectations:
|
162
|
-
is_valid: "{{subject_name}} to be valid when {{attribute}} is set to {{value}}"
|
163
|
-
is_invalid: "{{subject_name}} to be invalid when {{attribute}} is set to {{value}}"
|
164
|
-
optionals:
|
165
|
-
allow_nil:
|
166
|
-
positive: "allowing nil values"
|
167
|
-
negative: "not allowing nil values"
|
168
|
-
allow_blank:
|
169
|
-
positive: "allowing blank values"
|
170
|
-
negative: "not allowing blank values"
|
171
|
-
|
172
|
-
validate_length_of:
|
173
|
-
description: "ensure length of {{attributes}}"
|
174
|
-
expectations:
|
175
|
-
less_than_min_length: "{{subject_name}} to be invalid when {{attribute}} length is less than {{minimum}} characters"
|
176
|
-
exactly_min_length: "{{subject_name}} to be valid when {{attribute}} length is {{minimum}} characters"
|
177
|
-
more_than_max_length: "{{subject_name}} to be invalid when {{attribute}} length is more than {{maximum}} characters"
|
178
|
-
exactly_max_length: "{{subject_name}} to be valid when {{attribute}} length is {{maximum}} characters"
|
179
|
-
optionals:
|
180
|
-
within:
|
181
|
-
positive: "is within {{inspect}} characters"
|
182
|
-
maximum:
|
183
|
-
positive: "is maximum {{inspect}} characters"
|
184
|
-
minimum:
|
185
|
-
positive: "is minimum {{inspect}} characters"
|
186
|
-
is:
|
187
|
-
positive: "is equal to {{inspect}} characters"
|
188
|
-
allow_nil:
|
189
|
-
positive: "allowing nil values"
|
190
|
-
negative: "not allowing nil values"
|
191
|
-
allow_blank:
|
192
|
-
positive: "allowing blank values"
|
193
|
-
negative: "not allowing blank values"
|
194
|
-
|
195
|
-
validate_numericality_of:
|
196
|
-
description: "ensure numericality of {{attributes}}"
|
197
|
-
expectations:
|
198
|
-
only_numeric_values: "{{subject_name}} to allow only numeric values for {{attribute}}"
|
199
|
-
only_integer: "{{subject_name}} to {{not}}allow only integer values for {{attribute}}"
|
200
|
-
only_even: "{{subject_name}} to allow only even values for {{attribute}}"
|
201
|
-
only_odd: "{{subject_name}} to allow only odd values for {{attribute}}"
|
202
|
-
equals_to: "{{subject_name}} to be valid only when {{attribute}} is equal to {{count}}"
|
203
|
-
more_than_maximum: "{{subject_name}} to be invalid when {{attribute}} is greater than {{count}}"
|
204
|
-
less_than_minimum: "{{subject_name}} to be invalid when {{attribute}} is less than {{count}}"
|
205
|
-
optionals:
|
206
|
-
only_integer:
|
207
|
-
positive: "allowing only integer values"
|
208
|
-
odd:
|
209
|
-
positive: "allowing only odd values"
|
210
|
-
even:
|
211
|
-
positive: "allowing only even values"
|
212
|
-
equal_to:
|
213
|
-
positive: "is equal to {{inspect}}"
|
214
|
-
less_than:
|
215
|
-
positive: "is less than {{inspect}}"
|
216
|
-
greater_than:
|
217
|
-
positive: "is greater than {{inspect}}"
|
218
|
-
less_than_or_equal_to:
|
219
|
-
positive: "is less than or equal to {{inspect}}"
|
220
|
-
greater_than_or_equal_to:
|
221
|
-
positive: "is greater than or equal to {{inspect}}"
|
222
|
-
allow_nil:
|
223
|
-
positive: "allowing nil values"
|
224
|
-
negative: "not allowing nil values"
|
225
|
-
allow_blank:
|
226
|
-
positive: "allowing blank values"
|
227
|
-
negative: "not allowing blank values"
|
228
|
-
|
229
|
-
validate_presence_of:
|
230
|
-
description: "require {{attributes}} to be set"
|
231
|
-
expectations:
|
232
|
-
allow_nil: "{{subject_name}} to require {{attribute}} to be set"
|
233
|
-
|
234
|
-
validate_uniqueness_of:
|
235
|
-
description: "require unique values for {{attributes}}"
|
236
|
-
expectations:
|
237
|
-
responds_to_scope: "{{subject_name}} instance responds to {{method}}"
|
238
|
-
is_unique: "{{subject_name}} to require unique values for {{attribute}}"
|
239
|
-
case_sensitive: "{{subject_name}} to {{not}}be case sensitive on {{attribute}} validation"
|
240
|
-
valid_with_new_scope: "{{subject_name}} to be valid when {{attribute}} scope ({{method}}) change"
|
241
|
-
optionals:
|
242
|
-
scope:
|
243
|
-
positive: "scoped to {{inspect}}"
|
244
|
-
case_sensitive:
|
245
|
-
positive: "case sensitive"
|
246
|
-
negative: "case insensitive"
|
247
|
-
allow_nil:
|
248
|
-
positive: "allowing nil values"
|
249
|
-
negative: "not allowing nil values"
|
250
|
-
allow_blank:
|
251
|
-
positive: "allowing blank values"
|
252
|
-
negative: "not allowing blank values"
|
253
|
-
|
1
|
+
en:
|
2
|
+
remarkable:
|
3
|
+
active_record:
|
4
|
+
allow_nil: "{{subject_name}} to {{not}}allow nil values for {{attribute}}"
|
5
|
+
allow_blank: "{{subject_name}} to {{not}}allow blank values for {{attribute}}"
|
6
|
+
|
7
|
+
allow_values_for:
|
8
|
+
description: "allow {{in}} as values for {{attributes}}"
|
9
|
+
expectations:
|
10
|
+
is_valid: "{{subject_name}} to be valid when {{attribute}} is set to {{value}}"
|
11
|
+
optionals:
|
12
|
+
allow_nil:
|
13
|
+
positive: "allowing nil values"
|
14
|
+
negative: "not allowing nil values"
|
15
|
+
allow_blank:
|
16
|
+
positive: "allowing blank values"
|
17
|
+
negative: "not allowing blank values"
|
18
|
+
|
19
|
+
allow_mass_assignment_of:
|
20
|
+
description: "allow mass assignment of {{attributes}}"
|
21
|
+
expectations:
|
22
|
+
is_protected: "{{subject_name}} to allow mass assignment of {{attribute}} ({{subject_name}} is protecting {{attribute}})"
|
23
|
+
is_accessible: "{{subject_name}} to allow mass assignment of {{attribute}} ({{subject_name}} has not made {{attribute}} accessible)"
|
24
|
+
|
25
|
+
association:
|
26
|
+
belongs_to: belong to
|
27
|
+
has_many: have many
|
28
|
+
has_and_belongs_to_many: have and belong to many
|
29
|
+
has_one: have one
|
30
|
+
description: "{{macro}} {{associations}}"
|
31
|
+
expectations:
|
32
|
+
association_exists: "{{subject_name}} records {{macro}} {{association}}, got no association"
|
33
|
+
macro_matches: "{{subject_name}} records {{macro}} {{association}}, got {{subject_name}} records {{actual_macro}} {{association}}"
|
34
|
+
through_exists: "{{subject_name}} records {{macro}} {{association}} through {{through}}, through association does not exist"
|
35
|
+
join_table_exists: "join table {{actual_join_table}} to exist, but does not"
|
36
|
+
foreign_key_exists: "foreign key {{actual_foreign_key}} to exist on {{foreign_key_table}}, but does not"
|
37
|
+
polymorphic_exists: "{{subject_table}} to have {{polymorphic_column}} as column, but does not"
|
38
|
+
counter_cache_exists: "{{reflection_table}} to have {{counter_cache_column}} as column, but does not"
|
39
|
+
through_matches: "{{association}} association through {{through}}, got {{actual_through}}"
|
40
|
+
class_name_matches: "{{association}} association with class name {{class_name}}, got {{actual_class_name}}"
|
41
|
+
foreign_key_matches: "{{association}} association with foreign key {{foreign_key}}, got {{actual_foreign_key}}"
|
42
|
+
dependent_matches: "{{association}} association with dependent {{dependent}}, got {{actual_dependent}}"
|
43
|
+
join_table_matches: "{{association}} association with join table {{join_table}}, got {{actual_join_table}}"
|
44
|
+
uniq_matches: "{{association}} association with uniq equals to {{uniq}}, got {{actual_uniq}}"
|
45
|
+
readonly_matches: "{{association}} association with readonly equals to {{readonly}}, got {{actual_readonly}}"
|
46
|
+
validate_matches: "{{association}} association with validate equals to {{validate}}, got {{actual_validate}}"
|
47
|
+
autosave_matches: "{{association}} association with autosave equals to {{autosave}}, got {{actual_autosave}}"
|
48
|
+
polymorphic_matches: "{{association}} association with polymorphic equals to {{polymorphic}}, got {{actual_polymorphic}}"
|
49
|
+
as_matches: "{{association}} association with polymorphic interface {{as}}, got {{actual_as}}"
|
50
|
+
counter_cache_matches: "{{association}} association with counter cache {{counter_cache}}, got {{actual_counter_cache}}"
|
51
|
+
optionals:
|
52
|
+
through:
|
53
|
+
positive: "through {{value}}"
|
54
|
+
class_name:
|
55
|
+
positive: "with class name {{inspect}}"
|
56
|
+
foreign_key:
|
57
|
+
positive: "with foreign key {{inspect}}"
|
58
|
+
dependent:
|
59
|
+
positive: "with dependent {{inspect}}"
|
60
|
+
join_table:
|
61
|
+
positive: "with join table {{inspect}}"
|
62
|
+
uniq:
|
63
|
+
positive: "with unique records"
|
64
|
+
negative: "without unique records"
|
65
|
+
readonly:
|
66
|
+
positive: "with readonly records"
|
67
|
+
negative: "without readonly records"
|
68
|
+
validate:
|
69
|
+
positive: "validating associated records"
|
70
|
+
negative: "not validating associated records"
|
71
|
+
autosave:
|
72
|
+
positive: "autosaving associated records"
|
73
|
+
negative: "not autosaving associated records"
|
74
|
+
polymorphic:
|
75
|
+
positive: "through a polymorphic interface"
|
76
|
+
as:
|
77
|
+
positive: "through the polymorphic interface {{inspect}}"
|
78
|
+
counter_cache:
|
79
|
+
positive: "with counter cache {{inspect}}"
|
80
|
+
negative: "without counter cache"
|
81
|
+
|
82
|
+
have_column:
|
83
|
+
description: "have column(s) named {{columns}}"
|
84
|
+
expectations:
|
85
|
+
column_exists: "{{subject_name}} to have column named {{column}}"
|
86
|
+
options_match: "{{subject_name}} to have column {{column}} with options {{options}}, got {{actual}}"
|
87
|
+
optionals:
|
88
|
+
type:
|
89
|
+
positive: "with type {{inspect}}"
|
90
|
+
null:
|
91
|
+
positive: "allowing null values"
|
92
|
+
negative: "not allowing null values"
|
93
|
+
default:
|
94
|
+
positive: "with default {{inspect}}"
|
95
|
+
negative: "with default {{inspect}}"
|
96
|
+
limit:
|
97
|
+
positive: "with limit {{inspect}}"
|
98
|
+
|
99
|
+
have_index:
|
100
|
+
description: "have index for column(s) {{columns}}"
|
101
|
+
expectations:
|
102
|
+
index_exists: "index {{column}} to exist on table {{table_name}}"
|
103
|
+
is_unique: "index on {{column}} with unique equals to {{unique}}, got {{actual}}"
|
104
|
+
optionals:
|
105
|
+
unique:
|
106
|
+
positive: "with unique values"
|
107
|
+
negative: "with non unique values"
|
108
|
+
|
109
|
+
have_readonly_attributes:
|
110
|
+
description: "make {{attributes}} read-only"
|
111
|
+
expectations:
|
112
|
+
is_readonly: "{{subject_name}} to make {{attribute}} read-only, got {{actual}}"
|
113
|
+
|
114
|
+
have_scope:
|
115
|
+
description: "have to scope itself to {{options}} when {{scope_name}} is called"
|
116
|
+
expectations:
|
117
|
+
is_scope: "{{scope_name}} when called on {{subject_name}} return a ActiveRecord::NamedScope::Scope object"
|
118
|
+
options_match: "{{scope_name}} when called on {{subject_name}} scope to {{options}}, got {{actual}}"
|
119
|
+
optionals:
|
120
|
+
with:
|
121
|
+
positive: "with {{inspect}} as argument"
|
122
|
+
|
123
|
+
validate_acceptance_of:
|
124
|
+
description: "require {{attributes}} to be accepted"
|
125
|
+
expectations:
|
126
|
+
requires_acceptance: "{{subject_name}} to be invalid if {{attribute}} is not accepted"
|
127
|
+
accept_is_valid: "{{subject_name}} to be valid when {{attribute}} is accepted with value {{accept}}"
|
128
|
+
optionals:
|
129
|
+
accept:
|
130
|
+
positive: "with value {{inspect}}"
|
131
|
+
allow_nil:
|
132
|
+
positive: "allowing nil values"
|
133
|
+
negative: "not allowing nil values"
|
134
|
+
|
135
|
+
validate_associated:
|
136
|
+
description: "require associated {{associations}} to be valid"
|
137
|
+
expectations:
|
138
|
+
is_valid: "{{subject_name}} to be invalid when {{association}} is invalid"
|
139
|
+
|
140
|
+
validate_confirmation_of:
|
141
|
+
description: "require {{attributes}} to be confirmed"
|
142
|
+
expectations:
|
143
|
+
responds_to_confirmation: "{{subject_name}} instance responds to {{attribute}}_confirmation"
|
144
|
+
confirms: "{{subject_name}} to be valid only when {{attribute}} is confirmed"
|
145
|
+
|
146
|
+
validate_exclusion_of:
|
147
|
+
description: "ensure exclusion of {{attributes}} in {{in}}"
|
148
|
+
expectations:
|
149
|
+
is_valid: "{{subject_name}} to be valid when {{attribute}} is set to {{value}}"
|
150
|
+
is_invalid: "{{subject_name}} to be invalid when {{attribute}} is set to {{value}}"
|
151
|
+
optionals:
|
152
|
+
allow_nil:
|
153
|
+
positive: "allowing nil values"
|
154
|
+
negative: "not allowing nil values"
|
155
|
+
allow_blank:
|
156
|
+
positive: "allowing blank values"
|
157
|
+
negative: "not allowing blank values"
|
158
|
+
|
159
|
+
validate_inclusion_of:
|
160
|
+
description: "ensure inclusion of {{attributes}} in {{in}}"
|
161
|
+
expectations:
|
162
|
+
is_valid: "{{subject_name}} to be valid when {{attribute}} is set to {{value}}"
|
163
|
+
is_invalid: "{{subject_name}} to be invalid when {{attribute}} is set to {{value}}"
|
164
|
+
optionals:
|
165
|
+
allow_nil:
|
166
|
+
positive: "allowing nil values"
|
167
|
+
negative: "not allowing nil values"
|
168
|
+
allow_blank:
|
169
|
+
positive: "allowing blank values"
|
170
|
+
negative: "not allowing blank values"
|
171
|
+
|
172
|
+
validate_length_of:
|
173
|
+
description: "ensure length of {{attributes}}"
|
174
|
+
expectations:
|
175
|
+
less_than_min_length: "{{subject_name}} to be invalid when {{attribute}} length is less than {{minimum}} characters"
|
176
|
+
exactly_min_length: "{{subject_name}} to be valid when {{attribute}} length is {{minimum}} characters"
|
177
|
+
more_than_max_length: "{{subject_name}} to be invalid when {{attribute}} length is more than {{maximum}} characters"
|
178
|
+
exactly_max_length: "{{subject_name}} to be valid when {{attribute}} length is {{maximum}} characters"
|
179
|
+
optionals:
|
180
|
+
within:
|
181
|
+
positive: "is within {{inspect}} characters"
|
182
|
+
maximum:
|
183
|
+
positive: "is maximum {{inspect}} characters"
|
184
|
+
minimum:
|
185
|
+
positive: "is minimum {{inspect}} characters"
|
186
|
+
is:
|
187
|
+
positive: "is equal to {{inspect}} characters"
|
188
|
+
allow_nil:
|
189
|
+
positive: "allowing nil values"
|
190
|
+
negative: "not allowing nil values"
|
191
|
+
allow_blank:
|
192
|
+
positive: "allowing blank values"
|
193
|
+
negative: "not allowing blank values"
|
194
|
+
|
195
|
+
validate_numericality_of:
|
196
|
+
description: "ensure numericality of {{attributes}}"
|
197
|
+
expectations:
|
198
|
+
only_numeric_values: "{{subject_name}} to allow only numeric values for {{attribute}}"
|
199
|
+
only_integer: "{{subject_name}} to {{not}}allow only integer values for {{attribute}}"
|
200
|
+
only_even: "{{subject_name}} to allow only even values for {{attribute}}"
|
201
|
+
only_odd: "{{subject_name}} to allow only odd values for {{attribute}}"
|
202
|
+
equals_to: "{{subject_name}} to be valid only when {{attribute}} is equal to {{count}}"
|
203
|
+
more_than_maximum: "{{subject_name}} to be invalid when {{attribute}} is greater than {{count}}"
|
204
|
+
less_than_minimum: "{{subject_name}} to be invalid when {{attribute}} is less than {{count}}"
|
205
|
+
optionals:
|
206
|
+
only_integer:
|
207
|
+
positive: "allowing only integer values"
|
208
|
+
odd:
|
209
|
+
positive: "allowing only odd values"
|
210
|
+
even:
|
211
|
+
positive: "allowing only even values"
|
212
|
+
equal_to:
|
213
|
+
positive: "is equal to {{inspect}}"
|
214
|
+
less_than:
|
215
|
+
positive: "is less than {{inspect}}"
|
216
|
+
greater_than:
|
217
|
+
positive: "is greater than {{inspect}}"
|
218
|
+
less_than_or_equal_to:
|
219
|
+
positive: "is less than or equal to {{inspect}}"
|
220
|
+
greater_than_or_equal_to:
|
221
|
+
positive: "is greater than or equal to {{inspect}}"
|
222
|
+
allow_nil:
|
223
|
+
positive: "allowing nil values"
|
224
|
+
negative: "not allowing nil values"
|
225
|
+
allow_blank:
|
226
|
+
positive: "allowing blank values"
|
227
|
+
negative: "not allowing blank values"
|
228
|
+
|
229
|
+
validate_presence_of:
|
230
|
+
description: "require {{attributes}} to be set"
|
231
|
+
expectations:
|
232
|
+
allow_nil: "{{subject_name}} to require {{attribute}} to be set"
|
233
|
+
|
234
|
+
validate_uniqueness_of:
|
235
|
+
description: "require unique values for {{attributes}}"
|
236
|
+
expectations:
|
237
|
+
responds_to_scope: "{{subject_name}} instance responds to {{method}}"
|
238
|
+
is_unique: "{{subject_name}} to require unique values for {{attribute}}"
|
239
|
+
case_sensitive: "{{subject_name}} to {{not}}be case sensitive on {{attribute}} validation"
|
240
|
+
valid_with_new_scope: "{{subject_name}} to be valid when {{attribute}} scope ({{method}}) change"
|
241
|
+
optionals:
|
242
|
+
scope:
|
243
|
+
positive: "scoped to {{inspect}}"
|
244
|
+
case_sensitive:
|
245
|
+
positive: "case sensitive"
|
246
|
+
negative: "case insensitive"
|
247
|
+
allow_nil:
|
248
|
+
positive: "allowing nil values"
|
249
|
+
negative: "not allowing nil values"
|
250
|
+
allow_blank:
|
251
|
+
positive: "allowing blank values"
|
252
|
+
negative: "not allowing blank values"
|
253
|
+
|