Compare commits

..

20 Commits
3.0.1 ... 3.0.5

Author SHA1 Message Date
Adam Meehan
dac62060df version 3.0.5 2011-01-29 17:42:42 +11:00
Adam Meehan
4efa91f3b0 some Rakefile cleanup and simplification 2011-01-29 17:39:00 +11:00
Adam Meehan
38457ec334 change spec config setup to use class method with_config 2011-01-29 16:33:37 +11:00
Adam Meehan
3793ef2ed4 fix for validation nil value with :format option plugin parser disabled (issue 34) 2011-01-29 16:07:56 +11:00
Adam Meehan
983e80f239 move some files into spec/support and include ModelHelpers in config 2011-01-28 19:36:02 +11:00
Adam Meehan
bbb752e4e3 version 3.0.4 2011-01-22 11:16:10 +11:00
Adam Meehan
9d4ac8d513 update test gems 2011-01-22 11:15:15 +11:00
Adam Meehan
54347ee682 doc tweak 2011-01-22 10:49:59 +11:00
Adam Meehan
54ba4a038c use namespaced validator class name for the :timeliness option 2011-01-22 10:48:40 +11:00
Adam Meehan
7b5b11ad63 use class_attribute again, now that I know how to use it safely 2011-01-22 10:47:22 +11:00
Edgars Beigarts
d14ae09820 Fixed :between option. 2011-01-21 11:02:59 +02:00
Adam Meehan
01d1dc7c5e version 3.0.3 2010-12-11 09:17:31 +11:00
Adam Meehan
b09f937688 tiny consistency change 2010-12-11 09:17:08 +11:00
Adam Meehan
509336e080 Fix type_cast_value for values which don't respond to to_time or to_date (renatoelias) 2010-12-11 09:13:35 +11:00
Adam Meehan
e345b5dc7d update README with supported Ruby platforms 2010-12-04 17:14:46 +11:00
Adam Meehan
57eef70b7c remove ruby-debug from Gemfile for now 2010-12-04 17:14:16 +11:00
Adam Meehan
46eafe31a1 version 3.0.2 2010-12-04 16:40:13 +11:00
Adam Meehan
f17a799b5c updated Timeliness to 0.3.2 for zone and offset in string support 2010-12-04 16:34:34 +11:00
Adam Meehan
3bf364a395 reluctantly overriding whole execute_callstack_for_multiparameter_attributes method
this fixes issue for Date column types. Damn method is just too
unwieldly and should be refactored in Rails.
2010-12-04 16:29:05 +11:00
Adam Meehan
bfcab52c22 can use super for some InstanceTag methods
cleans up for DateTimeSelect extension a little
2010-11-02 10:13:13 +11:00
28 changed files with 317 additions and 228 deletions

View File

@@ -1,3 +1,18 @@
= 3.0.5 [2011-01-29]
* Fix for Conversion#parse when given nil value (closes issue #34)
= 3.0.4 [2011-01-22]
* Fix :between option which was being ignored (ebeigarts)
* Use class_attribute to remove deprecated class_inheritable_accessor
* Namespace copied validator class to ActiveModel::Validations::Timeliness for :timeliness option
= 3.0.3 [2010-12-11]
* Fix validation of values which don't respond to to_date or to_time (renatoelias)
= 3.0.2 [2010-12-04]
* Fix AR multiparameter extension for Date columns
* Update to Timeliness 0.3.2 for zone abbreviation and offset support
= 3.0.1 [2010-11-02] = 3.0.1 [2010-11-02]
* Generate timeliness write methods in an included module to allow overriding in model class (josevalim) * Generate timeliness write methods in an included module to allow overriding in model class (josevalim)

10
Gemfile
View File

@@ -3,16 +3,14 @@ source 'http://rubygems.org'
gemspec gemspec
gem 'ZenTest' gem 'ZenTest'
gem 'rails', '3.0.0' gem 'rails', '3.0.3'
gem 'rspec', '>= 2.0.0.beta.17' gem 'rspec', '~> 2.4'
gem 'rspec-rails', '>= 2.0.0.beta.17' gem 'rspec-rails', '~> 2.4'
gem 'timecop' gem 'timecop'
gem 'rspec_tag_matchers' gem 'rspec_tag_matchers'
gem 'ruby-debug'
group :mongoid do group :mongoid do
gem 'mongoid', '2.0.0.beta.17' gem 'mongoid', '2.0.0.rc.6'
gem 'bson_ext', '1.0.4'
end end
group :active_record do group :active_record do

View File

