validates_timeliness 2.3.2 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/CHANGELOG +12 -4
  2. data/LICENSE +1 -1
  3. data/README.rdoc +138 -280
  4. data/Rakefile +30 -16
  5. data/lib/generators/validates_timeliness/install_generator.rb +17 -0
  6. data/lib/generators/validates_timeliness/templates/en.yml +16 -0
  7. data/lib/generators/validates_timeliness/templates/validates_timeliness.rb +22 -0
  8. data/lib/validates_timeliness.rb +46 -52
  9. data/lib/validates_timeliness/attribute_methods.rb +51 -0
  10. data/lib/validates_timeliness/conversion.rb +69 -0
  11. data/lib/validates_timeliness/extensions.rb +14 -0
  12. data/lib/validates_timeliness/extensions/date_time_select.rb +45 -0
  13. data/lib/validates_timeliness/extensions/multiparameter_handler.rb +31 -0
  14. data/lib/validates_timeliness/helper_methods.rb +41 -0
  15. data/lib/validates_timeliness/orms/active_record.rb +14 -0
  16. data/lib/validates_timeliness/parser.rb +389 -17
  17. data/lib/validates_timeliness/validator.rb +37 -200
  18. data/lib/validates_timeliness/version.rb +1 -1
  19. data/spec/model_helpers.rb +27 -0
  20. data/spec/spec_helper.rb +74 -43
  21. data/spec/test_model.rb +56 -0
  22. data/spec/validates_timeliness/attribute_methods_spec.rb +36 -0
  23. data/spec/validates_timeliness/conversion_spec.rb +204 -0
  24. data/spec/validates_timeliness/extensions/date_time_select_spec.rb +178 -0
  25. data/spec/validates_timeliness/extensions/multiparameter_handler_spec.rb +21 -0
  26. data/spec/validates_timeliness/helper_methods_spec.rb +36 -0
  27. data/spec/{formats_spec.rb → validates_timeliness/parser_spec.rb} +105 -71
  28. data/spec/validates_timeliness/validator/after_spec.rb +59 -0
  29. data/spec/validates_timeliness/validator/before_spec.rb +59 -0
  30. data/spec/validates_timeliness/validator/is_at_spec.rb +63 -0
  31. data/spec/validates_timeliness/validator/on_or_after_spec.rb +59 -0
  32. data/spec/validates_timeliness/validator/on_or_before_spec.rb +59 -0
  33. data/spec/validates_timeliness/validator_spec.rb +172 -0
  34. data/validates_timeliness.gemspec +30 -0
  35. metadata +42 -40
  36. data/TODO +0 -8
  37. data/lib/validates_timeliness/action_view/instance_tag.rb +0 -52
  38. data/lib/validates_timeliness/active_record/attribute_methods.rb +0 -77
  39. data/lib/validates_timeliness/active_record/multiparameter_attributes.rb +0 -69
  40. data/lib/validates_timeliness/formats.rb +0 -368
  41. data/lib/validates_timeliness/locale/en.new.yml +0 -18
  42. data/lib/validates_timeliness/locale/en.old.yml +0 -18
  43. data/lib/validates_timeliness/matcher.rb +0 -1
  44. data/lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb +0 -162
  45. data/lib/validates_timeliness/validation_methods.rb +0 -46
  46. data/spec/action_view/instance_tag_spec.rb +0 -194
  47. data/spec/active_record/attribute_methods_spec.rb +0 -157
  48. data/spec/active_record/multiparameter_attributes_spec.rb +0 -118
  49. data/spec/ginger_scenarios.rb +0 -19
  50. data/spec/parser_spec.rb +0 -65
  51. data/spec/resources/application.rb +0 -2
  52. data/spec/resources/person.rb +0 -3
  53. data/spec/resources/schema.rb +0 -10
  54. data/spec/resources/sqlite_patch.rb +0 -19
  55. data/spec/spec/rails/matchers/validate_timeliness_spec.rb +0 -245
  56. data/spec/time_travel/MIT-LICENSE +0 -20
  57. data/spec/time_travel/time_extensions.rb +0 -33
  58. data/spec/time_travel/time_travel.rb +0 -12
  59. data/spec/validator_spec.rb +0 -723
