validates_timeliness 3.0.15 → 4.0.0

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +21 -0
  3. data/CHANGELOG.rdoc +0 -5
  4. data/README.rdoc +5 -5
  5. data/gemfiles/rails_4_0.gemfile +19 -0
  6. data/gemfiles/rails_4_1.gemfile +19 -0
  7. data/gemfiles/rails_4_2.gemfile +19 -0
  8. data/lib/generators/validates_timeliness/templates/validates_timeliness.rb +2 -2
  9. data/lib/validates_timeliness.rb +1 -1
  10. data/lib/validates_timeliness/attribute_methods.rb +36 -36
  11. data/lib/validates_timeliness/extensions.rb +3 -4
  12. data/lib/validates_timeliness/extensions/date_time_select.rb +2 -9
  13. data/lib/validates_timeliness/extensions/multiparameter_handler.rb +59 -65
  14. data/lib/validates_timeliness/helper_methods.rb +8 -2
  15. data/lib/validates_timeliness/orm/active_record.rb +59 -13
  16. data/lib/validates_timeliness/validator.rb +13 -5
  17. data/lib/validates_timeliness/version.rb +1 -1
  18. data/spec/spec_helper.rb +3 -2
  19. data/spec/support/model_helpers.rb +4 -4
  20. data/spec/support/tag_matcher.rb +35 -0
  21. data/spec/support/test_model.rb +0 -1
  22. data/spec/validates_timeliness/attribute_methods_spec.rb +10 -10
  23. data/spec/validates_timeliness/conversion_spec.rb +41 -41
  24. data/spec/validates_timeliness/extensions/date_time_select_spec.rb +5 -4
  25. data/spec/validates_timeliness/extensions/multiparameter_handler_spec.rb +8 -7
  26. data/spec/validates_timeliness/helper_methods_spec.rb +8 -8
  27. data/spec/validates_timeliness/orm/active_record_spec.rb +37 -37
  28. data/spec/validates_timeliness/validator/after_spec.rb +3 -3
  29. data/spec/validates_timeliness/validator/before_spec.rb +3 -3
  30. data/spec/validates_timeliness/validator/is_at_spec.rb +4 -4
  31. data/spec/validates_timeliness/validator/on_or_after_spec.rb +3 -3
  32. data/spec/validates_timeliness/validator/on_or_before_spec.rb +3 -3
  33. data/spec/validates_timeliness/validator_spec.rb +26 -26
  34. data/spec/validates_timeliness_spec.rb +8 -8
  35. metadata +7 -11
  36. data/gemfiles/mongoid_2_1.gemfile +0 -16
  37. data/gemfiles/mongoid_2_2.gemfile +0 -16
  38. data/gemfiles/mongoid_2_3.gemfile +0 -16
  39. data/gemfiles/mongoid_2_4.gemfile +0 -16
  40. data/gemfiles/rails_3_0.gemfile +0 -15
  41. data/gemfiles/rails_3_1.gemfile +0 -15
  42. data/gemfiles/rails_3_2.gemfile +0 -15
  43. data/lib/validates_timeliness/orm/mongoid.rb +0 -49
  44. data/spec/validates_timeliness/orm/mongoid_spec.rb +0 -223
@@ -14,8 +14,14 @@ module ActiveModel
14
14
  timeliness_validation_for attr_names, :datetime
15
15
  end
16
16
 
17
- def timeliness_validation_for(attr_names, type)
18
- validates_with TimelinessValidator, _merge_attributes(attr_names).merge(:type => type)
17
+ def validates_timeliness_of(*attr_names)
18
+ timeliness_validation_for attr_names
19
+ end
20
+
21
+ def timeliness_validation_for(attr_names, type=nil)
22
+ options = _merge_attributes(attr_names)
23
+ options.update(:type => type) if type
24
+ validates_with TimelinessValidator, options
19
25
  end
20
26
  end
21
27
 
@@ -14,28 +14,74 @@ module ValidatesTimeliness
14
14
  timeliness_column_for_attribute(attr_name).type