@@ -1,112 +1,106 @@
PATH PATH
remote: . remote: .
specs: specs:
validates_timeliness (3.0.0) validates_timeliness (3.0.4)
timeliness (~> 0.1.0) timeliness (~> 0.3.2)
GEM GEM
remote: http://rubygems.org/ remote: http://rubygems.org/
specs: specs:
ZenTest (4.4.0) ZenTest (4.4.2)
abstract (1.0.0) abstract (1.0.0)
actionmailer (3.0.0) actionmailer (3.0.3)
actionpack (= 3.0.0) actionpack (= 3.0.3)
mail (~> 2.2.5) mail (~> 2.2.9)
actionpack (3.0.0) actionpack (3.0.3)
activemodel (= 3.0.0) activemodel (= 3.0.3)
activesupport (= 3.0.0) activesupport (= 3.0.3)
builder (~> 2.1.2) builder (~> 2.1.2)
erubis (~> 2.6.6) erubis (~> 2.6.6)
i18n (~> 0.4.1) i18n (~> 0.4)
rack (~> 1.2.1) rack (~> 1.2.1)
rack-mount (~> 0.6.12) rack-mount (~> 0.6.13)
rack-test (~> 0.5.4) rack-test (~> 0.5.6)
tzinfo (~> 0.3.23) tzinfo (~> 0.3.23)
activemodel (3.0.0) activemodel (3.0.3)
activesupport (= 3.0.0) activesupport (= 3.0.3)
builder (~> 2.1.2) builder (~> 2.1.2)
i18n (~> 0.4.1) i18n (~> 0.4)
activerecord (3.0.0) activerecord (3.0.3)
activemodel (= 3.0.0) activemodel (= 3.0.3)
activesupport (= 3.0.0) activesupport (= 3.0.3)
arel (~> 1.0.0) arel (~> 2.0.2)
tzinfo (~> 0.3.23) tzinfo (~> 0.3.23)
activeresource (3.0.0) activeresource (3.0.3)
activemodel (= 3.0.0) activemodel (= 3.0.3)
activesupport (= 3.0.0) activesupport (= 3.0.3)
activesupport (3.0.0) activesupport (3.0.3)
arel (1.0.1) arel (2.0.7)
activesupport (~> 3.0.0) bson (1.2.0)
bson (1.0.4)
bson_ext (1.0.4)
builder (2.1.2) builder (2.1.2)
columnize (0.3.1)
diff-lcs (1.1.2) diff-lcs (1.1.2)
erubis (2.6.6) erubis (2.6.6)
abstract (>= 1.0.0) abstract (>= 1.0.0)
i18n (0.4.1) i18n (0.5.0)
linecache (0.43) mail (2.2.14)
mail (2.2.6.1)
activesupport (>= 2.3.6) activesupport (>= 2.3.6)
mime-types i18n (>= 0.4.0)
treetop (>= 1.4.5) mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.16) mime-types (1.16)
mongo (1.0.7) mongo (1.2.0)
bson (>= 1.0.4) bson (>= 1.2.0)
mongoid (2.0.0.beta.17) mongoid (2.0.0.rc.6)
activemodel (~> 3.0.0) activemodel (~> 3.0)
bson (= 1.0.4) mongo (~> 1.2)
mongo (= 1.0.7)
tzinfo (~> 0.3.22) tzinfo (~> 0.3.22)
will_paginate (~> 3.0.pre) will_paginate (~> 3.0.pre)
nokogiri (1.4.3.1) nokogiri (1.4.4)
polyglot (0.3.1) polyglot (0.3.1)
rack (1.2.1) rack (1.2.1)
rack-mount (0.6.13) rack-mount (0.6.13)
rack (>= 1.0.0) rack (>= 1.0.0)
rack-test (0.5.4) rack-test (0.5.7)
rack (>= 1.0) rack (>= 1.0)
rails (3.0.0) rails (3.0.3)
actionmailer (= 3.0.0) actionmailer (= 3.0.3)
actionpack (= 3.0.0) actionpack (= 3.0.3)
activerecord (= 3.0.0) activerecord (= 3.0.3)
activeresource (= 3.0.0) activeresource (= 3.0.3)
activesupport (= 3.0.0) activesupport (= 3.0.3)
bundler (~> 1.0.0) bundler (~> 1.0)
railties (= 3.0.0) railties (= 3.0.3)
railties (3.0.0) railties (3.0.3)
actionpack (= 3.0.0) actionpack (= 3.0.3)
activesupport (= 3.0.0) activesupport (= 3.0.3)
rake (>= 0.8.4) rake (>= 0.8.7)
thor (~> 0.14.0) thor (~> 0.14.4)
rake (0.8.7) rake (0.8.7)
rspec (2.0.0.beta.22) rspec (2.4.0)
rspec-core (= 2.0.0.beta.22) rspec-core (~> 2.4.0)
rspec-expectations (= 2.0.0.beta.22) rspec-expectations (~> 2.4.0)
rspec-mocks (= 2.0.0.beta.22) rspec-mocks (~> 2.4.0)
rspec-core (2.0.0.beta.22) rspec-core (2.4.0)
rspec-expectations (2.0.0.beta.22) rspec-expectations (2.4.0)
diff-lcs (>= 1.1.2) diff-lcs (~> 1.1.2)
rspec-mocks (2.0.0.beta.22) rspec-mocks (2.4.0)
rspec-core (= 2.0.0.beta.22) rspec-rails (2.4.1)
rspec-expectations (= 2.0.0.beta.22) actionpack (~> 3.0)
rspec-rails (2.0.0.beta.22) activesupport (~> 3.0)
rspec (= 2.0.0.beta.22) railties (~> 3.0)
rspec (~> 2.4.0)
rspec_tag_matchers (1.0.0) rspec_tag_matchers (1.0.0)
nokogiri (>= 1.4.0) nokogiri (>= 1.4.0)
rspec-rails (>= 1.2.6) rspec-rails (>= 1.2.6)
ruby-debug (0.10.3) sqlite3 (1.3.3)
columnize (>= 0.1) sqlite3-ruby (1.3.3)
ruby-debug-base (~> 0.10.3.0) sqlite3 (>= 1.3.3)
ruby-debug-base (0.10.3) thor (0.14.6)
linecache (>= 0.3)
sqlite3-ruby (1.3.1)
thor (0.14.1)
timecop (0.3.5) timecop (0.3.5)
timeliness (0.1.1) timeliness (0.3.3)
treetop (1.4.8) treetop (1.4.9)
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
tzinfo (0.3.23) tzinfo (0.3.24)
will_paginate (3.0.pre2) will_paginate (3.0.pre2)
PLATFORMS PLATFORMS
@@ -114,14 +108,12 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
ZenTest ZenTest
bson_ext (= 1.0.4) mongoid (= 2.0.0.rc.6)
mongoid (= 2.0.0.beta.17) rails (= 3.0.3)
rails (= 3.0.0) rspec (~> 2.4)
rspec (>= 2.0.0.beta.17) rspec-rails (~> 2.4)
rspec-rails (>= 2.0.0.beta.17)
rspec_tag_matchers rspec_tag_matchers
ruby-debug
sqlite3-ruby sqlite3-ruby
timecop timecop
timeliness (~> 0.1.0) timeliness (~> 0.3.2)
validates_timeliness! validates_timeliness!

