validates_timeliness 3.0.12 → 3.0.13

Sign up to get free protection for your applications and to get access to all the features.
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