15
15
  end
16
16
 
17
- def timeliness_column_for_attribute(attr_name)
18
- columns_hash.fetch(attr_name.to_s) do |attr_name|
19
- validation_type = _validators[attr_name.to_sym].find {|v| v.kind == :timeliness }.type
20
- ::ActiveRecord::ConnectionAdapters::Column.new(attr_name, nil, validation_type.to_s)
17
+ if ActiveModel.version >= Gem::Version.new('4.2')
18
+ def timeliness_column_for_attribute(attr_name)
19
+ columns_hash.fetch(attr_name.to_s) do |attr_name|
20
+ validation_type = _validators[attr_name.to_sym].find {|v| v.kind == :timeliness }.type.to_s
21
+ ::ActiveRecord::ConnectionAdapters::Column.new(attr_name, nil, lookup_cast_type(validation_type), validation_type)
22
+ end
23
+ end
24
+
25
+ def lookup_cast_type(sql_type)
26
+ case sql_type
27
+ when 'datetime' then ::ActiveRecord::Type::DateTime.new
28
+ when 'date' then ::ActiveRecord::Type::Date.new
29
+ when 'time' then ::ActiveRecord::Type::Time.new
30
+ end
31
+ end
32
+ else
33
+ def timeliness_column_for_attribute(attr_name)
34
+ columns_hash.fetch(attr_name.to_s) do |attr_name|
35
+ validation_type = _validators[attr_name.to_sym].find {|v| v.kind == :timeliness }.type.to_s
36
+ ::ActiveRecord::ConnectionAdapters::Column.new(attr_name, nil, validation_type)
37
+ end
21
38
  end
22
39
  end
23
40
 
24
41
  def define_attribute_methods
25
- super.tap do |attribute_methods_generated|
26
- define_timeliness_methods true
27
- end
42
+ super.tap {
43
+ generated_timeliness_methods.synchronize do
44
+ return if @timeliness_methods_generated
45
+ define_timeliness_methods true
46
+ @timeliness_methods_generated = true
47
+ end
48
+ }
28
49
  end
29
50
 
30
- protected
51
+ def undefine_attribute_methods
52
+ super.tap {
53
+ generated_timeliness_methods.synchronize do
54
+ return unless @timeliness_methods_generated
55
+ undefine_timeliness_attribute_methods
56
+ @timeliness_methods_generated = true
57
+ end
58
+ }
59
+ end
60
+ # Override to overwrite methods in ActiveRecord attribute method module because in AR 4+
61
+ # there is curious code which calls the method directly from the generated methods module
62
+ # via bind inside method_missing. This means our method in the formerly custom timeliness
63
+ # methods module was never reached.
64
+ def generated_timeliness_methods
65
+ generated_attribute_methods
66
+ end
67
+ end
31
68
 
32
- def timeliness_type_cast_code(attr_name, var_name)
33
- type = timeliness_attribute_type(attr_name)
69
+ def write_timeliness_attribute(attr_name, value)
70
+ @timeliness_cache ||= {}
71
+ @timeliness_cache[attr_name] = value
34
72
 
35
- method_body = super
36
- method_body << "\n#{var_name} = #{var_name}.to_date if #{var_name}" if type == :date
37
- method_body
73
+ if ValidatesTimeliness.use_plugin_parser
74
+ type = self.class.timeliness_attribute_type(attr_name)
75
+ timezone = :current if self.class.timeliness_attribute_timezone_aware?(attr_name)
76
+ value = Timeliness::Parser.parse(value, type, :zone => timezone)
77
+ value = value.to_date if value && type == :date
38
78
  end
79
+
80
+ write_attribute(attr_name, value)
81
+ end
82
+
83
+ def read_timeliness_attribute_before_type_cast(attr_name)
84
+ @timeliness_cache && @timeliness_cache[attr_name] || read_attribute_before_type_cast(attr_name)
39
85
  end
40
86
 
41
87
  def reload(*args)