View File

@@ -24,6 +24,7 @@ If you a looking for the old version for Rails 2.x go here[http://github.com/adz
* Supports I18n for the error messages * Supports I18n for the error messages
* Supports Ruby 1.8.x, 1.9.x and Rubinius.
== Installation == Installation
@@ -34,7 +35,7 @@ As plugin (from master)
As gem As gem
# in Gemfile # in Gemfile
gem 'validates_timeliness', '~> 3.0.0' gem 'validates_timeliness', '~> 3.0.2'
# Run bundler # Run bundler
$ bundle install $ bundle install

View File

@@ -12,26 +12,28 @@ spec = Gem::Specification.new do |s|
s.name = GEM_NAME s.name = GEM_NAME
s.version = GEM_VERSION s.version = GEM_VERSION
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.rubyforge_project = "validates_timeliness"
s.has_rdoc = true
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"]
s.summary = %q{Date and time validation plugin for Rails which allows custom formats} s.summary = %q{Date and time validation plugin for Rails which allows custom formats}
s.description = s.summary s.description = s.summary
s.author = "Adam Meehan" s.author = "Adam Meehan"
s.email = "adam.meehan@gmail.com" s.email = "adam.meehan@gmail.com"
s.homepage = "http://github.com/adzap/validates_timeliness" s.homepage = "http://github.com/adzap/validates_timeliness"
s.require_path = 'lib' s.require_path = 'lib'
s.files = %w(validates_timeliness.gemspec LICENSE CHANGELOG.rdoc README.rdoc Rakefile) + Dir.glob("{lib,spec}/**/*")
s.add_runtime_dependency 'timeliness', '~> 0.1.0' s.add_runtime_dependency 'timeliness', '~> 0.3.2'
s.files = `git ls-files`.split("\n") - %w{ .rspec .gitignore autotest/discover.rb Gemfile Gemfile.lock }
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.has_rdoc = true
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"]
end end
desc 'Default: run specs.' desc 'Default: run specs.'
task :default => :spec task :default => :spec
desc "Run specs" desc "Run specs"
RSpec::Core::RakeTask.new do |t| RSpec::Core::RakeTask.new(:spec)
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
end
desc "Generate code coverage" desc "Generate code coverage"
RSpec::Core::RakeTask.new(:coverage) do |t| RSpec::Core::RakeTask.new(:coverage) do |t|

View File

@@ -3,7 +3,7 @@ module ValidatesTimeliness
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
class_inheritable_accessor :timeliness_validated_attributes class_attribute :timeliness_validated_attributes
self.timeliness_validated_attributes = [] self.timeliness_validated_attributes = []
end end

View File

@@ -2,7 +2,7 @@ module ValidatesTimeliness
module Conversion module Conversion
def type_cast_value(value, type) def type_cast_value(value, type)
return nil if value.nil? return nil if value.nil? || !value.respond_to?(:to_time)
value = value.in_time_zone if value.acts_like?(:time) && @timezone_aware value = value.in_time_zone if value.acts_like?(:time) && @timezone_aware
value = case type value = case type
@@ -56,6 +56,7 @@ module ValidatesTimeliness
end end
def parse(value) def parse(value)
return nil if value.nil?
if ValidatesTimeliness.use_plugin_parser if ValidatesTimeliness.use_plugin_parser
Timeliness::Parser.parse(value, @type, :zone => (:current if @timezone_aware), :format => options[:format], :strict => false) Timeliness::Parser.parse(value, @type, :zone => (:current if @timezone_aware), :format => options[:format], :strict => false)
else else

View File

@@ -10,7 +10,6 @@ module ValidatesTimeliness
included do included do
alias_method_chain :datetime_selector, :timeliness alias_method_chain :datetime_selector, :timeliness
alias_method_chain :value, :timeliness
end end
module InstanceMethods module InstanceMethods
@@ -22,13 +21,13 @@ module ValidatesTimeliness
datetime_selector_without_timeliness(*args) datetime_selector_without_timeliness(*args)
end end
def value_with_timeliness(object) def value(object)
unless @timeliness_date_or_time_tag && @template_object.params[@object_name] unless @timeliness_date_or_time_tag && @template_object.params[@object_name]
return value_without_timeliness(object) return super
end end
pairs = @template_object.params[@object_name].select {|k,v| k =~ /^#{@method_name}\(/ } pairs = @template_object.params[@object_name].select {|k,v| k =~ /^#{@method_name}\(/ }
return value_without_timeliness(object) if pairs.empty? return super if pairs.empty?
values = [nil] * 6 values = [nil] * 6
pairs.map do |(param, value)| pairs.map do |(param, value)|

View File

@@ -3,26 +3,64 @@ module ValidatesTimeliness
module MultiparameterHandler module MultiparameterHandler
extend ActiveSupport::Concern extend ActiveSupport::Concern
# Stricter handling of date and time values from multiparameter
# assignment from the date/time select view helpers
included do included do
alias_method_chain :instantiate_time_object, :timeliness alias_method_chain :instantiate_time_object, :timeliness
alias_method_chain :execute_callstack_for_multiparameter_attributes, :timeliness
end end
private private
# Stricter handling of date and time values from multiparameter def invalid_multiparameter_date_or_time_as_string(values)
# assignment from the date/time select view helpers
#
def instantiate_time_object_with_timeliness(name, values)
unless Date.valid_civil?(*values[0..2])
value = [values[0], *values[1..2].map {|s| s.to_s.rjust(2,"0")} ].join("-") value = [values[0], *values[1..2].map {|s| s.to_s.rjust(2,"0")} ].join("-")
value += ' ' + values[3..5].map {|s| s.to_s.rjust(2, "0") }.join(":") unless values[3..5].empty? value += ' ' + values[3..5].map {|s| s.to_s.rjust(2, "0") }.join(":") unless values[3..5].empty?
return value value
end end
if self.class.send(:create_time_zone_conversion_attribute?, name, column_for_attribute(name)) def instantiate_time_object_with_timeliness(name, values)
Time.zone.local(*values) if Date.valid_civil?(*values[0..2])
instantiate_time_object_without_timeliness(name, values)
else else
Time.time_with_datetime_fallback(self.class.default_timezone, *values) invalid_multiparameter_date_or_time_as_string(values)
end
end
def instantiate_date_object(name, values)
values = values.map { |v| v.nil? ? 1 : v }
Date.new(*values)
rescue ArgumentError => ex
invalid_multiparameter_date_or_time_as_string(values)
end
def execute_callstack_for_multiparameter_attributes_with_timeliness(callstack)
errors = []
callstack.each do |name, values_with_empty_parameters|
begin
klass = (self.class.reflect_on_aggregation(name.to_sym) || column_for_attribute(name)).klass
values = values_with_empty_parameters.reject { |v| v.nil? }
if values.empty?
send(name + "=", nil)
else
value = if Time == klass
instantiate_time_object(name, values)
elsif Date == klass
instantiate_date_object(name, values_with_empty_parameters)
else
klass.new(*values)
end
send(name + "=", value)
end
rescue => ex
errors << ActiveRecord::AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)
end
end
unless errors.empty?
raise ActiveRecord::MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"
end end
end end

View File

@@ -27,12 +27,13 @@ module ValidatesTimeliness
def initialize(options) def initialize(options)
@type = options.delete(:type) || :datetime @type = options.delete(:type) || :datetime
@allow_nil, @allow_blank = options.delete(:allow_nil), options.delete(:allow_blank) @allow_nil, @allow_blank = options.delete(:allow_nil), options.delete(:allow_blank)
@restrictions_to_check = RESTRICTIONS.keys & options.keys
if range = options.delete(:between) if range = options.delete(:between)
raise ArgumentError, ":between must be a Range or an Array" unless range.is_a?(Range) || range.is_a?(Array) raise ArgumentError, ":between must be a Range or an Array" unless range.is_a?(Range) || range.is_a?(Array)
options[:on_or_after], options[:on_or_before] = range.first, range.last options[:on_or_after], options[:on_or_before] = range.first, range.last
end end
@restrictions_to_check = RESTRICTIONS.keys & options.keys
super super
end end
@@ -72,10 +73,9 @@ module ValidatesTimeliness
end end
def attribute_raw_value(record, attr_name) def attribute_raw_value(record, attr_name)
if record.respond_to?(:_timeliness_raw_value_for) record.respond_to?(:_timeliness_raw_value_for) &&
record._timeliness_raw_value_for(attr_name) record._timeliness_raw_value_for(attr_name)
end end
end
def timezone_aware?(record, attr_name) def timezone_aware?(record, attr_name)
record.class.respond_to?(:timeliness_attribute_timezone_aware?) && record.class.respond_to?(:timeliness_attribute_timezone_aware?) &&
@@ -86,4 +86,4 @@ module ValidatesTimeliness
end end
# Compatibility with ActiveModel validates method which matches option keys to their validator class # Compatibility with ActiveModel validates method which matches option keys to their validator class
TimelinessValidator = ValidatesTimeliness::Validator ActiveModel::Validations::TimelinessValidator = ValidatesTimeliness::Validator

View File

@@ -1,3 +1,3 @@
module ValidatesTimeliness module ValidatesTimeliness
VERSION = '3.0.1' VERSION = '3.0.5'
end end

View File

@@ -6,10 +6,12 @@ require 'active_record'
require 'action_view' require 'action_view'
require 'timecop' require 'timecop'
require 'rspec_tag_matchers' require 'rspec_tag_matchers'
require 'model_helpers'
require 'validates_timeliness' require 'validates_timeliness'
require 'test_model'
require 'support/test_model'
require 'support/model_helpers'
require 'support/config_helper'
ValidatesTimeliness.setup do |c| ValidatesTimeliness.setup do |c|
c.extend_orms = [ :active_record ] c.extend_orms = [ :active_record ]
@@ -87,6 +89,8 @@ end
Rspec.configure do |c| Rspec.configure do |c|
c.mock_with :rspec c.mock_with :rspec
c.include(RspecTagMatchers) c.include(RspecTagMatchers)
c.include(ModelHelpers)
c.include(ConfigHelper)
c.before do c.before do
Person.reset_callbacks(:validate) Person.reset_callbacks(:validate)
PersonWithShim.timeliness_validated_attributes = [] PersonWithShim.timeliness_validated_attributes = []

View File

@@ -0,0 +1,26 @@
module ConfigHelper
extend ActiveSupport::Concern
# Justin French tip
def with_config(preference_name, temporary_value)
old_value = ValidatesTimeliness.send(preference_name)
ValidatesTimeliness.send(:"#{preference_name}=", temporary_value)
yield
ensure
ValidatesTimeliness.send(:"#{preference_name}=", old_value)
end
module ClassMethods
def with_config(preference_name, temporary_value)
original_config_value = ValidatesTimeliness.send(preference_name)
before(:all) do
ValidatesTimeliness.send(:"#{preference_name}=", temporary_value)
end
after(:all) do
ValidatesTimeliness.send(:"#{preference_name}=", original_config_value)
end
end
end
end

View File

@@ -41,6 +41,8 @@ describe ValidatesTimeliness::AttributeMethods do
end end
context "with plugin parser" do context "with plugin parser" do
with_config(:use_plugin_parser, true)
class PersonWithParser class PersonWithParser
include TestModel include TestModel
include TestModelShim include TestModelShim
@@ -52,10 +54,6 @@ describe ValidatesTimeliness::AttributeMethods do
validates_datetime :birth_datetime validates_datetime :birth_datetime
end end
before :all do
ValidatesTimeliness.use_plugin_parser = true
end
it 'should parse a string value' do it 'should parse a string value' do
Timeliness::Parser.should_receive(:parse) Timeliness::Parser.should_receive(:parse)
r = PersonWithParser.new r = PersonWithParser.new
@@ -67,10 +65,6 @@ describe ValidatesTimeliness::AttributeMethods do
r.birth_datetime = '2010-01-01 12:00' r.birth_datetime = '2010-01-01 12:00'
r.birth_datetime.zone == Time.zone.name r.birth_datetime.zone == Time.zone.name
end end
after :all do
ValidatesTimeliness.use_plugin_parser = false
end
end end
end end

View File

@@ -3,13 +3,13 @@ require 'spec_helper'
describe ValidatesTimeliness::Conversion do describe ValidatesTimeliness::Conversion do
include ValidatesTimeliness::Conversion include ValidatesTimeliness::Conversion
let(:options) { Hash.new }
before do before do
Timecop.freeze(Time.mktime(2010, 1, 1, 0, 0, 0)) Timecop.freeze(Time.mktime(2010, 1, 1, 0, 0, 0))
end end
describe "#type_cast_value" do describe "#type_cast_value" do
let(:options) { Hash.new }
describe "for date type" do describe "for date type" do
it "should return same value for date value" do it "should return same value for date value" do
type_cast_value(Date.new(2010, 1, 1), :date).should == Date.new(2010, 1, 1) type_cast_value(Date.new(2010, 1, 1), :date).should == Date.new(2010, 1, 1)
@@ -22,6 +22,10 @@ describe ValidatesTimeliness::Conversion do
it "should return date part of datetime value" do it "should return date part of datetime value" do
type_cast_value(DateTime.new(2010, 1, 1, 0, 0, 0), :date).should == Date.new(2010, 1, 1) type_cast_value(DateTime.new(2010, 1, 1, 0, 0, 0), :date).should == Date.new(2010, 1, 1)
end end
it 'should return nil for invalid value types' do
type_cast_value(12, :date).should == nil
end
end end
describe "for time type" do describe "for time type" do
@@ -40,6 +44,10 @@ describe ValidatesTimeliness::Conversion do
it "should return dummy date with time part for datetime value" do it "should return dummy date with time part for datetime value" do
type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :time).should == Time.utc(2000, 1, 1, 12, 34, 56) type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :time).should == Time.utc(2000, 1, 1, 12, 34, 56)
end end
it 'should return nil for invalid value types' do
type_cast_value(12, :time).should == nil
end
end end
describe "for datetime type" do describe "for datetime type" do
@@ -63,6 +71,10 @@ describe ValidatesTimeliness::Conversion do
result.should == Time.zone.local(2010, 1, 1, 23, 34, 56) result.should == Time.zone.local(2010, 1, 1, 23, 34, 56)
result.zone.should == 'EST' result.zone.should == 'EST'
end end
it 'should return nil for invalid value types' do
type_cast_value(12, :datetime).should == nil
end
end end
describe "ignore_usec option" do describe "ignore_usec option" do
@@ -102,17 +114,10 @@ describe ValidatesTimeliness::Conversion do
end end
describe "with custom dummy date" do describe "with custom dummy date" do
before do
@original_dummy_date = ValidatesTimeliness.dummy_date_for_time_type
ValidatesTimeliness.dummy_date_for_time_type = [2010, 1, 1]
end
it 'should return dummy time with custom dummy date' do it 'should return dummy time with custom dummy date' do
with_config(:dummy_date_for_time_type, [2010, 1, 1] ) do
dummy_time(Time.utc(1999, 11, 22, 12, 34, 56)).should == Time.utc(2010, 1, 1, 12, 34, 56) dummy_time(Time.utc(1999, 11, 22, 12, 34, 56)).should == Time.utc(2010, 1, 1, 12, 34, 56)
end end
after do
ValidatesTimeliness.dummy_date_for_time_type = @original_dummy_date
end end
end end
end end
@@ -194,4 +199,36 @@ describe ValidatesTimeliness::Conversion do
end end
end end
end end
describe "#parse" do
context "use_plugin_parser setting is true" do
with_config(:use_plugin_parser, true)
it 'should use timeliness' do
Timeliness::Parser.should_receive(:parse)
parse('2000-01-01')
end
end
context "use_plugin_parser setting is false" do
with_config(:use_plugin_parser, false)
it 'should use Time.zone.parse attribute is timezone aware' do
@timezone_aware = true
Time.zone.should_receive(:parse)
parse('2000-01-01')
end
it 'should use value#to_time if use_plugin_parser setting is false and attribute is not timezone aware' do
@timezone_aware = false
value = '2000-01-01'
value.should_receive(:to_time)
parse(value)
end
end
it 'should return nil if value is nil' do
parse(nil).should be_nil
end
end
end end

