Compare commits

...

3 Commits

Author SHA1 Message Date
Adam Meehan
a1dfbf5d7d v3.0.14 2012-08-23 18:40:47 +10:00
Adam Meehan
02fbdc6028 Fix for validates :timeliness form to add attributes to plugin set 2012-08-23 18:38:33 +10:00
Adam Meehan
4fe22458d3 Add mongoid appraisals 2012-08-23 18:37:38 +10:00
13 changed files with 200 additions and 55 deletions

View File

@@ -9,3 +9,19 @@ end
appraise "rails_3_2" do appraise "rails_3_2" do
gem "rails", "~> 3.2.0" gem "rails", "~> 3.2.0"
end end
appraise "mongoid_2_1" do
gem "mongoid", "~> 2.1.0"
end
appraise "mongoid_2_2" do
gem "mongoid", "~> 2.2.0"
end
appraise "mongoid_2_3" do
gem "mongoid", "~> 2.3.0"
end
appraise "mongoid_2_4" do
gem "mongoid", "~> 2.4.0"
end

View File

@@ -1,3 +1,6 @@
= 3.0.14 [2012-08-23]
* Fix for using validates :timeliness => {} form to correctly add attributes to timeliness validated attributes.
= 3.0.13 [2012-08-21] = 3.0.13 [2012-08-21]
* Fix ActiveRecord issues with using plugin parser by using old way of caching values. * Fix ActiveRecord issues with using plugin parser by using old way of caching values.
* Allow any ActiveRecord non-column attribute to be validated * Allow any ActiveRecord non-column attribute to be validated

View File

@@ -0,0 +1,16 @@
# This file was generated by Appraisal
source "http://rubygems.org"
gem "rails", "~> 3.2.6"
gem "rspec", "~> 2.8"
gem "rspec-rails", "~> 2.8"
gem "timecop"
gem "rspec_tag_matchers"
gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
gem "debugger", :platforms=>[:ruby_19]
gem "appraisal"
gem "sqlite3"
gem "mongoid", "~> 2.1.0"
gemspec :path=>"../"

View File

@@ -0,0 +1,16 @@
# This file was generated by Appraisal
source "http://rubygems.org"
gem "rails", "~> 3.2.6"
gem "rspec", "~> 2.8"
gem "rspec-rails", "~> 2.8"
gem "timecop"
gem "rspec_tag_matchers"
gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
gem "debugger", :platforms=>[:ruby_19]
gem "appraisal"
gem "sqlite3"
gem "mongoid", "~> 2.2.0"
gemspec :path=>"../"

View File

@@ -0,0 +1,16 @@
# This file was generated by Appraisal
source "http://rubygems.org"
gem "rails", "~> 3.2.6"
gem "rspec", "~> 2.8"
gem "rspec-rails", "~> 2.8"
gem "timecop"
gem "rspec_tag_matchers"
gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
gem "debugger", :platforms=>[:ruby_19]
gem "appraisal"
gem "sqlite3"
gem "mongoid", "~> 2.3.0"
gemspec :path=>"../"

View File

@@ -0,0 +1,16 @@
# This file was generated by Appraisal
source "http://rubygems.org"
gem "rails", "~> 3.2.6"
gem "rspec", "~> 2.8"
gem "rspec-rails", "~> 2.8"
gem "timecop"
gem "rspec_tag_matchers"
gem "ruby-debug", :platforms=>[:ruby_18, :jruby]
gem "debugger", :platforms=>[:ruby_19]
gem "appraisal"
gem "sqlite3"
gem "mongoid", "~> 2.4.0"
gemspec :path=>"../"

View File

@@ -15,12 +15,7 @@ module ActiveModel
end end
def timeliness_validation_for(attr_names, type) def timeliness_validation_for(attr_names, type)
options = _merge_attributes(attr_names).merge(:type => type) validates_with TimelinessValidator, _merge_attributes(attr_names).merge(:type => type)
if respond_to?(:timeliness_validated_attributes)
self.timeliness_validated_attributes ||= []
self.timeliness_validated_attributes += (attr_names - self.timeliness_validated_attributes)
end
validates_with TimelinessValidator, options
end end
end end

View File

@@ -21,7 +21,7 @@ module ValidatesTimeliness
def timeliness_attribute_type(attr_name) def timeliness_attribute_type(attr_name)
{ {
Date => :date, Date => :date,
Time => :datetime, Time => :time,
DateTime => :datetime DateTime => :datetime
}[fields[attr_name.to_s].type] || :datetime }[fields[attr_name.to_s].type] || :datetime
end end