@@ -5,7 +5,7 @@ module ValidatesTimeliness
5
5
  class Validator < ActiveModel::EachValidator
6
6
  include Conversion
7
7
 
8
- attr_reader :type
8
+ attr_reader :type, :attributes
9
9
 
10
10
  RESTRICTIONS = {
11
11
  :is_at => :==,
@@ -42,16 +42,24 @@ module ValidatesTimeliness
42
42
  end
43
43
 
44
44
  @restrictions_to_check = RESTRICTIONS.keys & options.keys
45
+
45
46
  super
47
+
48
+ setup_timeliness_validated_attributes(options[:class]) if options[:class]
46
49
  end
47
50
 
48
- def setup(model)
51
+ def setup_timeliness_validated_attributes(model)
49
52
  if model.respond_to?(:timeliness_validated_attributes)
50
53
  model.timeliness_validated_attributes ||= []
51
- model.timeliness_validated_attributes |= @attributes
54
+ model.timeliness_validated_attributes |= attributes
52
55
  end
53
56
  end
54
57
 
58
+ # Rails 4.0 compatibility for old #setup method with class as arg
59
+ if ActiveModel.version <= Gem::Version.new('4.1')
60
+ alias_method(:setup, :setup_timeliness_validated_attributes)
61
+ end
62
+
55
63
  def validate_each(record, attr_name, value)
56
64
  raw_value = attribute_raw_value(record, attr_name) || value
57
65
  return if (@allow_nil && raw_value.nil?) || (@allow_blank && raw_value.blank?)
@@ -93,8 +101,8 @@ module ValidatesTimeliness
93
101
  end
94
102
 
95
103
  def attribute_raw_value(record, attr_name)
96
- record.respond_to?(:_timeliness_raw_value_for) &&
97
- record._timeliness_raw_value_for(attr_name.to_s)
104
+ record.respond_to?(:read_timeliness_attribute_before_type_cast) &&
105
+ record.read_timeliness_attribute_before_type_cast(attr_name.to_s)
98
106
  end
99
107
 
100
108
  def timezone_aware?(record, attr_name)
@@ -1,3 +1,3 @@
1
1
  module ValidatesTimeliness
2
- VERSION = '3.0.15'
2
+ VERSION = '4.0.0'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -5,13 +5,13 @@ require 'active_model/validations'
5
5
  require 'active_record'
6
6
  require 'action_view'
7
7
  require 'timecop'
8
- require 'rspec_tag_matchers'
9
8
 
10
9
  require 'validates_timeliness'
11
10
 
12
11
  require 'support/test_model'
13
12
  require 'support/model_helpers'
14
13
  require 'support/config_helper'
14
+ require 'support/tag_matcher'
15
15
 
16
16
  ValidatesTimeliness.setup do |c|
17
17
  c.extend_orms = [ :active_record ]
@@ -24,6 +24,7 @@ Time.zone = 'Australia/Melbourne'
24
24
 
25
25
  LOCALE_PATH = File.expand_path(File.dirname(__FILE__) + '/../lib/generators/validates_timeliness/templates/en.yml')
26
26
  I18n.load_path.unshift(LOCALE_PATH)
27
+ I18n.available_locales = ['en', 'es']
27
28
 
28
29
  # Extend TestModel as you would another ORM/ODM module
29
30
  module TestModelShim
@@ -85,7 +86,7 @@ end
85
86
 
86
87
  RSpec.configure do |c|
87
88
  c.mock_with :rspec
88
- c.include(RspecTagMatchers)
89
+ c.include(TagMatcher)
89
90
  c.include(ModelHelpers)
90
91
  c.include(ConfigHelper)
91
92
  c.before do
@@ -3,15 +3,15 @@ module ModelHelpers
3
3
  # Some test helpers from Rails source
4
4
  def invalid!(attr_name, values, error = nil)
5
5
  with_each_person_value(attr_name, values) do |record, value|
6
- record.should be_invalid
7
- record.errors[attr_name].size.should >= 1
8
- record.errors[attr_name].first.should == error if error
6
+ expect(record).to be_invalid
7
+ expect(record.errors[attr_name].size).to be >= 1
8
+ expect(record.errors[attr_name].first).to eq(error) if error
9
9
  end
10
10
  end
11
11
 
12
12
  def valid!(attr_name, values)
13
13
  with_each_person_value(attr_name, values) do |record, value|
14
- record.should be_valid
14
+ expect(record).to be_valid
15
15
  end
16
16
  end
17
17
 
@@ -0,0 +1,35 @@
1
+ require 'nokogiri'
2
+
3
+ module TagMatcher
4
+ extend RSpec::Matchers::DSL
5
+
6
+ matcher :have_tag do |selector|
7
+ match do |subject|
8
+ matches = doc(subject).search(selector)
9
+
10
+ if @inner_text
11
+ matches = matches.select { |element| element.inner_text == @inner_text }
12
+ end
13
+
14
+ matches.any?
15
+ end
16
+
17
+ chain :with_inner_text do |inner_text|
18
+ @inner_text = inner_text
19
+ end
20
+
21
+ private
22
+
23
+ def body(subject)
24
+ if subject.respond_to?(:body)
25
+ subject.body
26
+ else
27
+ subject.to_s
28
+ end
29
+ end
30
+
31
+ def doc(subject)
32
+ @doc ||= Nokogiri::HTML(body(subject))
33
+ end
34
+ end
35
+ end
@@ -5,7 +5,6 @@ module TestModel
5
5
  include ActiveModel::AttributeMethods
6
6
 
7
7
  included do
8
- attribute_method_suffix ""
9
8
  attribute_method_suffix "="
10
9
  cattr_accessor :model_attributes
11
10
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ValidatesTimeliness::AttributeMethods do
4
- it 'should define _timeliness_raw_value_for instance method' do
5
- PersonWithShim.new.should respond_to(:_timeliness_raw_value_for)
4
+ it 'should define read_timeliness_attribute_before_type_cast instance method' do
5
+ expect(PersonWithShim.new).to respond_to(:read_timeliness_attribute_before_type_cast)
6
6
  end
7
7
 
8
8
  describe ".timeliness_validated_attributes" do
@@ -12,7 +12,7 @@ describe ValidatesTimeliness::AttributeMethods do
12
12
  PersonWithShim.validates_time :birth_time
13
13
  PersonWithShim.validates_datetime :birth_datetime
14
14
 
15
- PersonWithShim.timeliness_validated_attributes.should == [ :birth_date, :birth_time, :birth_datetime ]
15
+ expect(PersonWithShim.timeliness_validated_attributes).to eq([ :birth_date, :birth_time, :birth_datetime ])
16
16
  end
17
17
  end
18
18
 
@@ -31,13 +31,13 @@ describe ValidatesTimeliness::AttributeMethods do
31
31
  it 'should cache attribute raw value' do
32
32
  r = PersonWithCache.new
33
33
  r.birth_datetime = date_string = '2010-01-01'
34
- r._timeliness_raw_value_for('birth_datetime').should == date_string
34
+ expect(r.read_timeliness_attribute_before_type_cast('birth_datetime')).to eq(date_string)
35
35
  end
36
36
 
37
37
  it 'should not overwrite user defined methods' do
38
38
  e = Employee.new
39
39
  e.birth_date = '2010-01-01'
40
- e.redefined_birth_date_called.should be_true
40
+ expect(e.redefined_birth_date_called).to be_truthy
41
41
  end
42
42
 
43
43
  it 'should be undefined if model class has dynamic attribute methods reset' do
@@ -46,13 +46,13 @@ describe ValidatesTimeliness::AttributeMethods do
46
46
  r = PersonWithShim.new
47
47
  r.birth_date = Time.now
48
48
 
49
- write_method = RUBY_VERSION < '1.9' ? 'birth_date=' : :birth_date=
49
+ write_method = :birth_date=
50
50
 
51
- PersonWithShim.send(:generated_timeliness_methods).instance_methods.should include(write_method)
51
+ expect(PersonWithShim.send(:generated_timeliness_methods).instance_methods).to include(write_method)
52
52
 
53
53
  PersonWithShim.undefine_attribute_methods
54
54
 
55
- PersonWithShim.send(:generated_timeliness_methods).instance_methods.should_not include(write_method)
55
+ expect(PersonWithShim.send(:generated_timeliness_methods).instance_methods).not_to include(write_method)
56
56
  end
57
57
 
58
58
  context "with plugin parser" do
@@ -70,7 +70,7 @@ describe ValidatesTimeliness::AttributeMethods do
70
70
  end
71
71
 
72
72
  it 'should parse a string value' do
73
- Timeliness::Parser.should_receive(:parse)
73
+ expect(Timeliness::Parser).to receive(:parse)
74
74
  r = PersonWithParser.new
75
75
  r.birth_date = '2010-01-01'
76
76
  end
@@ -80,7 +80,7 @@ describe ValidatesTimeliness::AttributeMethods do
80
80
 
81
81
  context "before_type_cast method" do
82
82
  it 'should not be defined if ORM does not support it' do
83
- PersonWithShim.new.should_not respond_to(:birth_datetime_before_type_cast)
83
+ expect(PersonWithShim.new).not_to respond_to(:birth_datetime_before_type_cast)
84
84
  end
85
85
  end
86
86
  end
@@ -12,68 +12,68 @@ describe ValidatesTimeliness::Conversion do
12
12
  describe "#type_cast_value" do
13
13
  describe "for date type" do
14
14
  it "should return same value for date value" do
15
- type_cast_value(Date.new(2010, 1, 1), :date).should == Date.new(2010, 1, 1)
15
+ expect(type_cast_value(Date.new(2010, 1, 1), :date)).to eq(Date.new(2010, 1, 1))
16
16
  end
17
17
 
18
18
  it "should return date part of time value" do
19
- type_cast_value(Time.mktime(2010, 1, 1, 0, 0, 0), :date).should == Date.new(2010, 1, 1)
19
+ expect(type_cast_value(Time.mktime(2010, 1, 1, 0, 0, 0), :date)).to eq(Date.new(2010, 1, 1))
20
20
  end
21
21
 
22
22
  it "should return date part of datetime value" do
23
- type_cast_value(DateTime.new(2010, 1, 1, 0, 0, 0), :date).should == Date.new(2010, 1, 1)
23
+ expect(type_cast_value(DateTime.new(2010, 1, 1, 0, 0, 0), :date)).to eq(Date.new(2010, 1, 1))
24
24
  end
25
25
 
26
26
  it 'should return nil for invalid value types' do
27
- type_cast_value(12, :date).should == nil
27
+ expect(type_cast_value(12, :date)).to eq(nil)
28
28
  end
29
29
  end
30
30
 
31
31
  describe "for time type" do
32
32
  it "should return same value for time value matching dummy date part" do
33
- type_cast_value(Time.utc(2000, 1, 1, 0, 0, 0), :time).should == Time.utc(2000, 1, 1, 0, 0, 0)
33
+ expect(type_cast_value(Time.utc(2000, 1, 1, 0, 0, 0), :time)).to eq(Time.utc(2000, 1, 1, 0, 0, 0))
34
34
  end
35
35
 
36
36
  it "should return dummy time value with same time part for time value with different date" do
37
- type_cast_value(Time.utc(2010, 1, 1, 0, 0, 0), :time).should == Time.utc(2000, 1, 1, 0, 0, 0)
37
+ expect(type_cast_value(Time.utc(2010, 1, 1, 0, 0, 0), :time)).to eq(Time.utc(2000, 1, 1, 0, 0, 0))
38
38
  end
39
39
 
40
40
  it "should return dummy time only for date value" do
41
- type_cast_value(Date.new(2010, 1, 1), :time).should == Time.utc(2000, 1, 1, 0, 0, 0)
41
+ expect(type_cast_value(Date.new(2010, 1, 1), :time)).to eq(Time.utc(2000, 1, 1, 0, 0, 0))
42
42
  end
43
43
 
44
44
  it "should return dummy date with time part for datetime value" do
45
- type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :time).should == Time.utc(2000, 1, 1, 12, 34, 56)
45
+ expect(type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :time)).to eq(Time.utc(2000, 1, 1, 12, 34, 56))
46
46
  end
