validates_timeliness 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ = 2.2.0 [2009-09-12]
2
+ - Ruby 1.9 support!
3
+ - Customise dummy date values for time types. See DUMMY DATE FOR TIME TYPES.
4
+ - Fixed matcher conflict with Shoulda. Load plugin matcher manually now see matcher section in README
5
+ - Fixed :ignore_usec when used with :with_time or :with_date
6
+ - Some clean up and refactoring
7
+
1
8
  = 2.1.0 [2009-06-20]
2
9
  - Added ambiguous year threshold setting in Formats class to customize the threshold for 2 digit years (See README)
3
10
  - Fixed interpolation values in custom error message for Rails 2.2+
data/README.rdoc CHANGED
@@ -22,9 +22,9 @@ think should be a valid date or time string.
22
22
  * Restores ability to see raw value entered for date/time attributes with
23
23
  _before_type_cast modifier, which was lost in Rails 2.1.
24
24
 
25
- * Respects new timezone features of Rails 2.1.
25
+ * Supports Rails timezone handling
26
26
 
27
- * Supports Rails 2.2 I18n for the error messages
27
+ * Supports Rails I18n for the error messages
28
28
 
29
29
  * Rspec matcher for testing model validation of dates and times
30
30
 
@@ -107,7 +107,7 @@ temporal options.
107
107
 
108
108
  == EXAMPLES:
109
109
 
110
- validates_date :date_of_birth :before => Proc.new { 18.years.ago },
110
+ validates_date :date_of_birth :before => lambda { 18.years.ago },
111
111
  :before_message => "must be at least 18 years old"
112
112
 
113
113
  validates_time :breakfast_time, :on_or_after => '6:00am',
@@ -115,7 +115,7 @@ temporal options.
115
115
  :before => :second_breakfast_time,
116
116
  :allow_nil => true
117
117
 
118
- validates_datetime :appointment_date, :before => Proc.new { 1.week.from_now }
118
+ validates_datetime :appointment_date, :before => lambda { 1.week.from_now }
119
119
 
120
120
  validates_date :entry_date, :with_time => '17:00', :on_or_before => :competition_closing
121
121
 
@@ -263,6 +263,18 @@ Now you get:
263
263
  year of 20 is considered 1920
264
264
 
265
265
 
266
+ === DUMMY DATE FOR TIME TYPES
267
+
268
+ Given that Ruby has no support for a time-only type, all time type columns are evaluated
269
+ as a regular Time class objects with a dummy date value set. Rails defines the dummy date as
270
+ 2000-01-01. So a time of '12:30' is evaluated as a Time value of '2000-01-01 12:30'. If you
271
+ need to customize this for some reason you can do so as follows
272
+
273
+ ValidatesTimeliness::Formats.dummy_date_for_time_type = [2009, 1, 1]
274
+
275
+ The value should be an array of 3 values being year, month and day in that order.
276
+
277
+
266
278
  === TEMPORAL RESTRICTION ERRORS:
267
279
 
268
280
  When using the validation temporal restrictions there are times when the restriction
@@ -355,9 +367,15 @@ To sweeten the deal that little bit more, you have an Rspec matcher available fo
355
367
  you model specs. Now you can easily test the validations you have just written
356
368
  with the plugin or better yet *before* you write them! You just use the
357
369
  validation options you want as you would with the validation method. Those
358
- options are then verified and reported if they fail. Use it like so:
370
+ options are then verified and reported if they fail.
371
+
372
+ First require it in your spec_helper.rb
373
+
374
+ require 'validates_timeliness/matcher'
375
+
376
+ Use it like so:
359
377
 
360
- @person.should validate_date(:birth_date, :before => Time.now, :before_message => 'should be before today')
378
+ @person.should validate_date(:birth_date, :before => Time.now, :before_message => 'should be before today')
361
379
 
362
380
 
363
381
  The matcher names are just the singular of the validation methods.
data/Rakefile CHANGED
@@ -3,9 +3,10 @@ require 'rake/gempackagetask'
3
3
  require 'rubygems/specification'
4
4
  require 'date'
5
5
  require 'spec/rake/spectask'
6
+ require 'lib/validates_timeliness/version'
6
7
 
7
8
  GEM = "validates_timeliness"