View File

@@ -39,6 +39,13 @@ module ValidatesTimeliness
super super
end end
def setup(model)
if model.respond_to?(:timeliness_validated_attributes)
model.timeliness_validated_attributes ||= []
model.timeliness_validated_attributes |= @attributes
end
end
def validate_each(record, attr_name, value) def validate_each(record, attr_name, value)
raw_value = attribute_raw_value(record, attr_name) || value raw_value = attribute_raw_value(record, attr_name) || value
return if (@allow_nil && raw_value.nil?) || (@allow_blank && raw_value.blank?) return if (@allow_nil && raw_value.nil?) || (@allow_blank && raw_value.blank?)

View File

@@ -1,3 +1,3 @@
module ValidatesTimeliness module ValidatesTimeliness
VERSION = '3.0.13' VERSION = '3.0.14'
end end

View File

@@ -5,6 +5,7 @@ begin
require 'mongoid' require 'mongoid'
require 'validates_timeliness/orm/mongoid' require 'validates_timeliness/orm/mongoid'
Mongoid.configure do |config| Mongoid.configure do |config|
name = "validates_timeliness_test" name = "validates_timeliness_test"
host = "localhost" host = "localhost"
@@ -16,17 +17,17 @@ describe ValidatesTimeliness, 'Mongoid' do
class Article class Article
include Mongoid::Document include Mongoid::Document
ValidatesTimeliness.use_plugin_parser = true
field :publish_date, :type => Date field :publish_date, :type => Date
field :publish_time, :type => Time field :publish_time, :type => Time
field :publish_datetime, :type => DateTime field :publish_datetime, :type => DateTime
validates_date :publish_date, :allow_nil => true validates_date :publish_date, :allow_nil => true
validates_time :publish_time, :allow_nil => true validates_time :publish_time, :allow_nil => true
validates_datetime :publish_datetime, :allow_nil => true validates_datetime :publish_datetime, :allow_nil => true
ValidatesTimeliness.use_plugin_parser = false
end end
context "validation methods" do context "validation methods" do
let(:record) { Article.new }
it 'should be defined on the class' do it 'should be defined on the class' do
Article.should respond_to(:validates_date) Article.should respond_to(:validates_date)
Article.should respond_to(:validates_time) Article.should respond_to(:validates_time)
@@ -34,33 +35,33 @@ describe ValidatesTimeliness, 'Mongoid' do
end end
it 'should be defined on the instance' do it 'should be defined on the instance' do
Article.new.should respond_to(:validates_date) record.should respond_to(:validates_date)
Article.new.should respond_to(:validates_time) record.should respond_to(:validates_time)
Article.new.should respond_to(:validates_datetime) record.should respond_to(:validates_datetime)
end end
it "should validate a valid value string" do it "should validate a valid value string" do
r = Article.new record.publish_date = '2012-01-01'
r.publish_date = '2012-01-01'
r.valid? record.valid?
r.errors[:publish_date].should be_empty record.errors[:publish_date].should be_empty
end end
it "should validate a invalid value string" do it "should validate a invalid value string" do
r = Article.new begin
r.publish_date = 'not a date' record.publish_date = 'not a date'
rescue
end
r.valid? record.valid?
r.errors[:publish_date].should_not be_empty record.errors[:publish_date].should_not be_empty
end end
it "should validate a nil value" do it "should validate a nil value" do
r = Article.new record.publish_date = nil
r.publish_date = nil
r.valid? record.valid?
r.errors[:publish_date].should be_empty record.errors[:publish_date].should be_empty
end end
end end
@@ -69,46 +70,97 @@ describe ValidatesTimeliness, 'Mongoid' do
end end
context "attribute write method" do context "attribute write method" do
let(:record) { Article.new }
it 'should cache attribute raw value' do it 'should cache attribute raw value' do
r = Article.new record.publish_datetime = date_string = '2010-01-01'
r.publish_datetime = date_string = '2010-01-01'
r._timeliness_raw_value_for('publish_datetime').should == date_string record._timeliness_raw_value_for('publish_datetime').should == date_string
end end
context "with plugin parser" do context "with plugin parser" do
with_config(:use_plugin_parser, true) let(:record) { ArticleWithParser.new }
it 'should parse a string value' do class ArticleWithParser
Timeliness::Parser.should_receive(:parse) include Mongoid::Document
r = Article.new field :publish_date, :type => Date
r.publish_date = '2010-01-01' field :publish_time, :type => Time
end field :publish_datetime, :type => DateTime
it 'should parse an invalid value as nil' do ValidatesTimeliness.use_plugin_parser = true
Timeliness::Parser.should_receive(:parse) validates_date :publish_date, :allow_nil => true
r = Article.new validates_time :publish_time, :allow_nil => true
r.publish_date = 'bad value' validates_datetime :publish_datetime, :allow_nil => true
ValidatesTimeliness.use_plugin_parser = false
r.publish_date.should be_nil
end end
context "for a date column" do context "for a date column" do
it 'should store a Date value after parsing string' do it 'should parse a string value' do
r = Article.new Timeliness::Parser.should_receive(:parse)
r.publish_date = '2010-01-01'
r.publish_date.should be_kind_of(Date) record.publish_date = '2010-01-01'
r.publish_date.should == Date.new(2010, 1, 1) end
it 'should parse a invalid string value as nil' do
Timeliness::Parser.should_receive(:parse)
record.publish_date = 'not valid'
end
it 'should store a Date value after parsing string' do
record.publish_date = '2010-01-01'
record.publish_date.should be_kind_of(Date)
record.publish_date.should eq Date.new(2010, 1, 1)
end
end
context "for a time column" do
it 'should parse a string value' do
Timeliness::Parser.should_receive(:parse)
record.publish_time = '12:30'
end
it 'should parse a invalid string value as nil' do
Timeliness::Parser.should_receive(:parse)
record.publish_time = 'not valid'
end
it 'should store a Time value after parsing string' do
record.publish_time = '12:30'
record.publish_time.should be_kind_of(Time)
record.publish_time.should eq Time.utc(2000, 1, 1, 12, 30)
end end
end end
context "for a datetime column" do context "for a datetime column" do
it 'should parse string into DateTime value' do with_config(:default_timezone, 'Australia/Melbourne')
r = Article.new
r.publish_datetime = '2010-01-01 12:00'
r.publish_datetime.should be_kind_of(DateTime) it 'should parse a string value' do
r.publish_datetime.should == DateTime.new(2010,1,1,12,0) Timeliness::Parser.should_receive(:parse)
record.publish_datetime = '2010-01-01 12:00'
end
it 'should parse a invalid string value as nil' do
Timeliness::Parser.should_receive(:parse)
record.publish_datetime = 'not valid'
end
it 'should parse string into DateTime value' do
record.publish_datetime = '2010-01-01 12:00'
record.publish_datetime.should be_kind_of(DateTime)
end
pending 'should parse string as current timezone' do
record.publish_datetime = '2010-06-01 12:00'
record.publish_datetime.utc_offset.should eq Time.zone.utc_offset
end end
end end
end end
@@ -116,10 +168,10 @@ describe ValidatesTimeliness, 'Mongoid' do
context "cached value" do context "cached value" do
it 'should be cleared on reload' do it 'should be cleared on reload' do
r = Article.create! record = Article.create!
r.publish_date = '2010-01-01' record.publish_date = '2010-01-01'
r.reload record.reload
r._timeliness_raw_value_for('publish_date').should be_nil record._timeliness_raw_value_for('publish_date').should be_nil
end end
end end