47
47
 
48
48
  it 'should return nil for invalid value types' do
49
- type_cast_value(12, :time).should == nil
49
+ expect(type_cast_value(12, :time)).to eq(nil)
50
50
  end
51
51
  end
52
52
 
53
53
  describe "for datetime type" do
54
54
  it "should return Date as Time value" do
55
- type_cast_value(Date.new(2010, 1, 1), :datetime).should == Time.local_time(2010, 1, 1, 0, 0, 0)
55
+ expect(type_cast_value(Date.new(2010, 1, 1), :datetime)).to eq(Time.local(2010, 1, 1, 0, 0, 0))
56
56
  end
57
57
 
58
58
  it "should return same Time value" do
59
59
  value = Time.utc(2010, 1, 1, 12, 34, 56)
60
- type_cast_value(Time.utc(2010, 1, 1, 12, 34, 56), :datetime).should == value
60
+ expect(type_cast_value(Time.utc(2010, 1, 1, 12, 34, 56), :datetime)).to eq(value)
61
61
  end
62
62
 
63
63
  it "should return as Time with same component values" do
64
- type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :datetime).should == Time.utc(2010, 1, 1, 12, 34, 56)
64
+ expect(type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :datetime)).to eq(Time.utc(2010, 1, 1, 12, 34, 56))
65
65
  end