View File

@@ -4,9 +4,7 @@ describe ValidatesTimeliness::Extensions::DateTimeSelect do
include ActionView::Helpers::DateHelper include ActionView::Helpers::DateHelper
attr_reader :person, :params attr_reader :person, :params
before :all do with_config(:use_plugin_parser, true)
ValidatesTimeliness.use_plugin_parser = true
end
before do before do
@person = Person.new @person = Person.new
@@ -177,8 +175,4 @@ describe ValidatesTimeliness::Extensions::DateTimeSelect do
output.should_not have_tag('select[id=person_birth_time_6i] option[selected=selected]') output.should_not have_tag('select[id=person_birth_time_6i] option[selected=selected]')
end end
end end
after :all do
ValidatesTimeliness.use_plugin_parser = false
end
end end

View File

@@ -3,19 +3,31 @@ require 'spec_helper'
describe ValidatesTimeliness::Extensions::MultiparameterHandler do describe ValidatesTimeliness::Extensions::MultiparameterHandler do
let(:employee) { Employee.new } let(:employee) { Employee.new }
it 'should return string value for invalid dates' do context "time column" do
instantiate_time_object('birth_date', [2000, 2, 31]).should == '2000-02-31' it 'should return string value for invalid date portion' do
end multiparameter_attribute(:birth_datetime, [2000, 2, 31, 12, 0, 0])
employee.birth_datetime_before_type_cast.should == '2000-02-31 12:00:00'
it 'should return string value for invalid datetimes' do
instantiate_time_object('birth_datetime', [2000, 2, 31, 12, 0, 0]).should == '2000-02-31 12:00:00'
end end
it 'should return Time value for valid datetimes' do it 'should return Time value for valid datetimes' do
instantiate_time_object('birth_datetime', [2000, 2, 28, 12, 0, 0]).should be_kind_of(Time) multiparameter_attribute(:birth_datetime, [2000, 2, 28, 12, 0, 0])
employee.birth_datetime_before_type_cast.should be_kind_of(Time)
end
end end
def instantiate_time_object(name, values) context "date column" do
employee.send(:instantiate_time_object, name, values) it 'should return string value for invalid date' do
multiparameter_attribute(:birth_date, [2000, 2, 31])
employee.birth_date_before_type_cast.should == '2000-02-31'
end
it 'should return Date value for valid date' do
multiparameter_attribute(:birth_date, [2000, 2, 28])
employee.birth_date_before_type_cast.should be_kind_of(Date)
end
end
def multiparameter_attribute(name, values)
employee.send(:execute_callstack_for_multiparameter_attributes, name.to_s => values)
end end
end end

