restriction shorthand symbols

This commit is contained in:
Adam Meehan 2010-08-07 19:08:35 +10:00
parent 924c6766c1
commit 82ede60985
4 changed files with 56 additions and 1 deletions

View File

@ -112,6 +112,26 @@ Using the I18n system to define new defaults:
The %{restriction} signifies where the interpolation value for the restriction will be inserted. The %{restriction} signifies where the interpolation value for the restriction will be inserted.
=== RESTRICTION OPTION SHORTHAND
It is common to restrict an attribute to being on or before the current time or current day.
To specify this you need to use a lambda as an option value e.g. <tt>lambda { Time.now }</tt>.
This can be tedious noise amongst your validations for something so common. To combat this the
plugin allows you to use shorthand symbols for often used relative times or dates.
Just provide the symbol as the option value like so:
validates_date :birth_date, :on_or_before => :today
The :today symbol is evaluated as <tt>lambda { Date.today }.call</tt>. The :now and :today
symbols are pre-configured. Configure your own like so:
# in the setup block
config.restriction_shorthand_symbols.update(
:yesterday => lambda { 1.day.ago }
)
=== DUMMY DATE FOR TIME TYPES === DUMMY DATE FOR TIME TYPES
Given that Ruby has no support for a time-only type, all time type columns are evaluated Given that Ruby has no support for a time-only type, all time type columns are evaluated

View File

@ -26,6 +26,13 @@ module ValidatesTimeliness
mattr_accessor :ignore_restriction_errors mattr_accessor :ignore_restriction_errors
@@ignore_restriction_errors = defined?(Rails) ? !Rails.env.test? : false @@ignore_restriction_errors = defined?(Rails) ? !Rails.env.test? : false
# Shorthand time and date symbols for restrictions
mattr_accessor :restriction_shorthand_symbols
@@restriction_shorthand_symbols = {
:now => lambda { Time.now },
:today => lambda { Date.today }
}
# Setup method for plugin configuration # Setup method for plugin configuration
def self.setup def self.setup
yield self yield self

View File

@ -31,7 +31,11 @@ module ValidatesTimeliness
when String when String
value.to_time(:local) value.to_time(:local)
when Symbol when Symbol
if !record.respond_to?(value) && restriction_shorthand?(value)
ValidatesTimeliness.restriction_shorthand_symbols[value].call
else
evaluate_option_value(record.send(value), record) evaluate_option_value(record.send(value), record)
end
when Proc when Proc
result = value.arity > 0 ? value.call(record) : value.call result = value.arity > 0 ? value.call(record) : value.call
evaluate_option_value(result, record) evaluate_option_value(result, record)
@ -40,5 +44,9 @@ module ValidatesTimeliness
end end
end end
def restriction_shorthand?(symbol)
ValidatesTimeliness.restriction_shorthand_symbols.keys.include?(symbol)
end
end end
end end

View File

@ -150,5 +150,25 @@ describe ValidatesTimeliness::Conversion do
person.birth_time = value person.birth_time = value
evaluate_option_value(:birth_time, person).should == Time.mktime(2010,1,1,12,0,0) evaluate_option_value(:birth_time, person).should == Time.mktime(2010,1,1,12,0,0)
end end
context "restriction shorthand" do
before do
Timecop.freeze(Time.mktime(2010, 1, 1, 0, 0, 0))
end
it 'should evaluate :now as current time' do
evaluate_option_value(:now, person).should == Time.now
end
it 'should evaluate :today as current time' do
evaluate_option_value(:today, person).should == Date.today
end
it 'should not use shorthand if symbol if is record method' do
time = 1.day.from_now
person.stub!(:now).and_return(time)
evaluate_option_value(:now, person).should == time
end
end
end end
end end