validates_timeliness 3.0.8 → 3.0.9
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.rdoc +5 -1
- data/Rakefile +2 -0
- data/lib/validates_timeliness/attribute_methods.rb +21 -5
- data/lib/validates_timeliness/extensions/multiparameter_handler.rb +35 -24
- data/lib/validates_timeliness/orm/active_record.rb +53 -13
- data/lib/validates_timeliness/orm/mongoid.rb +19 -10
- data/lib/validates_timeliness/version.rb +1 -1
- data/spec/spec_helper.rb +9 -3
- data/spec/support/config_helper.rb +10 -0
- data/spec/validates_timeliness/attribute_methods_spec.rb +16 -1
- data/spec/validates_timeliness/extensions/multiparameter_handler_spec.rb +26 -15
- data/spec/validates_timeliness/orm/active_record_spec.rb +21 -3
- data/spec/validates_timeliness/validator_spec.rb +22 -0
- metadata +6 -6
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
+
= 3.0.9 [2012-03-26]
|
2
|
+
* ActiveRecord 3.1+ suport
|
3
|
+
* Fixes for multiparameter extension with empty date values (thanks @mogox, @Sharagoz)
|
4
|
+
|
1
5
|
= 3.0.8 [2011-12-24]
|
2
|
-
* Remove deprecated InstanceMethods module when using AS::Concern
|
6
|
+
* Remove deprecated InstanceMethods module when using AS::Concern (carlosantoniodasilva)
|
3
7
|
* Update Mongoid shim for v2.3 compatability.
|
4
8
|
|
5
9
|
= 3.0.7 [2011-09-21]
|
data/Rakefile
CHANGED
@@ -20,24 +20,34 @@ module ValidatesTimeliness
|
|
20
20
|
:datetime
|
21
21
|
end
|
22
22
|
|
23
|
+
def undefine_attribute_methods
|
24
|
+
super
|
25
|
+
undefine_timeliness_attribute_methods
|
26
|
+
end
|
27
|
+
|
23
28
|
protected
|
24
29
|
|
25
30
|
def define_timeliness_methods(before_type_cast=false)
|
26
31
|
return if timeliness_validated_attributes.blank?
|
27
32
|
timeliness_validated_attributes.each do |attr_name|
|
28
|
-
|
29
|
-
define_timeliness_before_type_cast_method(attr_name) if before_type_cast
|
33
|
+
define_attribute_timeliness_methods(attr_name, before_type_cast)
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
37
|
+
def define_attribute_timeliness_methods(attr_name, before_type_cast=false)
|
38
|
+
define_timeliness_write_method(attr_name)
|
39
|
+
define_timeliness_before_type_cast_method(attr_name) if before_type_cast
|
40
|
+
end
|
41
|
+
|
33
42
|
def define_timeliness_write_method(attr_name)
|
34
43
|
method_body, line = <<-EOV, __LINE__ + 1
|
35
44
|
def #{attr_name}=(value)
|
45
|
+
original_value = value
|
36
46
|
@timeliness_cache ||= {}
|
37
|
-
@timeliness_cache["#{attr_name}"] =
|
38
|
-
|
47
|
+
@timeliness_cache["#{attr_name}"] = original_value
|
39
48
|
#{ "if value.is_a?(String)\n#{timeliness_type_cast_code(attr_name, 'value')}\nend" if ValidatesTimeliness.use_plugin_parser }
|
40
|
-
|
49
|
+
|
50
|
+
super(value)
|
41
51
|
end
|
42
52
|
EOV
|
43
53
|
generated_timeliness_methods.module_eval(method_body, __FILE__, line)
|
@@ -63,6 +73,12 @@ module ValidatesTimeliness
|
|
63
73
|
def generated_timeliness_methods
|
64
74
|
@generated_timeliness_methods ||= Module.new.tap { |m| include(m) }
|
65
75
|
end
|
76
|
+
|
77
|
+
def undefine_timeliness_attribute_methods
|
78
|
+
generated_timeliness_methods.module_eval do
|
79
|
+
instance_methods.each { |m| undef_method(m) }
|
80
|
+
end
|
81
|
+
end
|
66
82
|
end
|
67
83
|
|
68
84
|
def _timeliness_raw_value_for(attr_name)
|
@@ -8,7 +8,8 @@ module ValidatesTimeliness
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
alias_method_chain :instantiate_time_object, :timeliness
|
11
|
-
|
11
|
+
alias_method :execute_callstack_for_multiparameter_attributes, :execute_callstack_for_multiparameter_attributes_with_timeliness
|
12
|
+
alias_method :read_value_from_parameter, :read_value_from_parameter_with_timeliness
|
12
13
|
end
|
13
14
|
|
14
15
|
private
|
@@ -20,42 +21,52 @@ module ValidatesTimeliness
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def instantiate_time_object_with_timeliness(name, values)
|
23
|
-
|
24
|
+
validate_multiparameter_date_values(values) {
|
24
25
|
instantiate_time_object_without_timeliness(name, values)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def instantiate_date_object(name, values)
|
30
|
+
validate_multiparameter_date_values(values) {
|
31
|
+
Date.new(*values)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
# Yield if date values are valid
|
36
|
+
def validate_multiparameter_date_values(values)
|
37
|
+
if values[0..2].all?{ |v| v.present? } && Date.valid_civil?(*values[0..2])
|
38
|
+
yield
|
25
39
|
else
|
26
40
|
invalid_multiparameter_date_or_time_as_string(values)
|
27
41
|
end
|
28
42
|
end
|
29
43
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
44
|
+
def read_value_from_parameter_with_timeliness(name, values_from_param)
|
45
|
+
klass = (self.class.reflect_on_aggregation(name.to_sym) || column_for_attribute(name)).klass
|
46
|
+
values = values_from_param.is_a?(Hash) ? values_from_param.to_a.sort_by(&:first).map(&:last) : values_from_param
|
47
|
+
|
48
|
+
if values.empty? || values.all?{ |v| v.nil? }
|
49
|
+
nil
|
50
|
+
elsif klass == Time
|
51
|
+
instantiate_time_object(name, values)
|
52
|
+
elsif klass == Date
|
53
|
+
instantiate_date_object(name, values)
|
54
|
+
else
|
55
|
+
if respond_to?(:read_other_parameter_value)
|
56
|
+
read_date_parameter_value(name, values_from_param)
|
57
|
+
else
|
58
|
+
klass.new(*values)
|
59
|
+
end
|
60
|
+
end
|
35
61
|
end
|
36
62
|
|
37
63
|
def execute_callstack_for_multiparameter_attributes_with_timeliness(callstack)
|
38
64
|
errors = []
|
39
65
|
callstack.each do |name, values_with_empty_parameters|
|
40
66
|
begin
|
41
|
-
|
42
|
-
values = values_with_empty_parameters.reject { |v| v.nil? }
|
43
|
-
|
44
|
-
if values.empty?
|
45
|
-
send(name + "=", nil)
|
46
|
-
else
|
47
|
-
|
48
|
-
value = if Time == klass
|
49
|
-
instantiate_time_object(name, values)
|
50
|
-
elsif Date == klass
|
51
|
-
instantiate_date_object(name, values_with_empty_parameters)
|
52
|
-
else
|
53
|
-
klass.new(*values)
|
54
|
-
end
|
55
|
-
|
56
|
-
send(name + "=", value)
|
57
|
-
end
|
67
|
+
send(name + "=", read_value_from_parameter(name, values_with_empty_parameters))
|
58
68
|
rescue => ex
|
69
|
+
values = values_with_empty_parameters.is_a?(Hash) ? values_with_empty_parameters.values : values_with_empty_parameters
|
59
70
|
errors << ActiveRecord::AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)
|
60
71
|
end
|
61
72
|
end
|
@@ -3,13 +3,21 @@ module ValidatesTimeliness
|
|
3
3
|
module ActiveRecord
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
def self.use_plugin_cache?
|
7
|
+
::ActiveRecord::VERSION::STRING < '3.1.0'
|
8
|
+
end
|
9
|
+
|
10
|
+
included do
|
11
|
+
if ValidatesTimeliness::ORM::ActiveRecord.use_plugin_cache?
|
12
|
+
include Reload
|
13
|
+
else
|
14
|
+
# Just use the built-in before_type_cast retrieval
|
15
|
+
alias_method :_timeliness_raw_value_for, :read_attribute_before_type_cast
|
12
16
|
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
public
|
13
21
|
|
14
22
|
def timeliness_attribute_timezone_aware?(attr_name)
|
15
23
|
attr_name = attr_name.to_s
|
@@ -20,20 +28,52 @@ module ValidatesTimeliness
|
|
20
28
|
columns_hash[attr_name.to_s].type
|
21
29
|
end
|
22
30
|
|
31
|
+
def define_attribute_methods
|
32
|
+
super.tap do |attribute_methods_generated|
|
33
|
+
use_before_type_cast = ValidatesTimeliness::ORM::ActiveRecord.use_plugin_cache?
|
34
|
+
define_timeliness_methods use_before_type_cast
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def define_attribute_timeliness_methods(attr_name, before_type_cast=false)
|
41
|
+
if before_type_cast
|
42
|
+
define_timeliness_write_method(attr_name)
|
43
|
+
define_timeliness_before_type_cast_method(attr_name)
|
44
|
+
elsif ValidatesTimeliness.use_plugin_parser
|
45
|
+
define_timeliness_write_method_without_cache(attr_name)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def define_timeliness_write_method_without_cache(attr_name)
|
50
|
+
method_body, line = <<-EOV, __LINE__ + 1
|
51
|
+
def #{attr_name}=(value)
|
52
|
+
original_value = value
|
53
|
+
if value.is_a?(String)\n#{timeliness_type_cast_code(attr_name, 'value')}\nend
|
54
|
+
super(value)
|
55
|
+
@attributes['#{attr_name}'] = original_value
|
56
|
+
end
|
57
|
+
EOV
|
58
|
+
generated_timeliness_methods.module_eval(method_body, __FILE__, line)
|
59
|
+
end
|
60
|
+
|
23
61
|
def timeliness_type_cast_code(attr_name, var_name)
|
24
62
|
type = timeliness_attribute_type(attr_name)
|
25
63
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
END
|
64
|
+
method_body = super
|
65
|
+
method_body << "\n#{var_name} = #{var_name}.to_date if #{var_name}" if type == :date
|
66
|
+
method_body
|
30
67
|
end
|
31
68
|
end
|
32
69
|
|
33
|
-
|
34
|
-
|
35
|
-
|
70
|
+
module Reload
|
71
|
+
def reload(*args)
|
72
|
+
_clear_timeliness_cache
|
73
|
+
super
|
74
|
+
end
|
36
75
|
end
|
76
|
+
|
37
77
|
end
|
38
78
|
end
|
39
79
|
end
|
@@ -7,6 +7,8 @@ module ValidatesTimeliness
|
|
7
7
|
# field value in Mongoid. Parser will return nil rather than error.
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
+
public
|
11
|
+
|
10
12
|
# Mongoid has no bulk attribute method definition hook. It defines
|
11
13
|
# them with each field definition. So we likewise define them after
|
12
14
|
# each validation is defined.
|
@@ -16,12 +18,6 @@ module ValidatesTimeliness
|
|
16
18
|
attr_names.each { |attr_name| define_timeliness_write_method(attr_name) }
|
17
19
|
end
|
18
20
|
|
19
|
-
def timeliness_type_cast_code(attr_name, var_name)
|
20
|
-
type = timeliness_attribute_type(attr_name)
|
21
|
-
|
22
|
-
"#{var_name} = Timeliness::Parser.parse(value, :#{type})"
|
23
|
-
end
|
24
|
-
|
25
21
|
def timeliness_attribute_type(attr_name)
|
26
22
|
{
|
27
23
|
Date => :date,
|
@@ -29,11 +25,22 @@ module ValidatesTimeliness
|
|
29
25
|
DateTime => :datetime
|
30
26
|
}[fields[attr_name.to_s].type] || :datetime
|
31
27
|
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def timeliness_type_cast_code(attr_name, var_name)
|
32
|
+
type = timeliness_attribute_type(attr_name)
|
33
|
+
|
34
|
+
"#{var_name} = Timeliness::Parser.parse(value, :#{type})"
|
35
|
+
end
|
36
|
+
|
32
37
|
end
|
33
38
|
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
module Reload
|
40
|
+
def reload(*args)
|
41
|
+
_clear_timeliness_cache
|
42
|
+
super
|
43
|
+
end
|
37
44
|
end
|
38
45
|
end
|
39
46
|
end
|
@@ -44,11 +51,13 @@ module Mongoid::Document
|
|
44
51
|
include ValidatesTimeliness::ORM::Mongoid
|
45
52
|
|
46
53
|
# Pre-2.3 reload
|
47
|
-
if instance_methods
|
54
|
+
if (instance_methods & ['reload', :reload]).present?
|
48
55
|
def reload_with_timeliness
|
49
56
|
_clear_timeliness_cache
|
50
57
|
reload_without_timeliness
|
51
58
|
end
|
52
59
|
alias_method_chain :reload, :timeliness
|
60
|
+
else
|
61
|
+
include ValidatesTimeliness::ORM::Mongoid::Reload
|
53
62
|
end
|
54
63
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -88,8 +88,14 @@ RSpec.configure do |c|
|
|
88
88
|
c.include(ModelHelpers)
|
89
89
|
c.include(ConfigHelper)
|
90
90
|
c.before do
|
91
|
-
Person
|
92
|
-
PersonWithShim
|
93
|
-
Person._validators.clear
|
91
|
+
reset_validation_setup_for(Person)
|
92
|
+
reset_validation_setup_for(PersonWithShim)
|
94
93
|
end
|
94
|
+
|
95
|
+
RSpec.configure do |c|
|
96
|
+
c.filter_run_excluding :active_record => lambda {|version|
|
97
|
+
!(::ActiveRecord::VERSION::STRING.to_s =~ /^#{version.to_s}/)
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
95
101
|
end
|
@@ -10,6 +10,16 @@ module ConfigHelper
|
|
10
10
|
ValidatesTimeliness.send(:"#{preference_name}=", old_value)
|
11
11
|
end
|
12
12
|
|
13
|
+
def reset_validation_setup_for(model_class)
|
14
|
+
model_class.reset_callbacks(:validate)
|
15
|
+
model_class._validators.clear
|
16
|
+
model_class.timeliness_validated_attributes = [] if model_class.respond_to?(:timeliness_validated_attributes)
|
17
|
+
model_class.undefine_attribute_methods
|
18
|
+
# This is a hack to avoid a disabled super method error message after an undef
|
19
|
+
model_class.instance_variable_set(:@generated_attribute_methods, nil)
|
20
|
+
model_class.instance_variable_set(:@generated_timeliness_methods, nil)
|
21
|
+
end
|
22
|
+
|
13
23
|
module ClassMethods
|
14
24
|
def with_config(preference_name, temporary_value)
|
15
25
|
original_config_value = ValidatesTimeliness.send(preference_name)
|
@@ -31,7 +31,7 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
31
31
|
it 'should cache attribute raw value' do
|
32
32
|
r = PersonWithCache.new
|
33
33
|
r.birth_datetime = date_string = '2010-01-01'
|
34
|
-
r._timeliness_raw_value_for(
|
34
|
+
r._timeliness_raw_value_for('birth_datetime').should == date_string
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'should not overwrite user defined methods' do
|
@@ -40,6 +40,21 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
40
40
|
e.redefined_birth_date_called.should be_true
|
41
41
|
end
|
42
42
|
|
43
|
+
it 'should be undefined if model class has dynamic attribute methods reset' do
|
44
|
+
# Force method definitions
|
45
|
+
PersonWithShim.validates_date :birth_date
|
46
|
+
r = PersonWithShim.new
|
47
|
+
r.birth_date = Time.now
|
48
|
+
|
49
|
+
write_method = RUBY_VERSION < '1.9' ? 'birth_date=' : :birth_date=
|
50
|
+
|
51
|
+
PersonWithShim.send(:generated_timeliness_methods).instance_methods.should include(write_method)
|
52
|
+
|
53
|
+
PersonWithShim.undefine_attribute_methods
|
54
|
+
|
55
|
+
PersonWithShim.send(:generated_timeliness_methods).instance_methods.should_not include(write_method)
|
56
|
+
end
|
57
|
+
|
43
58
|
context "with plugin parser" do
|
44
59
|
with_config(:use_plugin_parser, true)
|
45
60
|
|
@@ -1,33 +1,44 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ValidatesTimeliness::Extensions::MultiparameterHandler do
|
4
|
-
let(:employee) { Employee.new }
|
5
4
|
|
6
5
|
context "time column" do
|
7
|
-
it 'should
|
8
|
-
|
9
|
-
employee.birth_datetime_before_type_cast.should
|
6
|
+
it 'should assign a string value for invalid date portion' do
|
7
|
+
employee = record_with_multiparameter_attribute(:birth_datetime, [2000, 2, 31, 12, 0, 0])
|
8
|
+
employee.birth_datetime_before_type_cast.should eq '2000-02-31 12:00:00'
|
10
9
|
end
|
11
10
|
|
12
|
-
it 'should
|
13
|
-
|
14
|
-
employee.birth_datetime_before_type_cast.should
|
11
|
+
it 'should assign a Time value for valid datetimes' do
|
12
|
+
employee = record_with_multiparameter_attribute(:birth_datetime, [2000, 2, 28, 12, 0, 0])
|
13
|
+
employee.birth_datetime_before_type_cast.should eq Time.local(2000, 2, 28, 12, 0, 0)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should assign a string value for incomplete time' do
|
17
|
+
employee = record_with_multiparameter_attribute(:birth_datetime, [2000, nil, nil])
|
18
|
+
employee.birth_datetime_before_type_cast.should eq '2000-00-00'
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
18
22
|
context "date column" do
|
19
|
-
it 'should
|
20
|
-
|
21
|
-
employee.birth_date_before_type_cast.should
|
23
|
+
it 'should assign a string value for invalid date' do
|
24
|
+
employee = record_with_multiparameter_attribute(:birth_date, [2000, 2, 31])
|
25
|
+
employee.birth_date_before_type_cast.should eq '2000-02-31'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should assign a Date value for valid date' do
|
29
|
+
employee = record_with_multiparameter_attribute(:birth_date, [2000, 2, 28])
|
30
|
+
employee.birth_date_before_type_cast.should eq Date.new(2000, 2, 28)
|
22
31
|
end
|
23
32
|
|
24
|
-
it 'should
|
25
|
-
|
26
|
-
employee.birth_date_before_type_cast.should
|
33
|
+
it 'should assign a string value for incomplete date' do
|
34
|
+
employee = record_with_multiparameter_attribute(:birth_date, [2000, nil, nil])
|
35
|
+
employee.birth_date_before_type_cast.should eq '2000-00-00'
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
30
|
-
def
|
31
|
-
|
39
|
+
def record_with_multiparameter_attribute(name, values)
|
40
|
+
hash = {}
|
41
|
+
values.each_with_index {|value, index| hash["#{name}(#{index+1}i)"] = value.to_s }
|
42
|
+
Employee.new(hash)
|
32
43
|
end
|
33
44
|
end
|
@@ -29,7 +29,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
29
29
|
it 'should cache attribute raw value' do
|
30
30
|
r = EmployeeWithCache.new
|
31
31
|
r.birth_datetime = date_string = '2010-01-01'
|
32
|
-
r._timeliness_raw_value_for(
|
32
|
+
r._timeliness_raw_value_for('birth_datetime').should == date_string
|
33
33
|
end
|
34
34
|
|
35
35
|
context "with plugin parser" do
|
@@ -47,7 +47,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
47
47
|
r.birth_date = '2010-01-01'
|
48
48
|
end
|
49
49
|
|
50
|
-
context "for a date column" do
|
50
|
+
context "for a date column", :active_record => '3.0' do
|
51
51
|
it 'should store a date value after parsing string' do
|
52
52
|
r = EmployeeWithParser.new
|
53
53
|
r.birth_date = '2010-01-01'
|
@@ -83,7 +83,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
83
83
|
r.birth_date = '2010-01-01'
|
84
84
|
r.reload
|
85
85
|
|
86
|
-
r._timeliness_raw_value_for(
|
86
|
+
r._timeliness_raw_value_for('birth_date').should be_nil
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -106,5 +106,23 @@ describe ValidatesTimeliness, 'ActiveRecord' do
|
|
106
106
|
r = Employee.last
|
107
107
|
r.birth_datetime_before_type_cast.should match(/2010-01-01 00:00:00/)
|
108
108
|
end
|
109
|
+
|
110
|
+
context "with plugin parser" do
|
111
|
+
with_config(:use_plugin_parser, true)
|
112
|
+
|
113
|
+
it 'should return original value' do
|
114
|
+
r = Employee.new
|
115
|
+
r.birth_datetime = date_string = '2010-01-31'
|
116
|
+
|
117
|
+
r.birth_datetime_before_type_cast.should == date_string
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
context "define_attribute_methods" do
|
124
|
+
it "returns a falsy value if the attribute methods have already been generated" do
|
125
|
+
Employee.define_attribute_methods.should be_false
|
126
|
+
end
|
109
127
|
end
|
110
128
|
end
|
@@ -46,6 +46,17 @@ describe ValidatesTimeliness::Validator do
|
|
46
46
|
Person.validates_date :birth_date, :allow_nil => true
|
47
47
|
valid!(:birth_date, NIL)
|
48
48
|
end
|
49
|
+
|
50
|
+
context "with raw value cache" do
|
51
|
+
it "should not be valid with an invalid format" do
|
52
|
+
PersonWithShim.validates_date :birth_date, :allow_nil => true
|
53
|
+
|
54
|
+
p = PersonWithShim.new
|
55
|
+
p.birth_date = 'bogus'
|
56
|
+
|
57
|
+
p.should_not be_valid
|
58
|
+
end
|
59
|
+
end
|
49
60
|
end
|
50
61
|
|
51
62
|
describe ":allow_blank option" do
|
@@ -59,6 +70,17 @@ describe ValidatesTimeliness::Validator do
|
|
59
70
|
Person.validates_date :birth_date, :allow_blank => true
|
60
71
|
valid!(:birth_date, '')
|
61
72
|
end
|
73
|
+
|
74
|
+
context "with raw value cache" do
|
75
|
+
it "should not be valid with an invalid format" do
|
76
|
+
PersonWithShim.validates_date :birth_date, :allow_blank => true
|
77
|
+
|
78
|
+
p = PersonWithShim.new
|
79
|
+
p.birth_date = 'bogus'
|
80
|
+
|
81
|
+
p.should_not be_valid
|
82
|
+
end
|
83
|
+
end
|
62
84
|
end
|
63
85
|
|
64
86
|
describe ":between option" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validates_timeliness
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 3.0.
|
9
|
+
- 9
|
10
|
+
version: 3.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Adam Meehan
|
@@ -15,12 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-03-26 00:00:00 +11:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name: timeliness
|
23
|
-
prerelease: false
|
24
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
23
|
none: false
|
26
24
|
requirements:
|
@@ -32,6 +30,8 @@ dependencies:
|
|
32
30
|
- 3
|
33
31
|
- 4
|
34
32
|
version: 0.3.4
|
33
|
+
name: timeliness
|
34
|
+
prerelease: false
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
description: Adds validation methods to ActiveModel for validating dates and times. Works with multiple ORMS.
|