8
- GEM_VERSION = "2.1.0"
9
+ GEM_VERSION = ValidatesTimeliness::VERSION
9
10
  AUTHOR = "Adam Meehan"
10
11
  EMAIL = "adam.meehan@gmail.com"
11
12
  HOMEPAGE = "http://github.com/adzap/validates_timeliness"
@@ -36,7 +36,8 @@ module ValidatesTimeliness
36
36
  end
37
37
 
38
38
  def read_attribute_before_type_cast_with_timeliness(attr_name)
39
- return @attributes_cache["_#{attr_name}_before_type_cast"] if @attributes_cache.has_key?("_#{attr_name}_before_type_cast")
39
+ cached_attr = "_#{attr_name}_before_type_cast"
40
+ return @attributes_cache[cached_attr] if @attributes_cache.has_key?(cached_attr)
40
41
  read_attribute_before_type_cast_without_timeliness(attr_name)
41
42
  end
42
43
 
@@ -50,11 +51,9 @@ module ValidatesTimeliness
50
51
  if [:date, :time, :datetime].include?(column.type)
51
52
  time_zone_aware = create_time_zone_conversion_attribute?(name, column) rescue false
52
53
 
53
- class_eval <<-EOV
54
- def #{name}=(value)
55
- write_date_time_attribute('#{name}', value, #{column.type.inspect}, #{time_zone_aware})
56
- end
57
- EOV
54
+ define_method("#{name}=") do |value|
55
+ write_date_time_attribute(name, value, column.type, time_zone_aware)
56
+ end
58
57
  timeliness_methods << name
59
58
  end
60
59
  end
@@ -5,6 +5,33 @@ module ValidatesTimeliness
5
5
  end
6
6
 
7
7
  module ActiveRecord
8
+
9
+ class << self
10
+
11
+ def time_array_to_string(values, type)
12
+ values.collect! {|v| v.to_s }
13
+
14
+ case type
15
+ when :date
16
+ extract_date_from_multiparameter_attributes(values)
17
+ when :time
18
+ extract_time_from_multiparameter_attributes(values)
19
+ when :datetime
20
+ extract_date_from_multiparameter_attributes(values) + " " + extract_time_from_multiparameter_attributes(values)
21
+ end
22
+ end
23
+
24
+ def extract_date_from_multiparameter_attributes(values)
25
+ year = ValidatesTimeliness::Formats.unambiguous_year(values[0].rjust(2, "0"))
26
+ [year, *values.slice(1, 2).map { |s| s.rjust(2, "0") }].join("-")
27
+ end
28
+
29
+ def extract_time_from_multiparameter_attributes(values)
30
+ values[3..5].map { |s| s.rjust(2, "0") }.join(":")
31
+ end
32
+
33
+ end
34
+
8
35
  module MultiparameterAttributes
9
36
 
10
37
  def self.included(base)
@@ -23,7 +50,7 @@ module ValidatesTimeliness
23
50
  if values.empty?
24
51
  send("#{name}=", nil)
25
52
  else
26
- value = time_array_to_string(values, column.type)
53
+ value = ValidatesTimeliness::ActiveRecord.time_array_to_string(values, column.type)
27
54
  send("#{name}=", value)
28
55
  end
29
56
  rescue => ex
@@ -37,28 +64,6 @@ module ValidatesTimeliness
37
64
  execute_callstack_for_multiparameter_attributes_without_timeliness(callstack)
38
65
  end
39
66
 
40
- def time_array_to_string(values, type)
41
- values.collect! {|v| v.to_s }
42
-
43
- case type
44
- when :date
45
- extract_date_from_multiparameter_attributes(values)
46
- when :time
47
- extract_time_from_multiparameter_attributes(values)
48
- when :datetime
49
- extract_date_from_multiparameter_attributes(values) + " " + extract_time_from_multiparameter_attributes(values)
50
- end
51
- end
52
-
53
- def extract_date_from_multiparameter_attributes(values)
54
- year = ValidatesTimeliness::Formats.unambiguous_year(values[0].rjust(2, "0"))
55
- [year, *values.slice(1, 2).map { |s| s.rjust(2, "0") }].join("-")
56
- end
57
-
58
- def extract_time_from_multiparameter_attributes(values)
59
- values[3..5].map { |s| s.rjust(2, "0") }.join(":")
60
- end
61
-
62
67
  end
63
68
 
64
69
  end
@@ -23,6 +23,7 @@ module ValidatesTimeliness
23
23
 
24
24
 
25
25
  # Set the threshold value for a two digit year to be considered last century
26
+ #
26
27
  # Default: 30
27
28
  #
28
29
  # Example:
@@ -32,6 +33,14 @@ module ValidatesTimeliness
32
33
  cattr_accessor :ambiguous_year_threshold
33
34
  self.ambiguous_year_threshold = 30
34
35
 
36
+ # Set the dummy date part for a time type value. Should be an array of 3 values
37
+ # being year, month and day in that order.
38
+ #
39
+ # Default: [ 2000, 1, 1 ] same as ActiveRecord
40
+ #
41
+ cattr_accessor :dummy_date_for_time_type
42
+ self.dummy_date_for_time_type = [ 2000, 1, 1 ]
43
+
35
44
  # Format tokens:
36
45
  # y = year
37
46
  # m = month
@@ -179,6 +188,7 @@ module ValidatesTimeliness
179
188
  options.reverse_merge!(:strict => true)
180
189
 
181
190
  sets = if options[:format]
191
+ options[:strict] = true
182
192
  [ send("#{type}_expressions").assoc(options[:format]) ]
183
193
  else
184
194
  expression_set(type, string)
@@ -195,7 +205,11 @@ module ValidatesTimeliness
195
205
  break(proc) if matches = full.match(string.strip)
196
206
  end
197
207
  last = options[:include_offset] ? 8 : 7
198
- processor.call(*matches[1..last]) if matches
208
+ if matches
209
+ values = processor.call(*matches[1..last])
210
+ values[0..2] = dummy_date_for_time_type if type == :time
211
+ return values
212
+ end
199
213
  end
200
214
 
201
215
  # Delete formats of specified type. Error raised if format not found.
@@ -0,0 +1 @@
1
+ require 'validates_timeliness/spec/rails/matchers/validate_timeliness'
@@ -7,28 +7,24 @@ module ValidatesTimeliness
7
7
  return nil if raw_value.blank?
8
8
  return raw_value if raw_value.acts_like?(:time) || raw_value.is_a?(Date)
9
9
 
10
- options.reverse_merge!(:strict => true)
11
-
12
- time_array = ValidatesTimeliness::Formats.parse(raw_value, type, options)
13
- raise if time_array.nil?
14
-
15
- # Rails dummy time date part is defined as 2000-01-01
16
- time_array[0..2] = 2000, 1, 1 if type == :time
17
-
18
- # Date.new enforces days per month, unlike Time
19
- date = Date.new(*time_array[0..2]) unless type == :time
10
+ time_array = ValidatesTimeliness::Formats.parse(raw_value, type, options.reverse_merge(:strict => true))
11
+ return nil if time_array.nil?
20
12
 
21
- return date if type == :date
22
-
23
- make_time(time_array[0..7])
24
- rescue
25
- nil
13
+ if type == :date
14
+ Date.new(*time_array[0..2]) rescue nil
15
+ else
16
+ make_time(time_array[0..7])
17
+ end
26
18
  end
27
19
 
28
20
  def make_time(time_array)
21
+ # Enforce date part validity which Time class does not
22
+ return nil unless Date.valid_civil?(*time_array[0..2])
23
+
29
24
  if Time.respond_to?(:zone) && ValidatesTimeliness.use_time_zones
30
25
  Time.zone.local(*time_array)
31
26
  else
27
+ # Older AR way of handling times with datetime fallback
32
28
  begin
33
29
  time_zone = ValidatesTimeliness.default_timezone
34
30
  Time.send(time_zone, *time_array)
@@ -38,6 +34,8 @@ module ValidatesTimeliness
38
34
  DateTime.civil(*(time_array << zone_offset))
39
35
  end
40
36
  end
37
+ rescue ArgumentError, TypeError
38
+ nil
41
39
  end
42
40
 
43
41
  end
@@ -28,13 +28,12 @@ module Spec
28
28
 
29
29
  valid = test_validity
30
30
 
31
- valid = test_option(:equal_to) if @options[:equal_to] && valid
32
- valid = test_option(:before) if @options[:before] && valid
33
- valid = test_option(:after) if @options[:after] && valid
34
- valid = test_option(:on_or_before) if @options[:on_or_before] && valid
35
- valid = test_option(:on_or_after) if @options[:on_or_after] && valid
36
-
37
- valid = test_between if @options[:between] && valid
31
+ valid = test_option(:equal_to) if valid && @options[:equal_to]
32
+ valid = test_option(:before) if valid && @options[:before]
33
+ valid = test_option(:after) if valid && @options[:after]
34
+ valid = test_option(:on_or_before) if valid && @options[:on_or_before]
35
+ valid = test_option(:on_or_after) if valid && @options[:on_or_after]
36
+ valid = test_between if valid && @options[:between]
38
37
 
39
38
  return valid
40
39
  end
@@ -124,9 +123,14 @@ module Spec
124
123
  restriction = [restriction] unless restriction.is_a?(Array)
125
124
  restriction.map! {|r| @validator.class.send(:type_cast_value, r, @type) }
126
125
  interpolate = @validator.send(:interpolation_values, option, restriction )
126
+
127
127
  # get I18n message if defined and has interpolation keys in msg
128
128
  if defined?(I18n) && !@validator.send(:custom_error_messages).include?(option)
129
- msg = @record.errors.generate_message(@expected, option, interpolate)
129
+ msg = if defined?(ActiveRecord::Error)
130
+ ActiveRecord::Error.new(@record, @expected, option, interpolate).message
131
+ else
132
+ @record.errors.generate_message(@expected, option, interpolate)
133
+ end
130
134
  else
131
135
  msg = msg % interpolate
132
136
  end
@@ -32,21 +32,13 @@ module ValidatesTimeliness
32
32
  raw_value = raw_value(record, attr_name) || value
33
33
 
34
34
  if value.is_a?(String) || configuration[:format]
35
- strict = !configuration[:format].nil?
36
- value = ValidatesTimeliness::Parser.parse(raw_value, type, :strict => strict, :format => configuration[:format])
35
+ value = ValidatesTimeliness::Parser.parse(raw_value, type, :strict => false, :format => configuration[:format])
37
36
  end
38
37
 
39
38
  return if (raw_value.nil? && configuration[:allow_nil]) || (raw_value.blank? && configuration[:allow_blank])
40
39
 
41
- if raw_value.blank?
42
- add_error(record, attr_name, :blank)
43
- return
44
- end
45
-
46
- if value.nil?
47
- add_error(record, attr_name, "invalid_#{type}".to_sym)
48
- return
49
- end
40
+ return add_error(record, attr_name, :blank) if raw_value.blank?
41
+ return add_error(record, attr_name, "invalid_#{type}".to_sym) if value.nil?
50
42
 
51
43
  validate_restrictions(record, attr_name, value)
52
44
  end
@@ -62,21 +54,20 @@ module ValidatesTimeliness
62
54
  end
63
55
 
64
56
  def validate_restrictions(record, attr_name, value)
65
- value = if configuration[:with_time] || configuration[:with_date]
66
- restriction_type = :datetime
67
- combine_date_and_time(value, record)
68
- else
69
- restriction_type = type
70
- self.class.type_cast_value(value, type, configuration[:ignore_usec])
57
+ if configuration[:with_time] || configuration[:with_date]
58
+ value = combine_date_and_time(value, record)
71
59
  end
60
+
61
+ value = self.class.type_cast_value(value, implied_type, configuration[:ignore_usec])
62
+
72
63
  return if value.nil?
73
64
 
74
65
  RESTRICTION_METHODS.each do |option, method|
75
66
  next unless restriction = configuration[option]
76
67
  begin
77
- restriction = self.class.evaluate_option_value(restriction, restriction_type, record)
68
+ restriction = self.class.evaluate_option_value(restriction, implied_type, record)
78
69
  next if restriction.nil?
79
- restriction = self.class.type_cast_value(restriction, restriction_type, configuration[:ignore_usec])
70
+ restriction = self.class.type_cast_value(restriction, implied_type, configuration[:ignore_usec])
80
71
 
81
72
  unless evaluate_restriction(restriction, value, method)
82
73
  add_error(record, attr_name, option, interpolation_values(option, restriction))
@@ -155,6 +146,10 @@ module ValidatesTimeliness
155
146
  options.assert_valid_keys(VALID_OPTIONS - invalid_for_type)
156
147
  end
157
148
 
149
+ def implied_type
150
+ @implied_type ||= configuration[:with_date] || configuration[:with_time] ? :datetime : type
151
+ end
152
+
158
153
  # class methods
159
154
  class << self
160
155
 
@@ -185,7 +180,8 @@ module ValidatesTimeliness
185
180
  when Symbol
186
181
  evaluate_option_value(record.send(value), type, record)
187
182
  when Proc
188
- evaluate_option_value(value.call(record), type, record)
183
+ result = value.arity > 0 ? value.call(record) : value.call
184
+ evaluate_option_value(result, type, record)
189
185
  when Array
190
186
  value.map {|r| evaluate_option_value(r, type, record) }.sort
191
187
  when Range
@@ -0,0 +1,3 @@
1
+ module ValidatesTimeliness
2
+ VERSION = "2.2.0"
3
+ end
@@ -2,7 +2,6 @@ require 'validates_timeliness/formats'
2
2
  require 'validates_timeliness/parser'
3
3
  require 'validates_timeliness/validator'
4
4
  require 'validates_timeliness/validation_methods'
5
- require 'validates_timeliness/spec/rails/matchers/validate_timeliness' if ENV['RAILS_ENV'] == 'test'
6
5
 
7
6
  require 'validates_timeliness/active_record/attribute_methods'
8
7
  require 'validates_timeliness/active_record/multiparameter_attributes'
@@ -1,6 +1,10 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- describe ValidatesTimeliness::ActionView::InstanceTag, :type => :helper do
3
+ ValidatesTimeliness.enable_datetime_select_extension!
4
+
5
+ describe 'ValidatesTimeliness::ActionView::InstanceTag' do
6
+ include ActionView::Helpers::DateHelper
7
+ include ActionController::Assertions::SelectorAssertions
4
8
 
5
9
  before do
6
10
  @person = Person.new
@@ -6,17 +6,17 @@ describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
6
6
  end
7
7
 
8
8
  it "should convert array for datetime type into datetime string" do
9
- time_string = obj.time_array_to_string([2000,2,1,9,10,11], :datetime)
9
+ time_string = time_array_to_string([2000,2,1,9,10,11], :datetime)
10
10
  time_string.should == "2000-02-01 09:10:11"
11
11
  end
12
12
 
13
13
  it "should convert array for date type into date string" do
14
- time_string = obj.time_array_to_string([2000,2,1], :date)
14
+ time_string = time_array_to_string([2000,2,1], :date)
15
15
  time_string.should == "2000-02-01"
16
16
  end
17
17
 
18
18
  it "should convert array for time type into time string" do
19
- time_string = obj.time_array_to_string([2000,1,1,9,10,11], :time)
19
+ time_string = time_array_to_string([2000,1,1,9,10,11], :time)
20
20
  time_string.should == "09:10:11"
21
21
  end
22
22
 
@@ -44,5 +44,9 @@ describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
44
44
  obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
45
45
  end
46
46
  end
47
+
48
+ def time_array_to_string(*args)
49
+ ValidatesTimeliness::ActiveRecord.time_array_to_string(*args)
50
+ end
47
51
 
48
52
  end
data/spec/formats_spec.rb CHANGED
@@ -1,11 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe ValidatesTimeliness::Formats do
4
- attr_reader :formats
5
-
6
- before do
7
- @formats = ValidatesTimeliness::Formats
8
- end
9
4
 
10
5
  describe "format proc generator" do
11
6
  it "should generate proc which outputs date array with values in correct order" do
@@ -104,7 +99,7 @@ describe ValidatesTimeliness::Formats do
104
99
 
105
100
  it "should return time array from date string" do
106
101
  time_array = formats.parse('12:13:14', :time, :strict => true)
107
- time_array.should == [0,0,0,12,13,14,0]
102
+ time_array.should == [2000,1,1,12,13,14,0]
108
103
  end
109
104
 
110
105
  it "should return date array from time string" do
@@ -134,7 +129,7 @@ describe ValidatesTimeliness::Formats do
134
129
 
135
130
  it "should ignore date when extracting time and strict is false" do
136
131
  time_array = formats.parse('2000-02-01 12:13', :time, :strict => false)
137
- time_array.should == [0,0,0,12,13,0,0]
132
+ time_array.should == [2000,1,1,12,13,0,0]
138
133
  end
139
134
 
140
135
  it "should return zone offset when :include_offset options is true" do
@@ -177,6 +172,22 @@ describe ValidatesTimeliness::Formats do
177
172
  end
178
173
  end
179
174
 
175
+ describe "parse with custom dummy date values" do
176
+ before(:all) do
177
+ @old_dummy_date = formats.dummy_date_for_time_type
178
+ formats.dummy_date_for_time_type = [2009,1,1]
179
+ end
180
+
181
+ it "should return time array with custom dummy date" do
182
+ time_array = formats.parse('12:13:14', :time, :strict => true)
183
+ time_array.should == [2009,1,1,12,13,14,0]
184
+ end
185
+
186
+ after(:all) do
187
+ formats.dummy_date_for_time_type = @old_dummy_date
188
+ end
189
+ end
190
+
180
191
  describe "removing formats" do
181
192
  it "should remove format from format array" do
182
193
  formats.remove_formats(:time, 'h.nn_ampm')
@@ -219,7 +230,7 @@ describe ValidatesTimeliness::Formats do
219
230
  formats.add_formats(:time, "ss:hh:nn", :before => 'hh:nn:ss')
220
231
  validate("59:23:58", :time).should be_true
221
232
  time_array = formats.parse('59:23:58', :time)
222
- time_array.should == [0,0,0,23,58,59,0]
233
+ time_array.should == [2000,1,1,23,58,59,0]
223
234
  end
224
235
 
225
236
  it "should raise error if format exists" do
@@ -251,6 +262,11 @@ describe ValidatesTimeliness::Formats do
251
262
  end
252
263
  end
253
264
 
265
+
266
+ def formats
267
+ ValidatesTimeliness::Formats
268
+ end
269
+
254
270
  def validate(time_string, type)
255
271
  valid = false
256
272
  formats.send("#{type}_expressions").each do |format, regexp, processor|
@@ -9,7 +9,7 @@
9
9
  # ginger spec
10
10
  #
11
11
  Ginger.configure do |config|
12
- rails_versions = ['2.0.2', '2.1.2', '2.2.2', '2.3.2']
12
+ rails_versions = ['2.0.2', '2.1.2', '2.2.2', '2.3.3', '2.3.4']
13
13
 
14
14
  rails_versions.each do |v|
15
15
  g = Ginger::Scenario.new("Rails #{v}")
@@ -1,4 +1,5 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+ require 'validates_timeliness/matcher'
2
3
 
3
4
  class NoValidation < Person
4
5
  end
data/spec/spec_helper.rb CHANGED
@@ -45,8 +45,7 @@ if RAILS_VER >= '2.1'
45
45
  end
46
46
 
47
47
  require 'validates_timeliness'
48
-
49
- ValidatesTimeliness.enable_datetime_select_extension!
48
+ require 'validates_timeliness/matcher'
50
49
 
51
50
  ActiveRecord::Migration.verbose = false
52
51
  ActiveRecord::Base.establish_connection({:adapter => 'sqlite3', :database => ':memory:'})
@@ -358,18 +358,6 @@ describe ValidatesTimeliness::Validator do
358
358
  should_have_error(:birth_date_and_time, :equal_to)
359
359
  end
360
360
 
361
- it "should have error when value is equal to :equal_to restriction for all values except microscond, and microsecond is not ignored" do
362
- configure_validator(:equal_to => Time.utc(2000, 1, 1, 0, 0, 0, 0), :ignore_usec => false)
363
- validate_with(:birth_date_and_time, Time.utc(2000, 1, 1, 0, 0, 0, 500))
364
- should_have_error(:birth_date_and_time, :equal_to)
365
- end
366
-
367
- it "should be valid when value is equal to :equal_to restriction for all values except microscond, and microsecond is ignored" do
368
- configure_validator(:equal_to => Time.utc(2000, 1, 1, 0, 0, 0, 0), :ignore_usec => true)
369
- validate_with(:birth_date_and_time, Time.utc(2000, 1, 1, 0, 0, 0, 500))
370
- should_have_no_error(:birth_date_and_time, :equal_to)
371
- end
372
-
373
361
  it "should be valid when value is equal to :equal_to restriction" do
374
362
  validate_with(:birth_date_and_time, Time.now)
375
363
  should_have_no_error(:birth_date_and_time, :equal_to)
@@ -409,6 +397,16 @@ describe ValidatesTimeliness::Validator do
409
397
  end
410
398
  end
411
399
 
400
+ describe "instance with :ignore_usec option" do
401
+
402
+ it "should ignore usec on time values when evaluated" do
403
+ configure_validator(:equal_to => Time.utc(2000, 1, 1, 0, 0, 0, 0), :ignore_usec => true)
404
+ validate_with(:birth_date_and_time, Time.utc(2000, 1, 1, 0, 0, 0, 500))
405
+ should_have_no_error(:birth_date_and_time, :equal_to)
406
+ end
407
+
408
+ end
409
+
412
410
  describe "instance with :with_time option" do
413
411
 
414
412
  it "should validate date attribute as datetime combining value of :with_time against restrictions " do
@@ -423,20 +421,31 @@ describe ValidatesTimeliness::Validator do
423
421
  should_have_no_error(:birth_date, :on_or_before)
424
422
  end
425
423
 
424
+ it "should should ignore usec value on combined value if :ignore_usec option is true" do
425
+ configure_validator(:type => :date, :with_time => Time.mktime(2000,1,1,12,30,0,500), :equal_to => Time.mktime(2000,1,1,12,30), :ignore_usec => true)
426
+ validate_with(:birth_date, "2000-01-01")
427
+ should_have_no_error(:birth_date, :equal_to)
428
+ end
426
429
  end
427
430
 
428
431
  describe "instance with :with_date option" do
429
432
 
430
433
  it "should validate time attribute as datetime combining value of :with_date against restrictions " do
431
434
  configure_validator(:type => :time, :with_date => '2009-01-01', :on_or_before => Time.mktime(2000,1,1,12,30))
432
- validate_with(:birth_date, "12:30")
433
- should_have_error(:birth_date, :on_or_before)
435
+ validate_with(:birth_time, "12:30")
436
+ should_have_error(:birth_time, :on_or_before)
434
437
  end
435
438
 
436
439
  it "should skip restriction validation if :with_date value is nil" do
437
440
  configure_validator(:type => :time, :with_date => nil, :on_or_before => Time.mktime(2000,1,1,12,30))
438
- validate_with(:birth_date, "12:30")
439
- should_have_no_error(:birth_date, :on_or_before)
441
+ validate_with(:birth_time, "12:30")
442
+ should_have_no_error(:birth_time, :on_or_before)
443
+ end
444
+
445
+ it "should should ignore usec value on combined value if :ignore_usec option is true" do
446
+ configure_validator(:type => :time, :with_date => Date.new(2000,1,1), :on_or_before => Time.mktime(2000,1,1,12,30), :ignore_usec => true)
447
+ validate_with(:birth_time, Time.mktime(2000,1,1,12,30,0,50))
448
+ should_have_no_error(:birth_time, :on_or_before)
440
449
  end
441
450
  end
442
451
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_timeliness
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Meehan
@@ -9,7 +9,7 @@ autorequire: validates_timeliness
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-20 00:00:00 +10:00
12
+ date: 2009-09-12 00:00:00 +10:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -33,6 +33,7 @@ files:
33
33
  - lib/validates_timeliness/active_record/multiparameter_attributes.rb
34
34
  - lib/validates_timeliness/active_record/attribute_methods.rb
35
35
  - lib/validates_timeliness/parser.rb
36
+ - lib/validates_timeliness/version.rb
36
37
  - lib/validates_timeliness/core_ext/date.rb
37
38
  - lib/validates_timeliness/core_ext/time.rb
38
39
  - lib/validates_timeliness/core_ext/date_time.rb
@@ -40,6 +41,7 @@ files:
40
41
  - lib/validates_timeliness/validation_methods.rb
41
42
  - lib/validates_timeliness/locale/en.yml
42
43
  - lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb
44
+ - lib/validates_timeliness/matcher.rb
43
45
  - lib/validates_timeliness/action_view/instance_tag.rb
44
46
  - lib/validates_timeliness/formats.rb
45
47
  - lib/validates_timeliness.rb