View File

@@ -33,16 +33,14 @@ describe ValidatesTimeliness, 'ActiveRecord' do
end end
context "with plugin parser" do context "with plugin parser" do
with_config(:use_plugin_parser, true)
class EmployeeWithParser < ActiveRecord::Base class EmployeeWithParser < ActiveRecord::Base
set_table_name 'employees' set_table_name 'employees'
validates_date :birth_date validates_date :birth_date
validates_datetime :birth_datetime validates_datetime :birth_datetime
end end
before :all do
ValidatesTimeliness.use_plugin_parser = true
end
it 'should parse a string value' do it 'should parse a string value' do
Timeliness::Parser.should_receive(:parse) Timeliness::Parser.should_receive(:parse)
r = EmployeeWithParser.new r = EmployeeWithParser.new
@@ -54,11 +52,6 @@ describe ValidatesTimeliness, 'ActiveRecord' do
r.birth_datetime = '2010-06-01 12:00' r.birth_datetime = '2010-06-01 12:00'
r.birth_datetime.utc_offset.should == 10.hours r.birth_datetime.utc_offset.should == 10.hours
end end
after :all do
Time.zone = 'Australia/Melbourne'
ValidatesTimeliness.use_plugin_parser = false
end
end end
end end

View File

@@ -12,6 +12,8 @@ Mongoid.configure do |config|
config.persist_in_safe_mode = false config.persist_in_safe_mode = false
end end
describe ValidatesTimeliness, 'Mongoid' do
class Article class Article
::ValidatesTimeliness.use_plugin_parser = true ::ValidatesTimeliness.use_plugin_parser = true
include Mongoid::Document include Mongoid::Document
@@ -24,8 +26,6 @@ class Article
::ValidatesTimeliness.use_plugin_parser = false ::ValidatesTimeliness.use_plugin_parser = false
end end
describe ValidatesTimeliness, 'Mongoid' do
context "validation methods" do context "validation methods" do
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)
@@ -52,9 +52,7 @@ describe ValidatesTimeliness, 'Mongoid' do
end end
context "with plugin parser" do context "with plugin parser" do
before :all do with_config(:use_plugin_parser, false)
ValidatesTimeliness.use_plugin_parser = true
end
it 'should parse a string value' do it 'should parse a string value' do
Timeliness::Parser.should_receive(:parse) Timeliness::Parser.should_receive(:parse)
@@ -67,10 +65,6 @@ describe ValidatesTimeliness, 'Mongoid' do
r.publish_datetime = '2010-01-01 12:00' r.publish_datetime = '2010-01-01 12:00'
r.publish_datetime.should == Time.utc(2010,1,1,12,0) r.publish_datetime.should == Time.utc(2010,1,1,12,0)
end end
after :all do
ValidatesTimeliness.use_plugin_parser = false
end
end end
end end