66
66
 
67
67
  it "should return same Time in correct zone if timezone aware" do
68
68
  @timezone_aware = true
69
69
  value = Time.utc(2010, 1, 1, 12, 34, 56)
70
70
  result = type_cast_value(value, :datetime)
71
- result.should == Time.zone.local(2010, 1, 1, 23, 34, 56)
72
- result.zone.should == 'EST'
71
+ expect(result).to eq(Time.zone.local(2010, 1, 1, 23, 34, 56))
72
+ expect(result.zone).to eq('AEDT')
73
73
  end
74
74
 
75
75
  it 'should return nil for invalid value types' do
76
- type_cast_value(12, :datetime).should == nil
76
+ expect(type_cast_value(12, :datetime)).to eq(nil)
77
77
  end
78
78
  end
79
79
 
@@ -82,41 +82,41 @@ describe ValidatesTimeliness::Conversion do
82
82
 
83
83
  it "should ignore usec on time values when evaluated" do
84
84
  value = Time.utc(2010, 1, 1, 12, 34, 56, 10000)
85
- type_cast_value(value, :datetime).should == Time.utc(2010, 1, 1, 12, 34, 56)
85
+ expect(type_cast_value(value, :datetime)).to eq(Time.utc(2010, 1, 1, 12, 34, 56))
86
86
  end
