validates_timeliness 3.0.12 → 3.0.13

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/Appraisals ADDED
@@ -0,0 +1,11 @@
1
+ appraise "rails_3_0" do
2
+ gem "rails", "~> 3.0.0"
3
+ end
4
+
5
+ appraise "rails_3_1" do
6
+ gem "rails", "~> 3.1.0"
7
+ end
8
+
9
+ appraise "rails_3_2" do
10
+ gem "rails", "~> 3.2.0"
11
+ end
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,7 @@
1
+ = 3.0.13 [2012-08-21]
2
+ * Fix ActiveRecord issues with using plugin parser by using old way of caching values.
3
+ * Allow any ActiveRecord non-column attribute to be validated
4
+
1
5
  = 3.0.12 [2012-06-23]
2
6
  * Fix load order issue when relying on Railtie to load ActiveRecord extension
3
7
 
data/README.rdoc CHANGED
@@ -1,7 +1,7 @@
1
1
  = ValidatesTimeliness
2
2
 
3
3
  * Source: http://github.com/adzap/validates_timeliness
4
- * Bugs: http://github.com/adzap/validates_timeliness/issues
4
+ * Issues: http://github.com/adzap/validates_timeliness/issues
5
5
 
6
6
  == Description
7
7
 
@@ -18,24 +18,19 @@ If you a looking for the old version for Rails 2.x go here[http://github.com/adz
18
18
 
19
19
  * Only Rails date/time validation plugin offering complete validation (See ORM/ODM support)
20
20
 
21
- * Adds extensions to fix Rails date/time select issues (See Extensions)
22
-
23
21
  * Uses extensible date/time parser (Using {timeliness gem}[http://github.com/adzap/timeliness]. See Plugin Parser)
24
22
 
25
- * Supports I18n for the error messages
26
-
27
- * Supports Ruby 1.8.x, 1.9.x and Rubinius.
23
+ * Adds extensions to fix Rails date/time select issues (See Extensions)
28
24
 
29
- == Installation
25
+ * Supports I18n for the error messages
30
26
 
31
- As plugin (from master)
27
+ * Supports all the Rubies (that any sane person would be using in production).
32
28
 
33
- rails plugin install git://github.com/adzap/validates_timeliness.git
34
29
 
35
- As gem
30
+ == Installation
36
31
 
37
32
  # in Gemfile
38
- gem 'validates_timeliness', '~> 3.0.2'
33
+ gem 'validates_timeliness', '~> 3.0'
39
34
 
40
35
  # Run bundler
41
36
  $ bundle install
@@ -55,7 +50,7 @@ NOTE: You may wish to enable the plugin parser and the extensions to start. Plea
55
50
  validates_datetime :occurred_at
56
51
 
57
52
  validates_date :date_of_birth, :before => lambda { 18.years.ago },
58
- :before_message => "must be at least 18 years old"
53
+ :before_message => "must be at least 18 years old"
59
54
 
60
55
  validates_datetime :finish_time, :after => :start_time # Method symbol
61
56
 
@@ -79,7 +74,7 @@ validation method
79
74
  validates :date_of_birth, :timeliness => {:on_or_before => lambda { Date.current }, :type => :date}
80
75
  end
81
76
 
82
- # or even on a specific record, per ActiveModel API.
77
+ or even on a specific record, per ActiveModel API.
83
78
 
84
79
  @person.validates_date :date_of_birth, :on_or_before => lambda { Date.current }
85
80
 
@@ -298,4 +293,4 @@ To see the generous people who have contributed code, take a look at the {contri
298
293
 
299
294
  == License
300
295
 
301
- Copyright (c) 2008-2010 Adam Meehan, released under the MIT license
296
+ Copyright (c) 2008 Adam Meehan, released under the MIT license
data/Rakefile CHANGED
@@ -1,7 +1,9 @@
1
1
  require 'bundler'
2
- Bundler::GemHelper.install_tasks
2
+ require 'bundler/setup'
3
+
4
+ require 'appraisal'
3
5
 
4
- Bundler.setup
6
+ Bundler::GemHelper.install_tasks
5
7
 
6
8
  require 'rake/rdoctask'
7
9
  require 'rspec/core/rake_task'
@@ -0,0 +1,15 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rspec", "~> 2.8"
6
+ gem "rspec-rails", "~> 2.8"
7
+ gem "timecop"
8
+ gem "rspec_tag_matchers"
9
+ gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
10
+ gem "debugger", :platforms=>[:ruby_19]
11
+ gem "appraisal"
12
+ gem "sqlite3"
13
+ gem "rails", "~> 3.0.0"
14
+
15
+ gemspec :path=>"../"
@@ -0,0 +1,15 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rspec", "~> 2.8"
6
+ gem "rspec-rails", "~> 2.8"
7
+ gem "timecop"
8
+ gem "rspec_tag_matchers"
9
+ gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
10
+ gem "debugger", :platforms=>[:ruby_19]
11
+ gem "appraisal"
12
+ gem "sqlite3"
13
+ gem "rails", "~> 3.1.0"
14
+
15
+ gemspec :path=>"../"
@@ -0,0 +1,15 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rspec", "~> 2.8"
6
+ gem "rspec-rails", "~> 2.8"
7
+ gem "timecop"
8
+ gem "rspec_tag_matchers"
9
+ gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
10
+ gem "debugger", :platforms=>[:ruby_19]
11
+ gem "appraisal"
12
+ gem "sqlite3"
13
+ gem "rails", "~> 3.2.0"
14
+
15
+ gemspec :path=>"../"
@@ -3,60 +3,31 @@ module ValidatesTimeliness
3
3
  module ActiveRecord
4
4
  extend ActiveSupport::Concern
5
5
 
6
- def self.use_plugin_cache?
7
- ::ActiveRecord::VERSION::STRING < '3.1.0'
8
- end
9
-
10
- included do
11
- if ValidatesTimeliness::ORM::ActiveRecord.use_plugin_cache?
12
- include Reload
13
- else
14
- # Just use the built-in before_type_cast retrieval
15
- alias_method :_timeliness_raw_value_for, :read_attribute_before_type_cast
16
- end
17
- end
18
-
19
6
  module ClassMethods
20
7
  public
21
8
 
22
9
  def timeliness_attribute_timezone_aware?(attr_name)
23
- attr_name = attr_name.to_s
24
- create_time_zone_conversion_attribute?(attr_name, columns_hash[attr_name])
10
+ create_time_zone_conversion_attribute?(attr_name, timeliness_column_for_attribute(attr_name))
25
11
  end
26
12
 
27
13
  def timeliness_attribute_type(attr_name)
28
- columns_hash[attr_name.to_s].type
14
+ timeliness_column_for_attribute(attr_name).type
29
15
  end
30
16
 
31
- def define_attribute_methods
32
- super.tap do |attribute_methods_generated|
33
- use_before_type_cast = ValidatesTimeliness::ORM::ActiveRecord.use_plugin_cache?
34
- define_timeliness_methods use_before_type_cast
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)
35
21
  end
36
22
  end
37
23
 
38
- protected
39
-
40
- def define_attribute_timeliness_methods(attr_name, before_type_cast=false)
41
- if before_type_cast
42
- define_timeliness_write_method(attr_name)
43
- define_timeliness_before_type_cast_method(attr_name)
44
- elsif ValidatesTimeliness.use_plugin_parser
45
- define_timeliness_write_method_without_cache(attr_name)
24
+ def define_attribute_methods
25
+ super.tap do |attribute_methods_generated|
26
+ define_timeliness_methods true
46
27
  end
47
28
  end
48
29
 
49
- def define_timeliness_write_method_without_cache(attr_name)
50
- method_body, line = <<-EOV, __LINE__ + 1
51
- def #{attr_name}=(value)
52
- original_value = value
53
- if value.is_a?(String)\n#{timeliness_type_cast_code(attr_name, 'value')}\nend
54
- super(value)
55
- @attributes['#{attr_name}'] = original_value
56
- end
57
- EOV
58
- generated_timeliness_methods.module_eval(method_body, __FILE__, line)
59
- end
30
+ protected
60
31
 
61
32
  def timeliness_type_cast_code(attr_name, var_name)
62
33
  type = timeliness_attribute_type(attr_name)
@@ -67,11 +38,9 @@ module ValidatesTimeliness
67
38
  end
68
39
  end
69
40
 
70
- module Reload
71
- def reload(*args)
72
- _clear_timeliness_cache
73
- super
74
- end
41
+ def reload(*args)
42
+ _clear_timeliness_cache
43
+ super
75
44
  end
76
45
 
77
46
  end
@@ -22,6 +22,10 @@ module ValidatesTimeliness
22
22
 
23
23
  RESTRICTION_ERROR_MESSAGE = "Error occurred validating %s for %s restriction:\n%s"
24
24
 
25
+ def self.kind
26
+ :timeliness
27
+ end
28
+
25
29
  def initialize(options)
26
30
  @type = options.delete(:type) || :datetime
27
31
  @allow_nil, @allow_blank = options.delete(:allow_nil), options.delete(:allow_blank)
@@ -1,3 +1,3 @@
1
1
  module ValidatesTimeliness
2
- VERSION = '3.0.12'
2
+ VERSION = '3.0.13'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -92,10 +92,7 @@ RSpec.configure do |c|
92
92
  reset_validation_setup_for(PersonWithShim)
93
93
  end
94
94
 
95
- RSpec.configure do |c|
96
- c.filter_run_excluding :active_record => lambda {|version|
97
- !(::ActiveRecord::VERSION::STRING.to_s =~ /^#{version.to_s}/)
98
- }
99
- end
100
-
95
+ c.filter_run_excluding :active_record => lambda {|version|
96
+ !(::ActiveRecord::VERSION::STRING.to_s =~ /^#{version.to_s}/)
97
+ }
101
98
  end
@@ -41,13 +41,44 @@ describe ValidatesTimeliness, 'ActiveRecord' do
41
41
  end
42
42
 
43
43
  it 'should determine type for attribute' do
44
- Employee.timeliness_attribute_type(:birth_date).should == :date
44
+ Employee.timeliness_attribute_type(:birth_date).should eq :date
45
+ end
46
+
47
+ context 'attribute timezone awareness' do
48
+ let(:klass) {
49
+ Class.new(ActiveRecord::Base) do
50
+ self.table_name = 'employees'
51
+ attr_accessor :some_date
52
+ attr_accessor :some_time
53
+ attr_accessor :some_datetime
54
+ validates_date :some_date
55
+ validates_time :some_time
56
+ validates_datetime :some_datetime
57
+ end
58
+ }
59
+
60
+ context 'for column attribute' do
61
+ it 'should be detected from column type' do
62
+ klass.timeliness_attribute_timezone_aware?(:birth_date).should be_false
63
+ klass.timeliness_attribute_timezone_aware?(:birth_time).should be_false
64
+ klass.timeliness_attribute_timezone_aware?(:birth_datetime).should be_true
65
+ end
66
+ end
67
+
68
+ context 'for non-column attribute' do
69
+ it 'should be detected from the validation type' do
70
+ klass.timeliness_attribute_timezone_aware?(:some_date).should be_false
71
+ klass.timeliness_attribute_timezone_aware?(:some_time).should be_false
72
+ klass.timeliness_attribute_timezone_aware?(:some_datetime).should be_true
73
+ end
74
+ end
45
75
  end
46
76
 
47
77
  context "attribute write method" do
48
78
  class EmployeeWithCache < ActiveRecord::Base
49
- set_table_name 'employees'
79
+ self.table_name = 'employees'
50
80
  validates_date :birth_date, :allow_blank => true
81
+ validates_time :birth_time, :allow_blank => true
51
82
  validates_datetime :birth_datetime, :allow_blank => true
52
83
  end
53
84
 
@@ -55,8 +86,9 @@ describe ValidatesTimeliness, 'ActiveRecord' do
55
86
  context 'for datetime column' do
56
87
  it 'should store raw value' do
57
88
  r = EmployeeWithCache.new
58
- r.birth_datetime = date_string = '2010-01-01'
59
- r._timeliness_raw_value_for('birth_datetime').should == date_string
89
+ r.birth_datetime = datetime_string = '2010-01-01 12:30'
90
+
91
+ r._timeliness_raw_value_for('birth_datetime').should eq datetime_string
60
92
  end
61
93
  end
62
94
 
@@ -64,7 +96,17 @@ describe ValidatesTimeliness, 'ActiveRecord' do
64
96
  it 'should store raw value' do
65
97
  r = EmployeeWithCache.new
66
98
  r.birth_date = date_string = '2010-01-01'
67
- r._timeliness_raw_value_for('birth_date').should == date_string
99
+
100
+ r._timeliness_raw_value_for('birth_date').should eq date_string
101
+ end
102
+ end
103
+
104
+ context 'for time column' do
105
+ it 'should store raw value' do
106
+ r = EmployeeWithCache.new
107
+ r.birth_time = time_string = '12:12'
108
+
109
+ r._timeliness_raw_value_for('birth_time').should eq time_string
68
110
  end
69
111
  end
70
112
  end
@@ -73,36 +115,76 @@ describe ValidatesTimeliness, 'ActiveRecord' do
73
115
  with_config(:use_plugin_parser, true)
74
116
 
75
117
  class EmployeeWithParser < ActiveRecord::Base
76
- set_table_name 'employees'
118
+ self.table_name = 'employees'
77
119
  validates_date :birth_date, :allow_blank => true
120
+ validates_time :birth_time, :allow_blank => true
78
121
  validates_datetime :birth_datetime, :allow_blank => true
79
122
  end
80
123
 
81
- it 'should parse a string value' do
82
- Timeliness::Parser.should_receive(:parse)
83
- r = EmployeeWithParser.new
84
- r.birth_date = '2010-01-01'
85
- end
124
+ context "for a date column" do
125
+ it 'should parse a string value' do
126
+ Timeliness::Parser.should_receive(:parse)
86
127
 
87
- it 'should parse a invalid string value as nil' do
88
- Timeliness::Parser.should_receive(:parse)
89
- r = EmployeeWithParser.new
90
- r.birth_date = 'not a date'
91
- end
128
+ r = EmployeeWithParser.new
129
+ r.birth_date = '2010-01-01'
130
+ end
92
131
 
93
- context "for a date column" do
94
- it 'should store a date value after parsing string' do
132
+ it 'should parse a invalid string value as nil' do
133
+ Timeliness::Parser.should_receive(:parse)
134
+ r = EmployeeWithParser.new
135
+ r.birth_date = 'not valid'
136
+ end
137
+
138
+ it 'should store a Date value after parsing string' do
95
139
  r = EmployeeWithParser.new
96
140
  r.birth_date = '2010-01-01'
97
141
 
98
142
  r.birth_date.should be_kind_of(Date)
99
- r.birth_date.should == Date.new(2010, 1, 1)
143
+ r.birth_date.should eq Date.new(2010, 1, 1)
144
+ end
145
+ end
146
+
147
+ context "for a time column" do
148
+ it 'should parse a string value' do
149
+ Timeliness::Parser.should_receive(:parse)
150
+
151
+ r = EmployeeWithParser.new
152
+ r.birth_time = '12:30'
153
+ end
154
+
155
+ it 'should parse a invalid string value as nil' do
156
+ Timeliness::Parser.should_receive(:parse)
157
+
158
+ r = EmployeeWithParser.new
159
+ r.birth_time = 'not valid'
160
+ end
161
+
162
+ it 'should store a Time value after parsing string' do
163
+ r = EmployeeWithParser.new
164
+ r.birth_time = '12:30'
165
+
166
+ r.birth_time.should be_kind_of(Time)
167
+ r.birth_time.should eq Time.utc(2000, 1, 1, 12, 30)
100
168
  end
101
169
  end
102
170
 
103
171
  context "for a datetime column" do
104
172
  with_config(:default_timezone, 'Australia/Melbourne')
105
173
 
174
+ it 'should parse a string value' do
175
+ Timeliness::Parser.should_receive(:parse)
176
+
177
+ r = EmployeeWithParser.new
178
+ r.birth_datetime = '2010-01-01 12:00'
179
+ end
180
+
181
+ it 'should parse a invalid string value as nil' do
182
+ Timeliness::Parser.should_receive(:parse)
183
+
184
+ r = EmployeeWithParser.new
185
+ r.birth_datetime = 'not valid'
186
+ end
187
+
106
188
  it 'should parse string into Time value' do
107
189
  r = EmployeeWithParser.new
108
190
  r.birth_datetime = '2010-01-01 12:00'
@@ -114,7 +196,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
114
196
  r = EmployeeWithParser.new
115
197
  r.birth_datetime = '2010-06-01 12:00'
116
198
 
117
- r.birth_datetime.utc_offset.should == Time.zone.utc_offset
199
+ r.birth_datetime.utc_offset.should eq Time.zone.utc_offset
118
200
  end
119
201
  end
120
202
  end
@@ -140,7 +222,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
140
222
  r = Employee.new
141
223
  r.birth_datetime = date_string = '2010-01-01'
142
224
 
143
- r.birth_datetime_before_type_cast.should == date_string
225
+ r.birth_datetime_before_type_cast.should eq date_string
144
226
  end
145
227
 
146
228
  it 'should return attribute if no attribute assignment has been made' do
@@ -158,7 +240,7 @@ describe ValidatesTimeliness, 'ActiveRecord' do
158
240
  r = Employee.new
159
241
  r.birth_datetime = date_string = '2010-01-31'
160
242
 
161
- r.birth_datetime_before_type_cast.should == date_string
243
+ r.birth_datetime_before_type_cast.should eq date_string
162
244
  end
163
245
  end
164
246
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_timeliness
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 0
9
- - 12
10
- version: 3.0.12
9
+ - 13
10
+ version: 3.0.13
11
11
  platform: ruby
12
12
  authors:
13
13
  - Adam Meehan
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-06-23 00:00:00 +10:00
18
+ date: 2012-08-21 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -45,10 +45,14 @@ extra_rdoc_files:
45
45
  - CHANGELOG.rdoc
46
46
  - LICENSE
47
47
  files:
48
+ - Appraisals
48
49
  - CHANGELOG.rdoc
49
50
  - LICENSE
50
51
  - README.rdoc
51
52
  - Rakefile
53
+ - gemfiles/rails_3_0.gemfile
54
+ - gemfiles/rails_3_1.gemfile
55
+ - gemfiles/rails_3_2.gemfile
52
56
  - init.rb
53
57
  - lib/generators/validates_timeliness/install_generator.rb
54
58
  - lib/generators/validates_timeliness/templates/en.yml