View File

@@ -1,8 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe ValidatesTimeliness::Validator, ":after option" do describe ValidatesTimeliness::Validator, ":after option" do
include ModelHelpers
describe "for date type" do describe "for date type" do
before do before do
Person.validates_date :birth_date, :after => Date.new(2010, 1, 1) Person.validates_date :birth_date, :after => Date.new(2010, 1, 1)

View File

@@ -1,8 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe ValidatesTimeliness::Validator, ":before option" do describe ValidatesTimeliness::Validator, ":before option" do
include ModelHelpers
describe "for date type" do describe "for date type" do
before do before do
Person.validates_date :birth_date, :before => Date.new(2010, 1, 1) Person.validates_date :birth_date, :before => Date.new(2010, 1, 1)

View File

@@ -1,8 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe ValidatesTimeliness::Validator, ":is_at option" do describe ValidatesTimeliness::Validator, ":is_at option" do
include ModelHelpers
before do before do
Timecop.freeze(Time.local_time(2010, 1, 1, 0, 0, 0)) Timecop.freeze(Time.local_time(2010, 1, 1, 0, 0, 0))
end end

View File

@@ -1,8 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe ValidatesTimeliness::Validator, ":on_or_after option" do describe ValidatesTimeliness::Validator, ":on_or_after option" do
include ModelHelpers
describe "for date type" do describe "for date type" do
before do before do
Person.validates_date :birth_date, :on_or_after => Date.new(2010, 1, 1) Person.validates_date :birth_date, :on_or_after => Date.new(2010, 1, 1)

View File

@@ -1,8 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe ValidatesTimeliness::Validator, ":on_or_before option" do describe ValidatesTimeliness::Validator, ":on_or_before option" do
include ModelHelpers
describe "for date type" do describe "for date type" do
before do before do
Person.validates_date :birth_date, :on_or_before => Date.new(2010, 1, 1) Person.validates_date :birth_date, :on_or_before => Date.new(2010, 1, 1)