87
87
 
88
88
  it "should ignore usec and return time in correct zone if timezone aware" do
89
89
  @timezone_aware = true
90
90
  value = Time.utc(2010, 1, 1, 12, 34, 56, 10000)
91
91
  result = type_cast_value(value, :datetime)
92
- result.should == Time.zone.local(2010, 1, 1, 23, 34, 56)
93
- result.zone.should == 'EST'
92
+ expect(result).to eq(Time.zone.local(2010, 1, 1, 23, 34, 56))
93
+ expect(result.zone).to eq('AEDT')
94
94
  end
95
95
  end
96
96
  end
97
97
 
98
98
  describe "#dummy_time" do
99
99
  it 'should return Time with dummy date values but same time components' do
100
- dummy_time(Time.utc(2010, 11, 22, 12, 34, 56)).should == Time.utc(2000, 1, 1, 12, 34, 56)
100
+ expect(dummy_time(Time.utc(2010, 11, 22, 12, 34, 56))).to eq(Time.utc(2000, 1, 1, 12, 34, 56))
101
101
  end
102
102
 
103
103
  it 'should return same value for Time which already has dummy date values' do
104
- dummy_time(Time.utc(2000, 1, 1, 12, 34, 56)).should == Time.utc(2000, 1, 1, 12, 34, 56)
104
+ expect(dummy_time(Time.utc(2000, 1, 1, 12, 34, 56))).to eq(Time.utc(2000, 1, 1, 12, 34, 56))
105
105
  end