@@ -1,118 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
4
- def obj
5
- @obj ||= Person.new
6
- end
7
-
8
- it "should convert array for datetime type into datetime string" do
9
- time_string = time_array_to_string([2000,2,1,9,10,11], :datetime)
10
- time_string.should == "2000-02-01 09:10:11"
11
- end
12
-
13
- it "should convert array for date type into date string" do
14
- time_string = time_array_to_string([2000,2,1], :date)
15
- time_string.should == "2000-02-01"
16
- end
17
-
18
- it "should convert array for time type into time string" do
19
- time_string = time_array_to_string([2000,1,1,9,10,11], :time)
20
- time_string.should == "09:10:11"
21
- end
22
-
23
- describe "execute_callstack_for_multiparameter_attributes" do
24
-
25
- describe "for valid values" do
26
- before do
27
- @callstack = {
28
- 'birth_date_and_time' => [2000,2,1,9,10,11],
29
- 'birth_date' => [2000,2,1,9,10,11],
30
- 'birth_time' => [2000,2,1,9,10,11]
31
- }
32
- end
33
-
34
- it "should store datetime string for datetime column" do
35
- obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:11")
36
- obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
37
- end
38
-
39
- it "should store date string for a date column" do
40
- obj.should_receive(:birth_date=).once.with("2000-02-01")
41
- obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
42
- end
43
-
44
- it "should store time string for a time column" do
45
- obj.should_receive(:birth_time=).once.with("09:10:11")
46
- obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
47
- end
48
- end
49
-
50
- describe "for invalid values" do
51
- before do
52
- @callstack = {
53
- 'birth_date_and_time' => [2000,13,1,9,10,11],
54
- 'birth_date' => [2000,2,41,9,10,11],
55
- 'birth_time' => [2000,2,1,25,10,11]
56
- }
57
- end
58
-
59
- it "should store invalid datetime string for datetime column" do
60
- obj.should_receive(:birth_date_and_time=).once.with("2000-13-01 09:10:11")
61
- obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
62
- end
63
-
64
- it "should store invalid date string for a date column" do
65
- obj.should_receive(:birth_date=).once.with("2000-02-41")
66
- obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
67
- end
68
-
69
- it "should store invalid time string for a time column" do
70
- obj.should_receive(:birth_time=).once.with("25:10:11")
71
- obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
72
- end
73
- end
74
-
75
- describe "for missing values" do
76
- it "should store nil if all datetime values nil" do
77
- obj.should_receive(:birth_date_and_time=).once.with(nil)
78
- callstack = { 'birth_date_and_time' => [nil,nil,nil,nil,nil,nil] }
79
- obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
80
- end
81
-
82
- it "should store nil year as empty value in string" do
83
- obj.should_receive(:birth_date_and_time=).once.with("-02-01 09:10:11")
84
- callstack = { 'birth_date_and_time' => [nil,2,1,9,10,11] }
85
- obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
86
- end
87
-
88
- it "should store nil month as empty value in string" do
89
- obj.should_receive(:birth_date_and_time=).once.with("2000--01 09:10:11")
90
- callstack = { 'birth_date_and_time' => [2000,nil,1,9,10,11] }
91
- obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
92
- end
93
-
94
- it "should store nil day as empty value in string" do
95
- obj.should_receive(:birth_date_and_time=).once.with("2000-02- 09:10:11")
96
- callstack = { 'birth_date_and_time' => [2000,2,nil,9,10,11] }
97
- obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
98
- end
99
-
100
- it "should store nil hour as empty value in string" do
101
- obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 :10:11")
102
- callstack = { 'birth_date_and_time' => [2000,2,1,nil,10,11] }
103
- obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
104
- end
105
-
106
- it "should store nil minute as empty value in string" do
107
- obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:")
108
- callstack = { 'birth_date_and_time' => [2000,2,1,9,10,nil] }
109
- obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
110
- end
111
- end
112
- end
113
-
114
- def time_array_to_string(*args)
115
- ValidatesTimeliness::ActiveRecord.time_array_to_string(*args)
116
- end
117
-
118
- end
@@ -1,19 +0,0 @@
1
- # For use with the ginger gem to test plugin against multiple versions of Rails.
2
- #
3
- # To use ginger:
4
- #
5
- # gem install ginger
6
- #
7
- # Then run
8
- #
9
- # ginger spec
10
- #
11
- Ginger.configure do |config|
12
- rails_versions = ['2.0.2', '2.1.2', '2.2.2', '2.3.3', '2.3.4', '2.3.5', '2.3.6', '2.3.9']
13
-
14
- rails_versions.each do |v|
15
- g = Ginger::Scenario.new("Rails #{v}")
16
- g['rails'] = v
17
- config.scenarios << g.dup
18
- end
19
- end
data/spec/parser_spec.rb DELETED
@@ -1,65 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe ValidatesTimeliness::Parser do
4
- attr_accessor :person
5
-
6
- describe "parse" do
7
- it "should return time object for valid time string" do
8
- parse("2000-01-01 12:13:14", :datetime).should be_kind_of(Time)
9
- end
10
-
11
- it "should return Time object for ISO 8601 string with time zone" do
12
- parse("2000-01-01T12:23:42+09:00", :datetime).should be_kind_of(Time)
13
- end
14
-
15
- it "should return nil for time string with invalid date part" do
16
- parse("2000-02-30 12:13:14", :datetime).should be_nil
17
- end
18
-
19
- it "should return nil for time string with invalid time part" do
20
- parse("2000-02-01 25:13:14", :datetime).should be_nil
21
- end
22
-
23
- it "should return Time object when passed a Time object" do
24
- parse(Time.now, :datetime).should be_kind_of(Time)
25
- end
26
-
27
- if RAILS_VER >= '2.1'
28
- it "should convert time string into current timezone" do
29
- Time.zone = 'Melbourne'
30
- time = parse("2000-06-01 12:13:14", :datetime)
31
- time.utc_offset.should == 10.hours
32
- end
33
- end
34
-
35
- it "should return nil for invalid date string" do
36
- parse("2000-02-30", :date).should be_nil
37
- end
38
-
39
- def parse(*args)
40
- ValidatesTimeliness::Parser.parse(*args)
41
- end
42
- end
43
-
44
- describe "make_time" do
45
-
46
- if RAILS_VER >= '2.1'
47
-
48
- it "should create time using current timezone" do
49
- Time.zone = 'Melbourne'
50
- time = ValidatesTimeliness::Parser.make_time([2000,1,1,12,0,0])
51
- time.zone.should == "EST"
52
- end
53
-
54
- else
55
-
56
- it "should create time using default timezone" do
57
- time = ValidatesTimeliness::Parser.make_time([2000,1,1,12,0,0])
58
- time.zone.should == "UTC"
59
- end
60
-
61
- end
62
-
63
- end
64
-
65
- end
@@ -1,2 +0,0 @@
1
- class ApplicationController; end
2
-
@@ -1,3 +0,0 @@
1
- class Person < ActiveRecord::Base
2
- set_table_name 'people'
3
- end
@@ -1,10 +0,0 @@
1
- ActiveRecord::Schema.define(:version => 1) do
2
-
3
- create_table "people", :force => true do |t|
4
- t.column "name", :string
5
- t.column "birth_date_and_time", :datetime
6
- t.column "birth_date", :date
7
- t.column "birth_time", :time
8
- end
9
-
10
- end
@@ -1,19 +0,0 @@
1
- # patches adapter in rails 2.0 which mistakenly made time attributes map to datetime column type
2
- ActiveRecord::ConnectionAdapters::SQLiteAdapter.class_eval do
3
- def native_database_types #:nodoc:
4
- {
5
- :primary_key => default_primary_key_type,
6
- :string => { :name => "varchar", :limit => 255 },
7
- :text => { :name => "text" },
8
- :integer => { :name => "integer" },
9
- :float => { :name => "float" },
10
- :decimal => { :name => "decimal" },
11
- :datetime => { :name => "datetime" },
12
- :timestamp => { :name => "datetime" },
13
- :time => { :name => "time" },
14
- :date => { :name => "date" },
15
- :binary => { :name => "blob" },
16
- :boolean => { :name => "boolean" }
17
- }
18
- end
19
- end
@@ -1,245 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
- require 'validates_timeliness/matcher'
3
-
4
- class NoValidation < Person
5
- end
6
-
7
- class WithValidation < Person
8
- validates_date :birth_date,
9
- :is_at => '2000-01-01',
10
- :before => '2000-01-10',
11
- :after => '2000-01-01',
12
- :on_or_before => '2000-01-09',
13
- :on_or_after => '2000-01-02',
14
- :between => ['2000-01-01', '2000-01-03']
15
-
16
- validates_time :birth_time,
17
- :is_at => '09:00',
18
- :before => '23:00',
19
- :after => '09:00',
20
- :on_or_before => '22:00',
21
- :on_or_after => '10:00',
22
- :between => ['09:00', '17:00']
23
-
24
- validates_datetime :birth_date_and_time,
25
- :is_at => '2000-01-01 09:00',
26
- :before => '2000-01-10 23:00',
27
- :after => '2000-01-01 09:00',
28
- :on_or_before => '2000-01-09 23:00',
29
- :on_or_after => '2000-01-02 09:00',
30
- :between => ['2000-01-01 09:00', '2000-01-01 17:00']
31
-
32
- end
33
-
34
- class CustomMessages < Person
35
- validates_date :birth_date,
36
- :invalid_date_message => 'is not really a date',
37
- :before => '2000-01-10',
38
- :before_message => 'is too late',
39
- :after => '2000-01-01',
40
- :after_message => 'is too early',
41
- :on_or_before => '2000-01-09',
42
- :on_or_before_message => 'is just too late',
43
- :on_or_after => '2000-01-02',
44
- :on_or_after_message => 'is just too early'
45
- end
46
-
47
- describe "ValidateTimeliness matcher" do
48
- attr_accessor :no_validation, :with_validation
49
-
50
- @@attribute_for_type = { :date => :birth_date, :time => :birth_time, :datetime => :birth_date_and_time }
51
-
52
- before do
53
- @no_validation = NoValidation.new
54
- @with_validation = WithValidation.new
55
- end
56
-
57
- [:date, :time, :datetime].each do |type|
58
-
59
- it "should report that #{type} is validated" do
60
- with_validation.should self.send("validate_#{type}", attribute_for_type(type))
61
- end
62
-
63
- it "should report that #{type} is not validated" do
64
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type))
65
- end
66
- end
67
-
68
- describe "with is_at option" do
69
- test_values = {
70
- :date => ['2000-01-01', '2000-01-02'],
71
- :time => ['09:00', '09:01'],
72
- :datetime => ['2000-01-01 09:00', '2000-01-01 09:01']
73
- }
74
-
75
- [:date, :time, :datetime].each do |type|
76
-
77
- it "should report that #{type} is validated" do
78
- with_validation.should self.send("validate_#{type}", attribute_for_type(type), :is_at => test_values[type][0])
79
- end
80
-
81
- it "should report that #{type} is not validated when option value is incorrect" do
82
- with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :is_at => test_values[type][1])
83
- end
84
-
85
- it "should report that #{type} is not validated with option" do
86
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :is_at => test_values[type][0])
87
- end
88
- end
89
- end
90
-
91
- describe "with before option" do
92
- test_values = {
93
- :date => ['2000-01-10', '2000-01-11'],
94
- :time => ['23:00', '22:59'],
95
- :datetime => ['2000-01-10 23:00', '2000-01-10 22:59']
96
- }
97
-
98
- [:date, :time, :datetime].each do |type|
99
-
100
- it "should report that #{type} is validated" do
101
- with_validation.should self.send("validate_#{type}", attribute_for_type(type), :before => test_values[type][0])
102
- end
103
-
104
- it "should report that #{type} is not validated when option value is incorrect" do
105
- with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :before => test_values[type][1])
106
- end
107
-
108
- it "should report that #{type} is not validated with option" do
109
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :before => test_values[type][0])
110
- end
111
- end
112
- end
113
-
114
- describe "with after option" do
115
- test_values = {
116
- :date => ['2000-01-01', '2000-01-02'],
117
- :time => ['09:00', '09:01'],
118
- :datetime => ['2000-01-01 09:00', '2000-01-01 09:01']
119
- }
120
-
121
- [:date, :time, :datetime].each do |type|
122
-
123
- it "should report that #{type} is validated" do
124
- with_validation.should self.send("validate_#{type}", attribute_for_type(type), :after => test_values[type][0])
125
- end
126
-
127
- it "should report that #{type} is not validated when option value is incorrect" do
128
- with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :after => test_values[type][1])
129
- end
130
-
131
- it "should report that #{type} is not validated with option" do
132
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :after => test_values[type][0])
133
- end
134
- end
135
- end
136
-
137
- describe "with on_or_before option" do
138
- test_values = {
139
- :date => ['2000-01-09', '2000-01-08'],
140
- :time => ['22:00', '21:59'],
141
- :datetime => ['2000-01-09 23:00', '2000-01-09 22:59']
142
- }
143
-
144
- [:date, :time, :datetime].each do |type|
145
-
146
- it "should report that #{type} is validated" do
147
- with_validation.should self.send("validate_#{type}", attribute_for_type(type), :on_or_before => test_values[type][0])
148
- end
149
-
150
- it "should report that #{type} is not validated when option value is incorrect" do
151
- with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_before => test_values[type][1])
152
- end
153
-
154
- it "should report that #{type} is not validated with option" do
155
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_before => test_values[type][0])
156
- end
157
- end
158
- end
159
-
160
- describe "with on_or_after option" do
161
- test_values = {
162
- :date => ['2000-01-02', '2000-01-03'],
163
- :time => ['10:00', '10:01'],
164
- :datetime => ['2000-01-02 09:00', '2000-01-02 09:01']
165
- }
166
-
167
- [:date, :time, :datetime].each do |type|
168
-
169
- it "should report that #{type} is validated" do
170
- with_validation.should self.send("validate_#{type}", attribute_for_type(type), :on_or_after => test_values[type][0])
171
- end
172
-
173
- it "should report that #{type} is not validated when option value is incorrect" do
174
- with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_after => test_values[type][1])
175
- end
176
-
177
- it "should report that #{type} is not validated with option" do
178
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_after => test_values[type][0])
179
- end
180
- end
181
- end
182
-
183
- describe "between option" do
184
- test_values = {
185
- :date => [ ['2000-01-01', '2000-01-03'], ['2000-01-01', '2000-01-04'] ],
186
- :time => [ ['09:00', '17:00'], ['09:00', '17:01'] ],
187
- :datetime => [ ['2000-01-01 09:00', '2000-01-01 17:00'], ['2000-01-01 09:00', '2000-01-01 17:01'] ]
188
- }
189
-
190
- [:date, :time, :datetime].each do |type|
191
-
192
- it "should report that #{type} is validated" do
193
- with_validation.should self.send("validate_#{type}", attribute_for_type(type), :between => test_values[type][0])
194
- end
195
-
196
- it "should report that #{type} is not validated when option value is incorrect" do
197
- with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :between => test_values[type][1])
198
- end
199
-
200
- it "should report that #{type} is not validated with option" do
201
- no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :between => test_values[type][0])
202
- end
203
- end
204
- end
205
-
206
- describe "custom messages" do
207
-
208
- before do
209
- @person = CustomMessages.new
210
- end
211
-
212
- it "should match error message for invalid" do
213
- @person.should validate_date(:birth_date, :invalid_date_message => 'is not really a date')
214
- end
215
-
216
- it "should match error message for before option" do
217
- @person.should validate_date(:birth_date, :before => '2000-01-10',
218
- :invalid_date_message => 'is not really a date',
219
- :before_message => 'is too late')
220
- end
221
-
222
- it "should match error message for after option" do
223
- @person.should validate_date(:birth_date, :after => '2000-01-01',
224
- :invalid_date_message => 'is not really a date',
225
- :after_message => 'is too early')
226
- end
227
-
228
- it "should match error message for on_or_before option" do
229
- @person.should validate_date(:birth_date, :on_or_before => '2000-01-09',
230
- :invalid_date_message => 'is not really a date',
231
- :on_or_before_message => 'is just too late')
232
- end
233
-
234
- it "should match error message for on_or_after option" do
235
- @person.should validate_date(:birth_date, :on_or_after => '2000-01-02',
236
- :invalid_date_message => 'is not really a date',
237
- :on_or_after_message => 'is just too early')
238
- end
239
-
240
- end
241
-
242
- def attribute_for_type(type)
243
- @@attribute_for_type[type.to_sym]
244
- end
245
- end