View File

@@ -1,7 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe ValidatesTimeliness::Validator do describe ValidatesTimeliness::Validator do
include ModelHelpers
NIL = [nil] NIL = [nil]
before do before do
@@ -12,10 +11,10 @@ describe ValidatesTimeliness::Validator do
ValidatesTimeliness::Validator.kind.should == :timeliness ValidatesTimeliness::Validator.kind.should == :timeliness
end end
describe "Model.validates :timeliness option" do describe "Model.validates with :timeliness option" do
it 'should use plugin validator class' do it 'should use plugin validator class' do
Person.validates :birth_date, :timeliness => {:is_at => Date.new(2010,1,1), :type => :date} Person.validates :birth_date, :timeliness => {:is_at => Date.new(2010,1,1), :type => :date}
Person.validators.should have(1).kind_of(TimelinessValidator) Person.validators.should have(1).kind_of(ActiveModel::Validations::TimelinessValidator)
invalid!(:birth_date, Date.new(2010,1,2)) invalid!(:birth_date, Date.new(2010,1,2))
valid!(:birth_date, Date.new(2010,1,1)) valid!(:birth_date, Date.new(2010,1,1))
end end
@@ -70,18 +69,26 @@ describe ValidatesTimeliness::Validator do
describe "array value" do describe "array value" do
it 'should be split option into :on_or_after and :on_or_before values' do it 'should be split option into :on_or_after and :on_or_before values' do
on_or_after, on_or_before = Date.new(2010,1,1), Date.new(2010,1,2) on_or_after, on_or_before = Date.new(2010,1,1), Date.new(2010,1,2)
Person.validates_time :birth_date, :between => [on_or_after, on_or_before] Person.validates_date :birth_date, :between => [on_or_after, on_or_before]
Person.validators.first.options[:on_or_after].should == on_or_after Person.validators.first.options[:on_or_after].should == on_or_after
Person.validators.first.options[:on_or_before].should == on_or_before Person.validators.first.options[:on_or_before].should == on_or_before
invalid!(:birth_date, on_or_after - 1, "must be on or after 2010-01-01")
invalid!(:birth_date, on_or_before + 1, "must be on or before 2010-01-02")
valid!(:birth_date, on_or_after)
valid!(:birth_date, on_or_before)
end end
end end
describe "range value" do describe "range value" do
it 'should be split option into :on_or_after and :on_or_before values' do it 'should be split option into :on_or_after and :on_or_before values' do
on_or_after, on_or_before = Date.new(2010,1,1), Date.new(2010,1,2) on_or_after, on_or_before = Date.new(2010,1,1), Date.new(2010,1,2)
Person.validates_time :birth_date, :between => on_or_after..on_or_before Person.validates_date :birth_date, :between => on_or_after..on_or_before
Person.validators.first.options[:on_or_after].should == on_or_after Person.validators.first.options[:on_or_after].should == on_or_after
Person.validators.first.options[:on_or_before].should == on_or_before Person.validators.first.options[:on_or_before].should == on_or_before
invalid!(:birth_date, on_or_after - 1, "must be on or after 2010-01-01")
invalid!(:birth_date, on_or_before + 1, "must be on or before 2010-01-02")
valid!(:birth_date, on_or_after)
valid!(:birth_date, on_or_before)
end end
end end
end end
@@ -110,9 +117,7 @@ describe ValidatesTimeliness::Validator do
let(:person) { PersonWithFormatOption.new } let(:person) { PersonWithFormatOption.new }
before(:all) do with_config(:use_plugin_parser, true)
ValidatesTimeliness.use_plugin_parser = true
end
it "should be valid when value matches format" do it "should be valid when value matches format" do
person.birth_date = '11-12-1913' person.birth_date = '11-12-1913'
@@ -125,10 +130,6 @@ describe ValidatesTimeliness::Validator do
person.valid? person.valid?
person.errors[:birth_date].should include('is not a valid date') person.errors[:birth_date].should include('is not a valid date')
end end
after(:all) do
ValidatesTimeliness.use_plugin_parser = false
end
end end
describe "restriction value errors" do describe "restriction value errors" do
@@ -139,19 +140,17 @@ describe ValidatesTimeliness::Validator do
end end
it "should be added when ignore_restriction_errors is false" do it "should be added when ignore_restriction_errors is false" do
ValidatesTimeliness.ignore_restriction_errors = false with_config(:ignore_restriction_errors, false) do
person.valid? person.valid?
person.errors[:birth_date].first.should match("Error occurred validating birth_date for :is_at restriction") person.errors[:birth_date].first.should match("Error occurred validating birth_date for :is_at restriction")
end end
end
it "should not be added when ignore_restriction_errors is true" do it "should not be added when ignore_restriction_errors is true" do
ValidatesTimeliness.ignore_restriction_errors = true with_config(:ignore_restriction_errors, true) do
person.valid? person.valid?
person.errors[:birth_date].should be_empty person.errors[:birth_date].should be_empty
end end
after :all do
ValidatesTimeliness.ignore_restriction_errors = false
end end
end end

View File