106
106
 
107
107
  it 'should return time component values shifted to current zone if timezone aware' do
108
108
  @timezone_aware = true
109
- dummy_time(Time.utc(2000, 1, 1, 12, 34, 56)).should == Time.zone.local(2000, 1, 1, 23, 34, 56)
109
+ expect(dummy_time(Time.utc(2000, 1, 1, 12, 34, 56))).to eq(Time.zone.local(2000, 1, 1, 23, 34, 56))
110
110
  end
111
111
 
112
112
  it 'should return base dummy time value for Date value' do
113
- dummy_time(Date.new(2010, 11, 22)).should == Time.utc(2000, 1, 1, 0, 0, 0)
113
+ expect(dummy_time(Date.new(2010, 11, 22))).to eq(Time.utc(2000, 1, 1, 0, 0, 0))
114
114
  end
115
115
 
116
116
  describe "with custom dummy date" do
117
117
  it 'should return dummy time with custom dummy date' do
118
118
  with_config(:dummy_date_for_time_type, [2010, 1, 1] ) do
119
- dummy_time(Time.utc(1999, 11, 22, 12, 34, 56)).should == Time.utc(2010, 1, 1, 12, 34, 56)
119
+ expect(dummy_time(Time.utc(1999, 11, 22, 12, 34, 56))).to eq(Time.utc(2010, 1, 1, 12, 34, 56))
120
120
  end
121
121
  end
122
122
  end
@@ -127,56 +127,56 @@ describe ValidatesTimeliness::Conversion do
127
127
 
128
128
  it 'should return Date object as is' do
129
129
  value = Date.new(2010,1,1)
130
- evaluate_option_value(value, person).should == value
130
+ expect(evaluate_option_value(value, person)).to eq(value)
131
131
  end
132
132
 
133
133
  it 'should return Time object as is' do
134
134
  value = Time.mktime(2010,1,1)
135
- evaluate_option_value(value, person).should == value
135
+ expect(evaluate_option_value(value, person)).to eq(value)
136
136
  end
137
137
 
138
138
  it 'should return DateTime object as is' do
139
139
  value = DateTime.new(2010,1,1,0,0,0)
140
- evaluate_option_value(value, person).should == value
140
+ expect(evaluate_option_value(value, person)).to eq(value)
141
141
  end
142
142
 
143
143
  it 'should return Time value returned from proc with 0 arity' do
144
144
  value = Time.mktime(2010,1,1)
145
- evaluate_option_value(lambda { value }, person).should == value
145
+ expect(evaluate_option_value(lambda { value }, person)).to eq(value)
146
146
  end
147
147
 
148
148
  it 'should return Time value returned by record attribute call in proc arity of 1' do
149
149
  value = Time.mktime(2010,1,1)
150
150
  person.birth_time = value
151
- evaluate_option_value(lambda {|r| r.birth_time }, person).should == value
151
+ expect(evaluate_option_value(lambda {|r| r.birth_time }, person)).to eq(value)
152
152
  end
153
153
 
154
154
  it 'should return Time value for attribute method symbol which returns Time' do
155
155
  value = Time.mktime(2010,1,1)
156
156
  person.birth_time = value
157
- evaluate_option_value(:birth_time, person).should == value
157
+ expect(evaluate_option_value(:birth_time, person)).to eq(value)
158
158
  end
