validates_timeliness 3.0.0.beta.2 → 3.0.0.beta.3
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/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
|