@@ -2,31 +2,31 @@
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = %q{validates_timeliness} s.name = %q{validates_timeliness}
s.version = "3.0.1" s.version = "3.0.5"
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Adam Meehan"] s.authors = ["Adam Meehan"]
s.date = %q{2010-11-02} s.date = %q{2011-01-29}
s.description = %q{Date and time validation plugin for Rails which allows custom formats} s.description = %q{Date and time validation plugin for Rails which allows custom formats}
s.email = %q{adam.meehan@gmail.com} s.email = %q{adam.meehan@gmail.com}
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"] s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"]
s.files = ["validates_timeliness.gemspec", "LICENSE", "CHANGELOG.rdoc", "README.rdoc", "Rakefile", "lib/generators", "lib/generators/validates_timeliness", "lib/generators/validates_timeliness/install_generator.rb", "lib/generators/validates_timeliness/templates", "lib/generators/validates_timeliness/templates/en.yml", "lib/generators/validates_timeliness/templates/validates_timeliness.rb", "lib/validates_timeliness", "lib/validates_timeliness/attribute_methods.rb", "lib/validates_timeliness/conversion.rb", "lib/validates_timeliness/extensions", "lib/validates_timeliness/extensions/date_time_select.rb", "lib/validates_timeliness/extensions/multiparameter_handler.rb", "lib/validates_timeliness/extensions.rb", "lib/validates_timeliness/helper_methods.rb", "lib/validates_timeliness/orm", "lib/validates_timeliness/orm/active_record.rb", "lib/validates_timeliness/orm/mongoid.rb", "lib/validates_timeliness/railtie.rb", "lib/validates_timeliness/validator.rb", "lib/validates_timeliness/version.rb", "lib/validates_timeliness.rb", "spec/model_helpers.rb", "spec/spec_helper.rb", "spec/test_model.rb", "spec/validates_timeliness", "spec/validates_timeliness/attribute_methods_spec.rb", "spec/validates_timeliness/conversion_spec.rb", "spec/validates_timeliness/extensions", "spec/validates_timeliness/extensions/date_time_select_spec.rb", "spec/validates_timeliness/extensions/multiparameter_handler_spec.rb", "spec/validates_timeliness/helper_methods_spec.rb", "spec/validates_timeliness/orm", "spec/validates_timeliness/orm/active_record_spec.rb", "spec/validates_timeliness/orm/mongoid_spec.rb", "spec/validates_timeliness/validator", "spec/validates_timeliness/validator/after_spec.rb", "spec/validates_timeliness/validator/before_spec.rb", "spec/validates_timeliness/validator/is_at_spec.rb", "spec/validates_timeliness/validator/on_or_after_spec.rb", "spec/validates_timeliness/validator/on_or_before_spec.rb", "spec/validates_timeliness/validator_spec.rb", "spec/validates_timeliness_spec.rb"] s.files = ["CHANGELOG.rdoc", "LICENSE", "README.rdoc", "Rakefile", "init.rb", "lib/generators/validates_timeliness/install_generator.rb", "lib/generators/validates_timeliness/templates/en.yml", "lib/generators/validates_timeliness/templates/validates_timeliness.rb", "lib/validates_timeliness.rb", "lib/validates_timeliness/attribute_methods.rb", "lib/validates_timeliness/conversion.rb", "lib/validates_timeliness/extensions.rb", "lib/validates_timeliness/extensions/date_time_select.rb", "lib/validates_timeliness/extensions/multiparameter_handler.rb", "lib/validates_timeliness/helper_methods.rb", "lib/validates_timeliness/orm/active_record.rb", "lib/validates_timeliness/orm/mongoid.rb", "lib/validates_timeliness/railtie.rb", "lib/validates_timeliness/validator.rb", "lib/validates_timeliness/version.rb", "spec/spec_helper.rb", "spec/support/config_helper.rb", "spec/support/model_helpers.rb", "spec/support/test_model.rb", "spec/validates_timeliness/attribute_methods_spec.rb", "spec/validates_timeliness/conversion_spec.rb", "spec/validates_timeliness/extensions/date_time_select_spec.rb", "spec/validates_timeliness/extensions/multiparameter_handler_spec.rb", "spec/validates_timeliness/helper_methods_spec.rb", "spec/validates_timeliness/orm/active_record_spec.rb", "spec/validates_timeliness/orm/mongoid_spec.rb", "spec/validates_timeliness/validator/after_spec.rb", "spec/validates_timeliness/validator/before_spec.rb", "spec/validates_timeliness/validator/is_at_spec.rb", "spec/validates_timeliness/validator/on_or_after_spec.rb", "spec/validates_timeliness/validator/on_or_before_spec.rb", "spec/validates_timeliness/validator_spec.rb", "spec/validates_timeliness_spec.rb", "validates_timeliness.gemspec"]
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.rubyforge_project = %q{validates_timeliness}
s.rubygems_version = %q{1.3.7} s.rubygems_version = %q{1.3.7}
s.summary = %q{Date and time validation plugin for Rails which allows custom formats} s.summary = %q{Date and time validation plugin for Rails which allows custom formats}
s.test_files = ["spec/spec_helper.rb", "spec/support/config_helper.rb", "spec/support/model_helpers.rb", "spec/support/test_model.rb", "spec/validates_timeliness/attribute_methods_spec.rb", "spec/validates_timeliness/conversion_spec.rb", "spec/validates_timeliness/extensions/date_time_select_spec.rb", "spec/validates_timeliness/extensions/multiparameter_handler_spec.rb", "spec/validates_timeliness/helper_methods_spec.rb", "spec/validates_timeliness/orm/active_record_spec.rb", "spec/validates_timeliness/orm/mongoid_spec.rb", "spec/validates_timeliness/validator/after_spec.rb", "spec/validates_timeliness/validator/before_spec.rb", "spec/validates_timeliness/validator/is_at_spec.rb", "spec/validates_timeliness/validator/on_or_after_spec.rb", "spec/validates_timeliness/validator/on_or_before_spec.rb", "spec/validates_timeliness/validator_spec.rb", "spec/validates_timeliness_spec.rb"]
if s.respond_to? :specification_version then if s.respond_to? :specification_version then
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 3 s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<timeliness>, ["~> 0.1.0"]) s.add_runtime_dependency(%q<timeliness>, ["~> 0.3.2"])
else else
s.add_dependency(%q<timeliness>, ["~> 0.1.0"]) s.add_dependency(%q<timeliness>, ["~> 0.3.2"])
end end
else else
s.add_dependency(%q<timeliness>, ["~> 0.1.0"]) s.add_dependency(%q<timeliness>, ["~> 0.3.2"])
end end
end end