validates_timeliness 3.0.0.beta.4 → 3.0.0.beta.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -1
- data/README.rdoc +16 -13
- data/Rakefile +1 -0
- data/lib/generators/validates_timeliness/templates/validates_timeliness.rb +7 -4
- data/lib/validates_timeliness.rb +23 -19
- data/lib/validates_timeliness/attribute_methods.rb +1 -1
- data/lib/validates_timeliness/conversion.rb +4 -4
- data/lib/validates_timeliness/orm/mongoid.rb +1 -1
- data/lib/validates_timeliness/railtie.rb +14 -0
- data/lib/validates_timeliness/validator.rb +9 -4
- data/lib/validates_timeliness/version.rb +1 -1
- data/spec/validates_timeliness/attribute_methods_spec.rb +3 -3
- data/spec/validates_timeliness/conversion_spec.rb +4 -4
- data/spec/validates_timeliness/helper_methods_spec.rb +3 -3
- data/spec/validates_timeliness/orm/active_record_spec.rb +5 -5
- data/spec/validates_timeliness/orm/mongoid_spec.rb +14 -6
- data/spec/validates_timeliness/validator_spec.rb +5 -2
- data/validates_timeliness.gemspec +6 -3
- metadata +22 -8
- data/lib/validates_timeliness/parser.rb +0 -404
- data/spec/validates_timeliness/parser_spec.rb +0 -331
data/CHANGELOG
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
- Rails 3 and ActiveModel compatibility
|
3
3
|
- Uses ActiveModel::EachValidator as validator base class.
|
4
4
|
- Configuration settings stored in ValidatesTimeliness module only. ValidatesTimeliness.setup block to configure.
|
5
|
-
-
|
5
|
+
- Parser extracted to the Timeliness gem http://github.com/adzap/timeliness
|
6
|
+
- Parser is disabled by default. See initializer for enabling it.
|
7
|
+
- Removed RSpec matcher. Encouraged poor specs by copy-pasting from spec to model, or worse, the other way round.
|
6
8
|
- Method override for parsing and before type cast values is on validated attributes only. Old version handled all date/datetime columns, validates or not. Too intrusive.
|
7
9
|
- Add validation helpers to classes using extend_orms config setting. e.g. conf.extend_orms = [ :active_record ]
|
8
10
|
- Changed :between option so it is split into :on_or_after and :on_or_before option values. The error message for either failing check will be used instead of a between error message.
|
data/README.rdoc
CHANGED
@@ -14,11 +14,13 @@ If you a looking for the old version for Rails 2.x go here[http://github.com/adz
|
|
14
14
|
|
15
15
|
* Adds validation for dates, times and datetimes to ActiveModel
|
16
16
|
|
17
|
-
*
|
17
|
+
* Handles timezones and type casting of values for you
|
18
|
+
|
19
|
+
* Only Rails date/time validation plugin offering complete validation (See ORM/ODM support)
|
18
20
|
|
19
|
-
*
|
21
|
+
* Adds extensions to fix Rails date/time select issues
|
20
22
|
|
21
|
-
*
|
23
|
+
* Uses extensible date/time parser ({timeliness gem}[http://github.com/adzap/timeliness])
|
22
24
|
|
23
25
|
* Supports I18n for the error messages
|
24
26
|
|
@@ -32,7 +34,7 @@ As plugin (from master)
|
|
32
34
|
As gem (in beta)
|
33
35
|
|
34
36
|
# in Gemfile
|
35
|
-
gem 'validates_timeliness', '>= 3.0.
|
37
|
+
gem 'validates_timeliness', '>= 3.0.5.beta'
|
36
38
|
|
37
39
|
# Run bundler
|
38
40
|
$ bundle install
|
@@ -69,14 +71,14 @@ To validate a model with a date, time or datetime attribute you just use the
|
|
69
71
|
validation method
|
70
72
|
|
71
73
|
class Person < ActiveRecord::Base
|
72
|
-
validates_date :date_of_birth, :on_or_before => lambda { Date.
|
74
|
+
validates_date :date_of_birth, :on_or_before => lambda { Date.current }
|
73
75
|
# or
|
74
|
-
validates :date_of_birth, :timeliness => {:on_or_before => lambda { Date.
|
76
|
+
validates :date_of_birth, :timeliness => {:on_or_before => lambda { Date.current }, :type => :date}
|
75
77
|
end
|
76
78
|
|
77
79
|
# or even on a specific record, per ActiveModel API.
|
78
80
|
|
79
|
-
@person.validates_date :date_of_birth, :on_or_before => lambda { Date.
|
81
|
+
@person.validates_date :date_of_birth, :on_or_before => lambda { Date.current }
|
80
82
|
|
81
83
|
|
82
84
|
The list of validation methods available are as follows:
|
@@ -180,22 +182,23 @@ It is highly recommended you use the I18n system for error messages.
|
|
180
182
|
|
181
183
|
=== Plugin Parser
|
182
184
|
|
183
|
-
The
|
184
|
-
for dates, times, and datetimes. It is also more strict than the
|
185
|
-
won't accept day of the month if it's not a valid number for
|
185
|
+
The uses the {timeliness gem}[http://github.com/adzap/timeliness] as a fast, configurable and extensible date and time parser.
|
186
|
+
You can add or remove valid formats for dates, times, and datetimes. It is also more strict than the
|
187
|
+
Ruby parser, which means it won't accept day of the month if it's not a valid number for the month.
|
186
188
|
|
187
|
-
By default the parser is
|
189
|
+
By default the parser is disabled. To enable it:
|
188
190
|
|
189
191
|
# in the setup block
|
190
192
|
config.use_plugin_parser = true
|
191
193
|
|
192
|
-
|
194
|
+
Enabling the parser will mean that strings assigned to attributes validated with the plugin will be parsed
|
195
|
+
using the gem. See the wiki[http://github.com/adzap/validates_timeliness/wiki/Plugin-Parser] for more details about the parser configuration.
|
193
196
|
|
194
197
|
|
195
198
|
=== Restriction Shorthand
|
196
199
|
|
197
200
|
It is common to restrict an attribute to being on or before the current time or current day.
|
198
|
-
To specify this you need to use a lambda as an option value e.g. <tt>lambda { Time.
|
201
|
+
To specify this you need to use a lambda as an option value e.g. <tt>lambda { Time.current }</tt>.
|
199
202
|
This can be tedious noise amongst your validations for something so common. To combat this the
|
200
203
|
plugin allows you to use shorthand symbols for often used relative times or dates.
|
201
204
|
|
data/Rakefile
CHANGED
@@ -22,6 +22,7 @@ spec = Gem::Specification.new do |s|
|
|
22
22
|
s.homepage = "http://github.com/adzap/validates_timeliness"
|
23
23
|
s.require_path = 'lib'
|
24
24
|
s.files = %w(validates_timeliness.gemspec LICENSE CHANGELOG README.rdoc Rakefile) + Dir.glob("{lib,spec}/**/*")
|
25
|
+
s.add_runtime_dependency 'timeliness', '~> 0.1.1'
|
25
26
|
end
|
26
27
|
|
27
28
|
desc 'Default: run specs.'
|
@@ -2,8 +2,8 @@ ValidatesTimeliness.setup do |config|
|
|
2
2
|
# Extend ORM/ODMs for full support (:active_record, :mongoid).
|
3
3
|
# config.extend_orms = [ :active_record ]
|
4
4
|
#
|
5
|
-
#
|
6
|
-
# config.
|
5
|
+
# Default timezone
|
6
|
+
# config.default_timezone = :utc
|
7
7
|
#
|
8
8
|
# Set the dummy date part for a time type values.
|
9
9
|
# config.dummy_date_for_time_type = [ 2000, 1, 1 ]
|
@@ -19,10 +19,13 @@ ValidatesTimeliness.setup do |config|
|
|
19
19
|
#
|
20
20
|
# Shorthand date and time symbols for restrictions
|
21
21
|
# config.restriction_shorthand_symbols.update(
|
22
|
-
# :now => lambda { Time.
|
23
|
-
# :today => lambda { Date.
|
22
|
+
# :now => lambda { Time.current },
|
23
|
+
# :today => lambda { Date.current }
|
24
24
|
# )
|
25
25
|
#
|
26
|
+
# Use the plugin date/time parser which is stricter and extendable
|
27
|
+
# config.use_plugin_parser = false
|
28
|
+
#
|
26
29
|
# Add one or more formats making them valid. e.g. add_formats(:date, 'd(st|rd|th) of mmm, yyyy')
|
27
30
|
# config.parser.add_formats()
|
28
31
|
#
|
data/lib/validates_timeliness.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'date'
|
2
|
+
require 'active_support/concern'
|
3
|
+
require 'active_support/core_ext/module'
|
2
4
|
require 'active_support/core_ext/hash/except'
|
3
5
|
require 'active_support/core_ext/string/conversions'
|
4
6
|
require 'active_support/core_ext/date/acts_like'
|
@@ -7,41 +9,42 @@ require 'active_support/core_ext/time/acts_like'
|
|
7
9
|
require 'active_support/core_ext/time/conversions'
|
8
10
|
require 'active_support/core_ext/date_time/acts_like'
|
9
11
|
require 'active_support/core_ext/date_time/conversions'
|
12
|
+
require 'timeliness'
|
10
13
|
|
11
14
|
module ValidatesTimeliness
|
12
|
-
autoload :Parser, 'validates_timeliness/parser'
|
13
15
|
autoload :VERSION, 'validates_timeliness/version'
|
14
16
|
|
17
|
+
class << self
|
18
|
+
delegate :parser, :default_timezone, :default_timezone=, :dummy_date_for_time_type, :to => Timeliness
|
19
|
+
end
|
20
|
+
|
15
21
|
# Extend ORM/ODMs for full support (:active_record, :mongoid).
|
16
22
|
mattr_accessor :extend_orms
|
17
|
-
@@extend_orms = [
|
18
|
-
|
19
|
-
# User the plugin date/time parser which is stricter and extendable
|
20
|
-
mattr_accessor :use_plugin_parser
|
21
|
-
@@use_plugin_parser = false
|
22
|
-
|
23
|
-
# Default timezone
|
24
|
-
mattr_accessor :default_timezone
|
25
|
-
@@default_timezone = defined?(ActiveRecord) ? ActiveRecord::Base.default_timezone : :utc
|
26
|
-
|
27
|
-
# Set the dummy date part for a time type values.
|
28
|
-
mattr_accessor :dummy_date_for_time_type
|
29
|
-
@@dummy_date_for_time_type = [ 2000, 1, 1 ]
|
23
|
+
@@extend_orms = []
|
30
24
|
|
31
25
|
# Ignore errors when restriction options are evaluated
|
32
26
|
mattr_accessor :ignore_restriction_errors
|
33
|
-
@@ignore_restriction_errors =
|
27
|
+
@@ignore_restriction_errors = false
|
34
28
|
|
35
29
|
# Shorthand time and date symbols for restrictions
|
36
30
|
mattr_accessor :restriction_shorthand_symbols
|
37
31
|
@@restriction_shorthand_symbols = {
|
38
|
-
:now => lambda { Time.
|
39
|
-
:today => lambda { Date.
|
32
|
+
:now => lambda { Time.current },
|
33
|
+
:today => lambda { Date.current }
|
40
34
|
}
|
41
35
|
|
42
|
-
|
43
|
-
|
36
|
+
# Use the plugin date/time parser which is stricter and extensible
|
37
|
+
mattr_accessor :use_plugin_parser
|
38
|
+
@@use_plugin_parser = false
|
39
|
+
|
40
|
+
# Default timezone
|
41
|
+
self.default_timezone = :utc
|
42
|
+
|
43
|
+
# Set the dummy date part for a time type values.
|
44
|
+
def self.dummy_date_for_time_type=(array)
|
45
|
+
Timeliness.date_for_time_type = array
|
44
46
|
end
|
47
|
+
self.dummy_date_for_time_type = [ 2000, 1, 1 ]
|
45
48
|
|
46
49
|
# Setup method for plugin configuration
|
47
50
|
def self.setup
|
@@ -55,3 +58,4 @@ require 'validates_timeliness/validator'
|
|
55
58
|
require 'validates_timeliness/helper_methods'
|
56
59
|
require 'validates_timeliness/attribute_methods'
|
57
60
|
require 'validates_timeliness/extensions'
|
61
|
+
require 'validates_timeliness/railtie' if defined?(Rails)
|
@@ -38,7 +38,7 @@ module ValidatesTimeliness
|
|
38
38
|
def #{attr_name}=(value)
|
39
39
|
@timeliness_cache ||= {}
|
40
40
|
@timeliness_cache["#{attr_name}"] = value
|
41
|
-
#{ "value =
|
41
|
+
#{ "value = Timeliness::Parser.parse(value, :#{type}, :zone => (:current if #{timezone_aware})) if value.is_a?(String)" if ValidatesTimeliness.use_plugin_parser }
|
42
42
|
super
|
43
43
|
end
|
44
44
|
EOV
|
@@ -11,10 +11,10 @@ module ValidatesTimeliness
|
|
11
11
|
when :date
|
12
12
|
value.to_date
|
13
13
|
when :datetime
|
14
|
-
value.to_time
|
14
|
+
value.is_a?(Time) ? value : value.to_time
|
15
15
|
end
|
16
16
|
if options[:ignore_usec] && value.is_a?(Time)
|
17
|
-
|
17
|
+
Timeliness::Parser.make_time(Array(value).reverse[4..9], (:current if @timezone_aware))
|
18
18
|
else
|
19
19
|
value
|
20
20
|
end
|
@@ -28,7 +28,7 @@ module ValidatesTimeliness
|
|
28
28
|
[0,0,0]
|
29
29
|
end
|
30
30
|
values = ValidatesTimeliness.dummy_date_for_time_type + time
|
31
|
-
|
31
|
+
Timeliness::Parser.make_time(values, (:current if @timezone_aware))
|
32
32
|
end
|
33
33
|
|
34
34
|
def evaluate_option_value(value, record)
|
@@ -57,7 +57,7 @@ module ValidatesTimeliness
|
|
57
57
|
|
58
58
|
def parse(value)
|
59
59
|
if ValidatesTimeliness.use_plugin_parser
|
60
|
-
|
60
|
+
Timeliness::Parser.parse(value, @type, :zone => (:current if @timezone_aware), :format => options[:format], :strict => false)
|
61
61
|
else
|
62
62
|
@timezone_aware ? Time.zone.parse(value) : value.to_time(ValidatesTimeliness.default_timezone)
|
63
63
|
end
|
@@ -22,7 +22,7 @@ module ValidatesTimeliness
|
|
22
22
|
def #{attr_name}=(value)
|
23
23
|
@timeliness_cache ||= {}
|
24
24
|
@timeliness_cache["#{attr_name}"] = value
|
25
|
-
#{ "value =
|
25
|
+
#{ "value = Timeliness::Parser.parse(value, :#{type}) if value.is_a?(String)" if ValidatesTimeliness.use_plugin_parser }
|
26
26
|
write_attribute(:#{attr_name}, value)
|
27
27
|
end
|
28
28
|
EOV
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ValidatesTimeliness
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
initializer "validates_timeliness.initialize_active_record", :after => 'active_record.initialize_timezone' do
|
4
|
+
ActiveSupport.on_load(:active_record) do
|
5
|
+
ValidatesTimeliness.default_timezone = ActiveRecord::Base.default_timezone
|
6
|
+
ValidatesTimeliness.extend_orms = [ :active_record ]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
initializer "validates_timeliness.initialize_restriction_errors" do
|
11
|
+
ValidatesTimeliness.ignore_restriction_errors = !Rails.env.test?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -44,23 +44,28 @@ module ValidatesTimeliness
|
|
44
44
|
value = parse(raw_value) if value.is_a?(String) || options[:format]
|
45
45
|
value = type_cast_value(value, @type)
|
46
46
|
|
47
|
-
return record
|
47
|
+
return add_error(record, attr_name, :"invalid_#{@type}") if value.blank?
|
48
48
|
|
49
49
|
@restrictions_to_check.each do |restriction|
|
50
50
|
begin
|
51
51
|
restriction_value = type_cast_value(evaluate_option_value(options[restriction], record), @type)
|
52
|
-
|
53
52
|
unless value.send(RESTRICTIONS[restriction], restriction_value)
|
54
|
-
return record
|
53
|
+
return add_error(record, attr_name, restriction, restriction_value)
|
55
54
|
end
|
56
55
|
rescue => e
|
57
56
|
unless ValidatesTimeliness.ignore_restriction_errors
|
58
|
-
record
|
57
|
+
add_error(record, attr_name, "Error occurred validating #{attr_name} for #{restriction.inspect} restriction:\n#{e.message}")
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
63
|
+
def add_error(record, attr_name, message, value=nil)
|
64
|
+
value = format_error_value(value) if value
|
65
|
+
message_options = { :message => options[:"#{message}_message"], :restriction => value }
|
66
|
+
record.errors.add(attr_name, message, message_options)
|
67
|
+
end
|
68
|
+
|
64
69
|
def format_error_value(value)
|
65
70
|
format = I18n.t(@type, :default => DEFAULT_ERROR_VALUE_FORMATS[@type], :scope => 'validates_timeliness.error_value_formats')
|
66
71
|
value.strftime(format)
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ValidatesTimeliness::AttributeMethods do
|
4
4
|
it 'should define _timeliness_raw_value_for instance method' do
|
5
|
-
PersonWithShim.
|
5
|
+
PersonWithShim.new.should respond_to(:_timeliness_raw_value_for)
|
6
6
|
end
|
7
7
|
|
8
8
|
describe ".timeliness_validated_attributes" do
|
@@ -51,7 +51,7 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'should parse a string value' do
|
54
|
-
|
54
|
+
Timeliness::Parser.should_receive(:parse)
|
55
55
|
r = PersonWithParser.new
|
56
56
|
r.birth_date = '2010-01-01'
|
57
57
|
end
|
@@ -70,7 +70,7 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
70
70
|
|
71
71
|
context "before_type_cast method" do
|
72
72
|
it 'should not be defined if ORM does not support it' do
|
73
|
-
PersonWithShim.
|
73
|
+
PersonWithShim.new.should_not respond_to(:birth_datetime_before_type_cast)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
@@ -102,8 +102,8 @@ describe ValidatesTimeliness::Conversion do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
describe "with custom dummy date" do
|
105
|
-
before
|
106
|
-
|
105
|
+
before do
|
106
|
+
@original_dummy_date = ValidatesTimeliness.dummy_date_for_time_type
|
107
107
|
ValidatesTimeliness.dummy_date_for_time_type = [2010, 1, 1]
|
108
108
|
end
|
109
109
|
|
@@ -111,8 +111,8 @@ describe ValidatesTimeliness::Conversion do
|
|
111
111
|
dummy_time(Time.utc(1999, 11, 22, 12, 34, 56)).should == Time.utc(2010, 1, 1, 12, 34, 56)
|
112
112
|
end
|
113
113
|
|
114
|
-
after
|
115
|
-
ValidatesTimeliness.dummy_date_for_time_type =
|
114
|
+
after do
|
115
|
+
ValidatesTimeliness.dummy_date_for_time_type = @original_dummy_date
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
@@ -8,9 +8,9 @@ describe ValidatesTimeliness, 'HelperMethods' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'should define instance validation methods' do
|
11
|
-
Person.
|
12
|
-
Person.
|
13
|
-
Person.
|
11
|
+
Person.new.should respond_to(:validates_date)
|
12
|
+
Person.new.should respond_to(:validates_time)
|
13
|
+
Person.new.should respond_to(:validates_datetime)
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'should validate instance when validation method called' do
|
@@ -10,9 +10,9 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should defines for the instance' do
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Employee.new.should respond_to(:validates_date)
|
14
|
+
Employee.new.should respond_to(:validates_time)
|
15
|
+
Employee.new.should respond_to(:validates_datetime)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -44,7 +44,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'should parse a string value' do
|
47
|
-
|
47
|
+
Timeliness::Parser.should_receive(:parse)
|
48
48
|
r = EmployeeWithParser.new
|
49
49
|
r.birth_date = '2010-01-01'
|
50
50
|
end
|
@@ -73,7 +73,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
73
73
|
|
74
74
|
context "before_type_cast method" do
|
75
75
|
it 'should be defined on class if ORM supports it' do
|
76
|
-
Employee.
|
76
|
+
Employee.new.should respond_to(:birth_datetime_before_type_cast)
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'should return original value' do
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
# Try loading mongoid and connecting. Otherwise, abort and skip spec.
|
4
|
+
begin
|
5
|
+
|
3
6
|
require 'mongoid'
|
4
7
|
require 'validates_timeliness/orm/mongoid'
|
5
|
-
|
6
8
|
Mongoid.configure do |config|
|
7
9
|
name = "validates_timeliness_test"
|
8
10
|
host = "localhost"
|
@@ -32,9 +34,9 @@ describe ValidatesTimeliness, 'Mongoid' do
|
|
32
34
|
end
|
33
35
|
|
34
36
|
it 'should be defined on the instance' do
|
35
|
-
Article.
|
36
|
-
Article.
|
37
|
-
Article.
|
37
|
+
Article.new.should respond_to(:validates_date)
|
38
|
+
Article.new.should respond_to(:validates_time)
|
39
|
+
Article.new.should respond_to(:validates_datetime)
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
@@ -55,7 +57,7 @@ describe ValidatesTimeliness, 'Mongoid' do
|
|
55
57
|
end
|
56
58
|
|
57
59
|
it 'should parse a string value' do
|
58
|
-
|
60
|
+
Timeliness::Parser.should_receive(:parse)
|
59
61
|
r = Article.new
|
60
62
|
r.publish_date = '2010-01-01'
|
61
63
|
end
|
@@ -83,7 +85,13 @@ describe ValidatesTimeliness, 'Mongoid' do
|
|
83
85
|
|
84
86
|
context "before_type_cast method" do
|
85
87
|
it 'should not be defined if ORM does not support it' do
|
86
|
-
Article.
|
88
|
+
Article.new.should_not respond_to(:birth_datetime_before_type_cast)
|
87
89
|
end
|
88
90
|
end
|
89
91
|
end
|
92
|
+
|
93
|
+
rescue LoadError
|
94
|
+
puts "Mongoid specs skipped. Mongoid not installed"
|
95
|
+
rescue StandardError
|
96
|
+
puts "Mongoid specs skipped. MongoDB connection failed."
|
97
|
+
end
|
@@ -190,11 +190,14 @@ describe ValidatesTimeliness::Validator do
|
|
190
190
|
end
|
191
191
|
|
192
192
|
context "custom error message" do
|
193
|
+
it 'should be used for invalid type' do
|
194
|
+
Person.validates_date :birth_date, :invalid_date_message => 'custom invalid message'
|
195
|
+
invalid!(:birth_date, 'asdf', 'custom invalid message')
|
196
|
+
end
|
193
197
|
|
194
|
-
it 'should be used for
|
198
|
+
it 'should be used for invalid restriction' do
|
195
199
|
Person.validates_date :birth_date, :before => Time.now, :before_message => 'custom before message'
|
196
200
|
invalid!(:birth_date, Time.now, 'custom before message')
|
197
201
|
end
|
198
|
-
|
199
202
|
end
|
200
203
|
end
|