View File

@@ -19,6 +19,14 @@ describe ValidatesTimeliness::Validator do
Person.validates :birth_datetime, :timeliness => {:is_at => Time.mktime(2010,1,1)} Person.validates :birth_datetime, :timeliness => {:is_at => Time.mktime(2010,1,1)}
Person.validators.first.type.should == :datetime Person.validators.first.type.should == :datetime
end end
it 'should add attribute to timeliness attributes set' do
PersonWithShim.timeliness_validated_attributes.should_not include(:birth_time)
PersonWithShim.validates :birth_time, :timeliness => {:is_at => "12:30"}
PersonWithShim.timeliness_validated_attributes.should include(:birth_time)
end
end end
it 'should not be valid for value which not valid date or time value' do it 'should not be valid for value which not valid date or time value' do

View File

@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
s.homepage = %q{http://github.com/adzap/validates_timeliness} s.homepage = %q{http://github.com/adzap/validates_timeliness}
s.require_paths = ["lib"] s.require_paths = ["lib"]
s.files = `git ls-files`.split("\n") - %w{ .gitignore .rspec Gemfile Gemfile.lock autotest/discover.rb } s.files = `git ls-files`.split("\n") - %w{ .gitignore .rspec Gemfile Gemfile.lock autotest/discover.rb Appraisals Travis.yml } - Dir['gemsfiles/*']
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"] s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"]