159
159
 
160
160
  it 'should return Time value is default zone from string time value' do
161
161
  value = '2010-01-01 12:00:00'
162
- evaluate_option_value(value, person).should == Time.utc(2010,1,1,12,0,0)
162
+ expect(evaluate_option_value(value, person)).to eq(Time.utc(2010,1,1,12,0,0))
163
163
  end
164
164
 
165
165
  it 'should return Time value is current zone from string time value if timezone aware' do
166
166
  @timezone_aware = true
167
167
  value = '2010-01-01 12:00:00'
168
- evaluate_option_value(value, person).should == Time.zone.local(2010,1,1,12,0,0)
168
+ expect(evaluate_option_value(value, person)).to eq(Time.zone.local(2010,1,1,12,0,0))
169
169
  end
170
170
 
171
171
  it 'should return Time value in default zone from proc which returns string time' do
172
172
  value = '2010-01-01 12:00:00'
173
- evaluate_option_value(lambda { value }, person).should == Time.utc(2010,1,1,12,0,0)
173
+ expect(evaluate_option_value(lambda { value }, person)).to eq(Time.utc(2010,1,1,12,0,0))
174
174
  end
175
175
 
176
176
  it 'should return Time value for attribute method symbol which returns string time value' do
177
177
  value = '2010-01-01 12:00:00'
178
178
  person.birth_time = value
179
- evaluate_option_value(:birth_time, person).should == Time.utc(2010,1,1,12,0,0)
179
+ expect(evaluate_option_value(:birth_time, person)).to eq(Time.zone.local(2010,1,1,12,0,0))
180
180
  end
181
181
 
182
182
  context "restriction shorthand" do
@@ -185,17 +185,17 @@ describe ValidatesTimeliness::Conversion do
185
185
  end
186
186
 
187
187
  it 'should evaluate :now as current time' do
188
- evaluate_option_value(:now, person).should == Time.now
188
+ expect(evaluate_option_value(:now, person)).to eq(Time.now)
189
189
  end
190
190
 
191
191
  it 'should evaluate :today as current time' do
192
- evaluate_option_value(:today, person).should == Date.today
192
+ expect(evaluate_option_value(:today, person)).to eq(Date.today)
193
193
  end
194
194
 
195
195
  it 'should not use shorthand if symbol if is record method' do
196
196
  time = 1.day.from_now
197
- person.stub!(:now).and_return(time)
198
- evaluate_option_value(:now, person).should == time
197
+ allow(person).to receive(:now).and_return(time)
198
+ expect(evaluate_option_value(:now, person)).to eq(time)
199
199
  end
200
200
  end
201
201
  end
@@ -205,7 +205,7 @@ describe ValidatesTimeliness::Conversion do
205
205
  with_config(:use_plugin_parser, true)
206
206
 
207
207
  it 'should use timeliness' do
208
- Timeliness::Parser.should_receive(:parse)
208
+ expect(Timeliness::Parser).to receive(:parse)
209
209
  parse('2000-01-01')
210
210
  end
211
211
  end
@@ -215,20 +215,20 @@ describe ValidatesTimeliness::Conversion do
215
215
 
216
216
  it 'should use Time.zone.parse attribute is timezone aware' do
217
217
  @timezone_aware = true
218
- Time.zone.should_receive(:parse)
218
+ expect(Time.zone).to receive(:parse)
219
219
  parse('2000-01-01')
220
220
  end
221
221
 
222
222
  it 'should use value#to_time if use_plugin_parser setting is false and attribute is not timezone aware' do
223
223
  @timezone_aware = false
224
224
  value = '2000-01-01'
225
- value.should_receive(:to_time)
225
+ expect(value).to receive(:to_time)
226
226
  parse(value)
227
227
  end
228
228
  end
229
229
 
230
230
  it 'should return nil if value is nil' do
231
- parse(nil).should be_nil
231
+ expect(parse(nil)).to be_nil
232
232
  end
233
233
  end
234
234
  end