validates_timeliness 3.0.0.beta.2 → 3.0.0.beta.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/Rakefile +0 -2
- data/lib/generators/validates_timeliness/templates/validates_timeliness.rb +3 -0
- data/lib/validates_timeliness.rb +1 -1
- data/lib/validates_timeliness/attribute_methods.rb +4 -1
- data/lib/validates_timeliness/{orms → orm}/active_record.rb +0 -0
- data/lib/validates_timeliness/orm/mongoid.rb +35 -0
- data/lib/validates_timeliness/validator.rb +1 -1
- data/lib/validates_timeliness/version.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/test_model.rb +6 -1
- data/spec/validates_timeliness/attribute_methods_spec.rb +17 -21
- data/spec/validates_timeliness/conversion_spec.rb +1 -8
- data/spec/validates_timeliness/extensions/date_time_select_spec.rb +95 -89
- data/spec/validates_timeliness/helper_methods_spec.rb +1 -1
- data/spec/validates_timeliness/orm/active_record_spec.rb +60 -0
- data/spec/validates_timeliness/orm/mongoid_spec.rb +66 -0
- data/spec/validates_timeliness/validator_spec.rb +14 -4
- data/validates_timeliness.gemspec +3 -4
- metadata +9 -6
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -20,9 +20,7 @@ spec = Gem::Specification.new do |s|
|
|
20
20
|
s.author = "Adam Meehan"
|
21
21
|
s.email = "adam.meehan@gmail.com"
|
22
22
|
s.homepage = "http://github.com/adzap/validates_timeliness"
|
23
|
-
|
24
23
|
s.require_path = 'lib'
|
25
|
-
s.autorequire = GEM_NAME
|
26
24
|
s.files = %w(validates_timeliness.gemspec LICENSE CHANGELOG README.rdoc Rakefile) + Dir.glob("{lib,spec}/**/*")
|
27
25
|
end
|
28
26
|
|
@@ -2,6 +2,9 @@ ValidatesTimeliness.setup do |config|
|
|
2
2
|
# Add plugin to supported ORMs (only :active_record for now)
|
3
3
|
# config.extend_orms = [ :active_record ]
|
4
4
|
#
|
5
|
+
# User the plugin date/time parser which is stricter and extendable
|
6
|
+
# config.use_plugin_parser = false
|
7
|
+
#
|
5
8
|
# Set the dummy date part for a time type values.
|
6
9
|
# config.dummy_date_for_time_type = [ 2000, 1, 1 ]
|
7
10
|
#
|
data/lib/validates_timeliness.rb
CHANGED
@@ -42,7 +42,7 @@ module ValidatesTimeliness
|
|
42
42
|
# Setup method for plugin configuration
|
43
43
|
def self.setup
|
44
44
|
yield self
|
45
|
-
extend_orms.each {|orm| require "validates_timeliness/
|
45
|
+
extend_orms.each {|orm| require "validates_timeliness/orm/#{orm}" }
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -5,6 +5,7 @@ module ValidatesTimeliness
|
|
5
5
|
module ClassMethods
|
6
6
|
|
7
7
|
def define_timeliness_methods(before_type_cast=false)
|
8
|
+
return if timeliness_validated_attributes.blank?
|
8
9
|
timeliness_validated_attributes.each do |attr_name, type|
|
9
10
|
define_timeliness_write_method(attr_name, type, timeliness_attribute_timezone_aware?(attr_name))
|
10
11
|
define_timeliness_before_type_cast_method(attr_name) if before_type_cast
|
@@ -18,7 +19,7 @@ module ValidatesTimeliness
|
|
18
19
|
def #{attr_name}=(value)
|
19
20
|
@attributes_cache ||= {}
|
20
21
|
@attributes_cache["_#{attr_name}_before_type_cast"] = value
|
21
|
-
#{ "value = ValidatesTimeliness::Parser.parse(value, :#{type}) if value.is_a?(String)" if ValidatesTimeliness.use_plugin_parser }
|
22
|
+
#{ "value = ValidatesTimeliness::Parser.parse(value, :#{type}, :timezone_aware => #{timezone_aware}) if value.is_a?(String)" if ValidatesTimeliness.use_plugin_parser }
|
22
23
|
super
|
23
24
|
end
|
24
25
|
EOV
|
@@ -34,6 +35,8 @@ module ValidatesTimeliness
|
|
34
35
|
class_eval(method_body, __FILE__, line)
|
35
36
|
end
|
36
37
|
|
38
|
+
public
|
39
|
+
|
37
40
|
def timeliness_attribute_timezone_aware?(attr_name)
|
38
41
|
false
|
39
42
|
end
|
File without changes
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ValidatesTimeliness
|
2
|
+
module ORM
|
3
|
+
module Mongoid
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
# You need define the fields before you define the validations.
|
6
|
+
# It is best to use the plugin parser to avoid errors on a bad
|
7
|
+
# field value in Mongoid. Parser will return nil rather than error.
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def timeliness_validation_for(attr_names, type)
|
11
|
+
super
|
12
|
+
attr_names.each { |attr_name| define_timeliness_write_method(attr_name, type, false) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def define_timeliness_write_method(attr_name, type, timezone_aware)
|
16
|
+
method_body, line = <<-EOV, __LINE__ + 1
|
17
|
+
def #{attr_name}=(value)
|
18
|
+
@attributes_cache ||= {}
|
19
|
+
@attributes_cache["_#{attr_name}_before_type_cast"] = value
|
20
|
+
#{ "value = ValidatesTimeliness::Parser.parse(value, :#{type}) if value.is_a?(String)" if ValidatesTimeliness.use_plugin_parser }
|
21
|
+
write_attribute(:#{attr_name}, value)
|
22
|
+
end
|
23
|
+
EOV
|
24
|
+
class_eval(method_body, __FILE__, line)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module Mongoid::Document
|
32
|
+
include ValidatesTimeliness::HelperMethods
|
33
|
+
include ValidatesTimeliness::AttributeMethods
|
34
|
+
include ValidatesTimeliness::ORM::Mongoid
|
35
|
+
end
|
@@ -35,7 +35,7 @@ module ValidatesTimeliness
|
|
35
35
|
return if (@allow_nil && raw_value.nil?) || (@allow_blank && raw_value.blank?)
|
36
36
|
|
37
37
|
@timezone_aware = record.class.timeliness_attribute_timezone_aware?(attr_name)
|
38
|
-
value = parse(
|
38
|
+
value = parse(raw_value) if value.is_a?(String) || options[:format]
|
39
39
|
value = type_cast_value(value, @type)
|
40
40
|
|
41
41
|
return record.errors.add(attr_name, :"invalid_#{@type}") if value.blank?
|
data/spec/spec_helper.rb
CHANGED
data/spec/test_model.rb
CHANGED
@@ -14,12 +14,17 @@ module TestModel
|
|
14
14
|
|
15
15
|
module ClassMethods
|
16
16
|
def define_method_attribute=(attr_name)
|
17
|
-
generated_attribute_methods.module_eval("def #{attr_name}=(new_value); @attributes['#{attr_name}']=new_value
|
17
|
+
generated_attribute_methods.module_eval("def #{attr_name}=(new_value); @attributes['#{attr_name}']=self.class.type_cast(new_value); end", __FILE__, __LINE__)
|
18
18
|
end
|
19
19
|
|
20
20
|
def define_method_attribute(attr_name)
|
21
21
|
generated_attribute_methods.module_eval("def #{attr_name}; @attributes['#{attr_name}']; end", __FILE__, __LINE__)
|
22
22
|
end
|
23
|
+
|
24
|
+
def type_cast(value)
|
25
|
+
return value unless value.is_a?(String)
|
26
|
+
value.to_time rescue nil
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
30
|
module DynamicMethods
|
@@ -6,21 +6,27 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
context "attribute write method" do
|
9
|
-
class
|
10
|
-
|
9
|
+
class PersonWithCache
|
10
|
+
include TestModel
|
11
|
+
self.model_attributes = :birth_date, :birth_time, :birth_datetime
|
12
|
+
validates_date :birth_date
|
13
|
+
validates_time :birth_time
|
11
14
|
validates_datetime :birth_datetime
|
12
15
|
end
|
13
16
|
|
14
17
|
it 'should cache attribute raw value' do
|
15
|
-
r =
|
18
|
+
r = PersonWithCache.new
|
16
19
|
r.birth_datetime = date_string = '2010-01-01'
|
17
20
|
r._timeliness_raw_value_for(:birth_datetime).should == date_string
|
18
21
|
end
|
19
22
|
|
20
23
|
context "with plugin parser" do
|
21
|
-
class
|
22
|
-
|
23
|
-
|
24
|
+
class PersonWithParser
|
25
|
+
include TestModel
|
26
|
+
self.model_attributes = :birth_date, :birth_time, :birth_datetime
|
27
|
+
validates_date :birth_date
|
28
|
+
validates_time :birth_time
|
29
|
+
validates_datetime :birth_datetime
|
24
30
|
end
|
25
31
|
|
26
32
|
before :all do
|
@@ -29,14 +35,14 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
29
35
|
|
30
36
|
it 'should parse a string value' do
|
31
37
|
ValidatesTimeliness::Parser.should_receive(:parse)
|
32
|
-
r =
|
38
|
+
r = PersonWithParser.new
|
33
39
|
r.birth_date = '2010-01-01'
|
34
40
|
end
|
35
41
|
|
36
|
-
it 'should
|
37
|
-
r =
|
38
|
-
r.
|
39
|
-
r.
|
42
|
+
it 'should parse string as current timezone' do
|
43
|
+
r = PersonWithParser.new
|
44
|
+
r.birth_datetime = '2010-01-01 12:00'
|
45
|
+
r.birth_datetime.zone == Time.zone.name
|
40
46
|
end
|
41
47
|
|
42
48
|
after :all do
|
@@ -46,18 +52,8 @@ describe ValidatesTimeliness::AttributeMethods do
|
|
46
52
|
end
|
47
53
|
|
48
54
|
context "before_type_cast method" do
|
49
|
-
it 'should be defined on class if ORM supports it' do
|
50
|
-
Employee.instance_methods(false).should include("birth_datetime_before_type_cast")
|
51
|
-
end
|
52
|
-
|
53
55
|
it 'should not be defined if ORM does not support it' do
|
54
56
|
Person.instance_methods(false).should_not include("birth_datetime_before_type_cast")
|
55
57
|
end
|
56
|
-
|
57
|
-
it 'should return original value' do
|
58
|
-
r = Employee.new
|
59
|
-
r.birth_datetime = date_string = '2010-01-01'
|
60
|
-
r.birth_datetime_before_type_cast.should == date_string
|
61
|
-
end
|
62
58
|
end
|
63
59
|
end
|
@@ -168,19 +168,12 @@ describe ValidatesTimeliness::Conversion do
|
|
168
168
|
evaluate_option_value(lambda { value }, person).should == Time.utc(2010,1,1,12,0,0)
|
169
169
|
end
|
170
170
|
|
171
|
-
it 'should return Time value
|
171
|
+
it 'should return Time value for attribute method symbol which returns string time value' do
|
172
172
|
value = '2010-01-01 12:00:00'
|
173
173
|
person.birth_time = value
|
174
174
|
evaluate_option_value(:birth_time, person).should == Time.utc(2010,1,1,12,0,0)
|
175
175
|
end
|
176
176
|
|
177
|
-
it 'should return Time value in current zone attribute method symbol which returns string time value if timezone aware' do
|
178
|
-
@timezone_aware = true
|
179
|
-
value = '2010-01-01 12:00:00'
|
180
|
-
person.birth_time = value
|
181
|
-
evaluate_option_value(:birth_time, person).should == Time.zone.local(2010,1,1,12,0,0)
|
182
|
-
end
|
183
|
-
|
184
177
|
context "restriction shorthand" do
|
185
178
|
before do
|
186
179
|
Timecop.freeze(Time.mktime(2010, 1, 1, 0, 0, 0))
|
@@ -2,17 +2,20 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ValidatesTimeliness::Extensions::DateTimeSelect do
|
4
4
|
include ActionView::Helpers::DateHelper
|
5
|
+
attr_reader :person, :params
|
5
6
|
|
6
|
-
|
7
|
+
before :all do
|
8
|
+
ValidatesTimeliness.use_plugin_parser = true
|
9
|
+
end
|
7
10
|
|
8
11
|
before do
|
9
|
-
@
|
12
|
+
@person = Person.new
|
10
13
|
@params = {}
|
11
14
|
end
|
12
15
|
|
13
16
|
describe "datetime_select" do
|
14
17
|
it "should use param values when attribute is nil" do
|
15
|
-
params["
|
18
|
+
params["person"] = {
|
16
19
|
"birth_datetime(1i)" => 2009,
|
17
20
|
"birth_datetime(2i)" => 2,
|
18
21
|
"birth_datetime(3i)" => 29,
|
@@ -20,18 +23,18 @@ describe ValidatesTimeliness::Extensions::DateTimeSelect do
|
|
20
23
|
"birth_datetime(5i)" => 13,
|
21
24
|
"birth_datetime(6i)" => 14,
|
22
25
|
}
|
23
|
-
|
24
|
-
output = datetime_select(:
|
25
|
-
output.should have_tag('select[id=
|
26
|
-
output.should have_tag('select[id=
|
27
|
-
output.should have_tag('select[id=
|
28
|
-
output.should have_tag('select[id=
|
29
|
-
output.should have_tag('select[id=
|
30
|
-
output.should have_tag('select[id=
|
26
|
+
person.birth_datetime = nil
|
27
|
+
output = datetime_select(:person, :birth_datetime, :include_blank => true, :include_seconds => true)
|
28
|
+
output.should have_tag('select[id=person_birth_datetime_1i] option[selected=selected]', '2009')
|
29
|
+
output.should have_tag('select[id=person_birth_datetime_2i] option[selected=selected]', 'February')
|
30
|
+
output.should have_tag('select[id=person_birth_datetime_3i] option[selected=selected]', '29')
|
31
|
+
output.should have_tag('select[id=person_birth_datetime_4i] option[selected=selected]', '12')
|
32
|
+
output.should have_tag('select[id=person_birth_datetime_5i] option[selected=selected]', '13')
|
33
|
+
output.should have_tag('select[id=person_birth_datetime_6i] option[selected=selected]', '14')
|
31
34
|
end
|
32
35
|
|
33
36
|
it "should override object values and use params if present" do
|
34
|
-
params["
|
37
|
+
params["person"] = {
|
35
38
|
"birth_datetime(1i)" => 2009,
|
36
39
|
"birth_datetime(2i)" => 2,
|
37
40
|
"birth_datetime(3i)" => 29,
|
@@ -39,101 +42,101 @@ describe ValidatesTimeliness::Extensions::DateTimeSelect do
|
|
39
42
|
"birth_datetime(5i)" => 13,
|
40
43
|
"birth_datetime(6i)" => 14,
|
41
44
|
}
|
42
|
-
|
43
|
-
output = datetime_select(:
|
44
|
-
output.should have_tag('select[id=
|
45
|
-
output.should have_tag('select[id=
|
46
|
-
output.should have_tag('select[id=
|
47
|
-
output.should have_tag('select[id=
|
48
|
-
output.should have_tag('select[id=
|
49
|
-
output.should have_tag('select[id=
|
45
|
+
person.birth_datetime = "2010-01-01 15:16:17"
|
46
|
+
output = datetime_select(:person, :birth_datetime, :include_blank => true, :include_seconds => true)
|
47
|
+
output.should have_tag('select[id=person_birth_datetime_1i] option[selected=selected]', '2009')
|
48
|
+
output.should have_tag('select[id=person_birth_datetime_2i] option[selected=selected]', 'February')
|
49
|
+
output.should have_tag('select[id=person_birth_datetime_3i] option[selected=selected]', '29')
|
50
|
+
output.should have_tag('select[id=person_birth_datetime_4i] option[selected=selected]', '12')
|
51
|
+
output.should have_tag('select[id=person_birth_datetime_5i] option[selected=selected]', '13')
|
52
|
+
output.should have_tag('select[id=person_birth_datetime_6i] option[selected=selected]', '14')
|
50
53
|
end
|
51
54
|
|
52
55
|
it "should use attribute values from object if no params" do
|
53
|
-
|
54
|
-
output = datetime_select(:
|
55
|
-
output.should have_tag('select[id=
|
56
|
-
output.should have_tag('select[id=
|
57
|
-
output.should have_tag('select[id=
|
58
|
-
output.should have_tag('select[id=
|
59
|
-
output.should have_tag('select[id=
|
60
|
-
output.should have_tag('select[id=
|
56
|
+
person.birth_datetime = "2009-01-02 12:13:14"
|
57
|
+
output = datetime_select(:person, :birth_datetime, :include_blank => true, :include_seconds => true)
|
58
|
+
output.should have_tag('select[id=person_birth_datetime_1i] option[selected=selected]', '2009')
|
59
|
+
output.should have_tag('select[id=person_birth_datetime_2i] option[selected=selected]', 'January')
|
60
|
+
output.should have_tag('select[id=person_birth_datetime_3i] option[selected=selected]', '2')
|
61
|
+
output.should have_tag('select[id=person_birth_datetime_4i] option[selected=selected]', '12')
|
62
|
+
output.should have_tag('select[id=person_birth_datetime_5i] option[selected=selected]', '13')
|
63
|
+
output.should have_tag('select[id=person_birth_datetime_6i] option[selected=selected]', '14')
|
61
64
|
end
|
62
65
|
|
63
66
|
it "should use attribute values if params does not contain attribute params" do
|
64
|
-
|
65
|
-
params["
|
66
|
-
output = datetime_select(:
|
67
|
-
output.should have_tag('select[id=
|
68
|
-
output.should have_tag('select[id=
|
69
|
-
output.should have_tag('select[id=
|
70
|
-
output.should have_tag('select[id=
|
71
|
-
output.should have_tag('select[id=
|
72
|
-
output.should have_tag('select[id=
|
67
|
+
person.birth_datetime = "2009-01-02 12:13:14"
|
68
|
+
params["person"] = { }
|
69
|
+
output = datetime_select(:person, :birth_datetime, :include_blank => true, :include_seconds => true)
|
70
|
+
output.should have_tag('select[id=person_birth_datetime_1i] option[selected=selected]', '2009')
|
71
|
+
output.should have_tag('select[id=person_birth_datetime_2i] option[selected=selected]', 'January')
|
72
|
+
output.should have_tag('select[id=person_birth_datetime_3i] option[selected=selected]', '2')
|
73
|
+
output.should have_tag('select[id=person_birth_datetime_4i] option[selected=selected]', '12')
|
74
|
+
output.should have_tag('select[id=person_birth_datetime_5i] option[selected=selected]', '13')
|
75
|
+
output.should have_tag('select[id=person_birth_datetime_6i] option[selected=selected]', '14')
|
73
76
|
end
|
74
77
|
|
75
78
|
it "should not select values when attribute value is nil and has no param values" do
|
76
|
-
|
77
|
-
output = datetime_select(:
|
78
|
-
output.should_not have_tag('select[id=
|
79
|
-
output.should_not have_tag('select[id=
|
80
|
-
output.should_not have_tag('select[id=
|
81
|
-
output.should_not have_tag('select[id=
|
82
|
-
output.should_not have_tag('select[id=
|
83
|
-
output.should_not have_tag('select[id=
|
79
|
+
person.birth_datetime = nil
|
80
|
+
output = datetime_select(:person, :birth_datetime, :include_blank => true, :include_seconds => true)
|
81
|
+
output.should_not have_tag('select[id=person_birth_datetime_1i] option[selected=selected]')
|
82
|
+
output.should_not have_tag('select[id=person_birth_datetime_2i] option[selected=selected]')
|
83
|
+
output.should_not have_tag('select[id=person_birth_datetime_3i] option[selected=selected]')
|
84
|
+
output.should_not have_tag('select[id=person_birth_datetime_4i] option[selected=selected]')
|
85
|
+
output.should_not have_tag('select[id=person_birth_datetime_5i] option[selected=selected]')
|
86
|
+
output.should_not have_tag('select[id=person_birth_datetime_6i] option[selected=selected]')
|
84
87
|
end
|
85
88
|
end
|
86
89
|
|
87
90
|
describe "date_select" do
|
88
91
|
it "should use param values when attribute is nil" do
|
89
|
-
params["
|
92
|
+
params["person"] = {
|
90
93
|
"birth_date(1i)" => 2009,
|
91
94
|
"birth_date(2i)" => 2,
|
92
95
|
"birth_date(3i)" => 29,
|
93
96
|
}
|
94
|
-
|
95
|
-
output = date_select(:
|
96
|
-
output.should have_tag('select[id=
|
97
|
-
output.should have_tag('select[id=
|
98
|
-
output.should have_tag('select[id=
|
97
|
+
person.birth_date = nil
|
98
|
+
output = date_select(:person, :birth_date, :include_blank => true, :include_seconds => true)
|
99
|
+
output.should have_tag('select[id=person_birth_date_1i] option[selected=selected]', '2009')
|
100
|
+
output.should have_tag('select[id=person_birth_date_2i] option[selected=selected]', 'February')
|
101
|
+
output.should have_tag('select[id=person_birth_date_3i] option[selected=selected]', '29')
|
99
102
|
end
|
100
103
|
|
101
104
|
it "should override object values and use params if present" do
|
102
|
-
params["
|
105
|
+
params["person"] = {
|
103
106
|
"birth_date(1i)" => 2009,
|
104
107
|
"birth_date(2i)" => 2,
|
105
108
|
"birth_date(3i)" => 29,
|
106
109
|
}
|
107
|
-
|
108
|
-
output = date_select(:
|
109
|
-
output.should have_tag('select[id=
|
110
|
-
output.should have_tag('select[id=
|
111
|
-
output.should have_tag('select[id=
|
110
|
+
person.birth_date = "2009-03-01"
|
111
|
+
output = date_select(:person, :birth_date, :include_blank => true, :include_seconds => true)
|
112
|
+
output.should have_tag('select[id=person_birth_date_1i] option[selected=selected]', '2009')
|
113
|
+
output.should have_tag('select[id=person_birth_date_2i] option[selected=selected]', 'February')
|
114
|
+
output.should have_tag('select[id=person_birth_date_3i] option[selected=selected]', '29')
|
112
115
|
end
|
113
116
|
|
114
117
|
it "should select attribute values from object if no params" do
|
115
|
-
|
116
|
-
output = date_select(:
|
117
|
-
output.should have_tag('select[id=
|
118
|
-
output.should have_tag('select[id=
|
119
|
-
output.should have_tag('select[id=
|
118
|
+
person.birth_date = "2009-01-02"
|
119
|
+
output = date_select(:person, :birth_date, :include_blank => true, :include_seconds => true)
|
120
|
+
output.should have_tag('select[id=person_birth_date_1i] option[selected=selected]', '2009')
|
121
|
+
output.should have_tag('select[id=person_birth_date_2i] option[selected=selected]', 'January')
|
122
|
+
output.should have_tag('select[id=person_birth_date_3i] option[selected=selected]', '2')
|
120
123
|
end
|
121
124
|
|
122
125
|
it "should select attribute values if params does not contain attribute params" do
|
123
|
-
|
124
|
-
params["
|
125
|
-
output = date_select(:
|
126
|
-
output.should have_tag('select[id=
|
127
|
-
output.should have_tag('select[id=
|
128
|
-
output.should have_tag('select[id=
|
126
|
+
person.birth_date = "2009-01-02"
|
127
|
+
params["person"] = { }
|
128
|
+
output = date_select(:person, :birth_date, :include_blank => true, :include_seconds => true)
|
129
|
+
output.should have_tag('select[id=person_birth_date_1i] option[selected=selected]', '2009')
|
130
|
+
output.should have_tag('select[id=person_birth_date_2i] option[selected=selected]', 'January')
|
131
|
+
output.should have_tag('select[id=person_birth_date_3i] option[selected=selected]', '2')
|
129
132
|
end
|
130
133
|
|
131
134
|
it "should not select values when attribute value is nil and has no param values" do
|
132
|
-
|
133
|
-
output = date_select(:
|
134
|
-
output.should_not have_tag('select[id=
|
135
|
-
output.should_not have_tag('select[id=
|
136
|
-
output.should_not have_tag('select[id=
|
135
|
+
person.birth_date = nil
|
136
|
+
output = date_select(:person, :birth_date, :include_blank => true, :include_seconds => true)
|
137
|
+
output.should_not have_tag('select[id=person_birth_date_1i] option[selected=selected]')
|
138
|
+
output.should_not have_tag('select[id=person_birth_date_2i] option[selected=selected]')
|
139
|
+
output.should_not have_tag('select[id=person_birth_date_3i] option[selected=selected]')
|
137
140
|
end
|
138
141
|
end
|
139
142
|
|
@@ -143,7 +146,7 @@ describe ValidatesTimeliness::Extensions::DateTimeSelect do
|
|
143
146
|
end
|
144
147
|
|
145
148
|
it "should use param values when attribute is nil" do
|
146
|
-
params["
|
149
|
+
params["person"] = {
|
147
150
|
"birth_time(1i)" => 2000,
|
148
151
|
"birth_time(2i)" => 1,
|
149
152
|
"birth_time(3i)" => 1,
|
@@ -151,28 +154,31 @@ describe ValidatesTimeliness::Extensions::DateTimeSelect do
|
|
151
154
|
"birth_time(5i)" => 13,
|
152
155
|
"birth_time(6i)" => 14,
|
153
156
|
}
|
154
|
-
|
155
|
-
output = time_select(:
|
156
|
-
output.should have_tag('select[id=
|
157
|
-
output.should have_tag('select[id=
|
158
|
-
output.should have_tag('select[id=
|
157
|
+
person.birth_time = nil
|
158
|
+
output = time_select(:person, :birth_time, :include_blank => true, :include_seconds => true)
|
159
|
+
output.should have_tag('select[id=person_birth_time_4i] option[selected=selected]', '12')
|
160
|
+
output.should have_tag('select[id=person_birth_time_5i] option[selected=selected]', '13')
|
161
|
+
output.should have_tag('select[id=person_birth_time_6i] option[selected=selected]', '14')
|
159
162
|
end
|
160
163
|
|
161
164
|
it "should select attribute values from object if no params" do
|
162
|
-
|
163
|
-
output = time_select(:
|
164
|
-
output.should have_tag('select[id=
|
165
|
-
output.should have_tag('select[id=
|
166
|
-
output.should have_tag('select[id=
|
165
|
+
person.birth_time = "2000-01-01 12:13:14"
|
166
|
+
output = time_select(:person, :birth_time, :include_blank => true, :include_seconds => true)
|
167
|
+
output.should have_tag('select[id=person_birth_time_4i] option[selected=selected]', '12')
|
168
|
+
output.should have_tag('select[id=person_birth_time_5i] option[selected=selected]', '13')
|
169
|
+
output.should have_tag('select[id=person_birth_time_6i] option[selected=selected]', '14')
|
167
170
|
end
|
168
171
|
|
169
172
|
it "should not select values when attribute value is nil and has no param values" do
|
170
|
-
|
171
|
-
output = time_select(:
|
172
|
-
output.should_not have_tag('select[id=
|
173
|
-
output.should_not have_tag('select[id=
|
174
|
-
output.should_not have_tag('select[id=
|
173
|
+
person.birth_time = nil
|
174
|
+
output = time_select(:person, :birth_time, :include_blank => true, :include_seconds => true)
|
175
|
+
output.should_not have_tag('select[id=person_birth_time_4i] option[selected=selected]')
|
176
|
+
output.should_not have_tag('select[id=person_birth_time_5i] option[selected=selected]')
|
177
|
+
output.should_not have_tag('select[id=person_birth_time_6i] option[selected=selected]')
|
175
178
|
end
|
176
179
|
end
|
177
180
|
|
181
|
+
after :all do
|
182
|
+
ValidatesTimeliness.use_plugin_parser = false
|
183
|
+
end
|
178
184
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ValidatesTimeliness, 'ActiveRecord' do
|
4
|
+
it 'should define _timeliness_raw_value_for instance method' do
|
5
|
+
Employee.instance_methods.should include('_timeliness_raw_value_for')
|
6
|
+
end
|
7
|
+
|
8
|
+
context "attribute write method" do
|
9
|
+
class EmployeeWithCache < ActiveRecord::Base
|
10
|
+
set_table_name 'employees'
|
11
|
+
validates_datetime :birth_datetime
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should cache attribute raw value' do
|
15
|
+
r = EmployeeWithCache.new
|
16
|
+
r.birth_datetime = date_string = '2010-01-01'
|
17
|
+
r._timeliness_raw_value_for(:birth_datetime).should == date_string
|
18
|
+
end
|
19
|
+
|
20
|
+
context "with plugin parser" do
|
21
|
+
class EmployeeWithParser < ActiveRecord::Base
|
22
|
+
set_table_name 'employees'
|
23
|
+
validates_date :birth_date
|
24
|
+
validates_datetime :birth_datetime
|
25
|
+
end
|
26
|
+
|
27
|
+
before :all do
|
28
|
+
ValidatesTimeliness.use_plugin_parser = true
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should parse a string value' do
|
32
|
+
ValidatesTimeliness::Parser.should_receive(:parse)
|
33
|
+
r = EmployeeWithParser.new
|
34
|
+
r.birth_date = '2010-01-01'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should parse string as current timezone' do
|
38
|
+
r = EmployeeWithParser.new
|
39
|
+
r.birth_datetime = '2010-01-01 12:00'
|
40
|
+
r.birth_datetime.zone == Time.zone.name
|
41
|
+
end
|
42
|
+
|
43
|
+
after :all do
|
44
|
+
ValidatesTimeliness.use_plugin_parser = false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "before_type_cast method" do
|
50
|
+
it 'should be defined on class if ORM supports it' do
|
51
|
+
Employee.instance_methods(false).should include("birth_datetime_before_type_cast")
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return original value' do
|
55
|
+
r = Employee.new
|
56
|
+
r.birth_datetime = date_string = '2010-01-01'
|
57
|
+
r.birth_datetime_before_type_cast.should == date_string
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'mongoid'
|
4
|
+
require 'validates_timeliness/orm/mongoid'
|
5
|
+
|
6
|
+
Mongoid.configure do |config|
|
7
|
+
name = "validates_timeliness_test"
|
8
|
+
host = "localhost"
|
9
|
+
config.master = Mongo::Connection.new.db(name)
|
10
|
+
config.persist_in_safe_mode = false
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ValidatesTimeliness, 'Mongoid' do
|
14
|
+
|
15
|
+
class Article
|
16
|
+
::ValidatesTimeliness.use_plugin_parser = true
|
17
|
+
include Mongoid::Document
|
18
|
+
field :publish_date, :type => Date
|
19
|
+
field :publish_time, :type => Time
|
20
|
+
field :publish_datetime, :type => DateTime
|
21
|
+
validates_date :publish_date
|
22
|
+
validates_time :publish_time
|
23
|
+
validates_datetime :publish_datetime
|
24
|
+
::ValidatesTimeliness.use_plugin_parser = false
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should define _timeliness_raw_value_for instance method' do
|
28
|
+
Article.instance_methods.should include('_timeliness_raw_value_for')
|
29
|
+
end
|
30
|
+
|
31
|
+
context "attribute write method" do
|
32
|
+
it 'should cache attribute raw value' do
|
33
|
+
r = Article.new
|
34
|
+
r.publish_datetime = date_string = '2010-01-01'
|
35
|
+
r._timeliness_raw_value_for(:publish_datetime).should == date_string
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with plugin parser" do
|
39
|
+
before :all do
|
40
|
+
ValidatesTimeliness.use_plugin_parser = true
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should parse a string value' do
|
44
|
+
ValidatesTimeliness::Parser.should_receive(:parse)
|
45
|
+
r = Article.new
|
46
|
+
r.publish_date = '2010-01-01'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should parse string into Time value' do
|
50
|
+
r = Article.new
|
51
|
+
r.publish_datetime = '2010-01-01 12:00'
|
52
|
+
r.publish_datetime.should == Time.utc(2010,1,1,12,0)
|
53
|
+
end
|
54
|
+
|
55
|
+
after :all do
|
56
|
+
ValidatesTimeliness.use_plugin_parser = false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "before_type_cast method" do
|
62
|
+
it 'should not be defined if ORM does not support it' do
|
63
|
+
Article.instance_methods(false).should_not include("birth_datetime_before_type_cast")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -99,18 +99,28 @@ describe ValidatesTimeliness::Validator do
|
|
99
99
|
end
|
100
100
|
|
101
101
|
describe ":format option" do
|
102
|
+
class PersonWithFormatOption
|
103
|
+
include TestModel
|
104
|
+
self.model_attributes = :birth_date, :birth_time, :birth_datetime
|
105
|
+
validates_date :birth_date, :format => 'dd-mm-yyyy'
|
106
|
+
end
|
107
|
+
|
108
|
+
let(:person) { PersonWithFormatOption.new }
|
109
|
+
|
102
110
|
before(:all) do
|
103
111
|
ValidatesTimeliness.use_plugin_parser = true
|
104
112
|
end
|
105
113
|
|
106
114
|
it "should be valid when value matches format" do
|
107
|
-
|
108
|
-
valid
|
115
|
+
person.birth_date = '11-12-1913'
|
116
|
+
person.valid?
|
117
|
+
person.errors[:birth_date].should be_empty
|
109
118
|
end
|
110
119
|
|
111
120
|
it "should not be valid when value does not match format" do
|
112
|
-
|
113
|
-
|
121
|
+
person.birth_date = '1913-12-11'
|
122
|
+
person.valid?
|
123
|
+
person.errors[:birth_date].should include('is not a valid date')
|
114
124
|
end
|
115
125
|
|
116
126
|
after(:all) do
|
@@ -2,16 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{validates_timeliness}
|
5
|
-
s.version = "3.0.0.beta.
|
5
|
+
s.version = "3.0.0.beta.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Adam Meehan"]
|
9
|
-
s.
|
10
|
-
s.date = %q{2010-09-21}
|
9
|
+
s.date = %q{2010-09-22}
|
11
10
|
s.description = %q{Date and time validation plugin for Rails which allows custom formats}
|
12
11
|
s.email = %q{adam.meehan@gmail.com}
|
13
12
|
s.extra_rdoc_files = ["README.rdoc", "LICENSE", "CHANGELOG"]
|
14
|
-
s.files = ["validates_timeliness.gemspec", "LICENSE", "CHANGELOG", "README.rdoc", "Rakefile", "lib/generators", "lib/generators/validates_timeliness", "lib/generators/validates_timeliness/install_generator.rb", "lib/generators/validates_timeliness/templates", "lib/generators/validates_timeliness/templates/en.yml", "lib/generators/validates_timeliness/templates/validates_timeliness.rb", "lib/validates_timeliness", "lib/validates_timeliness/attribute_methods.rb", "lib/validates_timeliness/conversion.rb", "lib/validates_timeliness/extensions", "lib/validates_timeliness/extensions/date_time_select.rb", "lib/validates_timeliness/extensions/multiparameter_handler.rb", "lib/validates_timeliness/extensions.rb", "lib/validates_timeliness/helper_methods.rb", "lib/validates_timeliness/
|
13
|
+
s.files = ["validates_timeliness.gemspec", "LICENSE", "CHANGELOG", "README.rdoc", "Rakefile", "lib/generators", "lib/generators/validates_timeliness", "lib/generators/validates_timeliness/install_generator.rb", "lib/generators/validates_timeliness/templates", "lib/generators/validates_timeliness/templates/en.yml", "lib/generators/validates_timeliness/templates/validates_timeliness.rb", "lib/validates_timeliness", "lib/validates_timeliness/attribute_methods.rb", "lib/validates_timeliness/conversion.rb", "lib/validates_timeliness/extensions", "lib/validates_timeliness/extensions/date_time_select.rb", "lib/validates_timeliness/extensions/multiparameter_handler.rb", "lib/validates_timeliness/extensions.rb", "lib/validates_timeliness/helper_methods.rb", "lib/validates_timeliness/orm", "lib/validates_timeliness/orm/active_record.rb", "lib/validates_timeliness/orm/mongoid.rb", "lib/validates_timeliness/parser.rb", "lib/validates_timeliness/validator.rb", "lib/validates_timeliness/version.rb", "lib/validates_timeliness.rb", "spec/model_helpers.rb", "spec/spec_helper.rb", "spec/test_model.rb", "spec/validates_timeliness", "spec/validates_timeliness/attribute_methods_spec.rb", "spec/validates_timeliness/conversion_spec.rb", "spec/validates_timeliness/extensions", "spec/validates_timeliness/extensions/date_time_select_spec.rb", "spec/validates_timeliness/extensions/multiparameter_handler_spec.rb", "spec/validates_timeliness/helper_methods_spec.rb", "spec/validates_timeliness/orm", "spec/validates_timeliness/orm/active_record_spec.rb", "spec/validates_timeliness/orm/mongoid_spec.rb", "spec/validates_timeliness/parser_spec.rb", "spec/validates_timeliness/validator", "spec/validates_timeliness/validator/after_spec.rb", "spec/validates_timeliness/validator/before_spec.rb", "spec/validates_timeliness/validator/is_at_spec.rb", "spec/validates_timeliness/validator/on_or_after_spec.rb", "spec/validates_timeliness/validator/on_or_before_spec.rb", "spec/validates_timeliness/validator_spec.rb"]
|
15
14
|
s.homepage = %q{http://github.com/adzap/validates_timeliness}
|
16
15
|
s.require_paths = ["lib"]
|
17
16
|
s.rubyforge_project = %q{validates_timeliness}
|
metadata
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validates_timeliness
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 62196421
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 0
|
9
9
|
- 0
|
10
10
|
- beta
|
11
|
-
-
|
12
|
-
version: 3.0.0.beta.
|
11
|
+
- 3
|
12
|
+
version: 3.0.0.beta.3
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Adam Meehan
|
16
|
-
autorequire:
|
16
|
+
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-09-
|
20
|
+
date: 2010-09-22 00:00:00 +10:00
|
21
21
|
default_executable:
|
22
22
|
dependencies: []
|
23
23
|
|
@@ -46,7 +46,8 @@ files:
|
|
46
46
|
- lib/validates_timeliness/extensions/multiparameter_handler.rb
|
47
47
|
- lib/validates_timeliness/extensions.rb
|
48
48
|
- lib/validates_timeliness/helper_methods.rb
|
49
|
-
- lib/validates_timeliness/
|
49
|
+
- lib/validates_timeliness/orm/active_record.rb
|
50
|
+
- lib/validates_timeliness/orm/mongoid.rb
|
50
51
|
- lib/validates_timeliness/parser.rb
|
51
52
|
- lib/validates_timeliness/validator.rb
|
52
53
|
- lib/validates_timeliness/version.rb
|
@@ -59,6 +60,8 @@ files:
|
|
59
60
|
- spec/validates_timeliness/extensions/date_time_select_spec.rb
|
60
61
|
- spec/validates_timeliness/extensions/multiparameter_handler_spec.rb
|
61
62
|
- spec/validates_timeliness/helper_methods_spec.rb
|
63
|
+
- spec/validates_timeliness/orm/active_record_spec.rb
|
64
|
+
- spec/validates_timeliness/orm/mongoid_spec.rb
|
62
65
|
- spec/validates_timeliness/parser_spec.rb
|
63
66
|
- spec/validates_timeliness/validator/after_spec.rb
|
64
67
|
- spec/validates_timeliness/validator/before_spec.rb
|