lib/riveter/attributes.rb in riveter-0.0.6 vs lib/riveter/attributes.rb in riveter-0.0.7
- old
+ new
@@ -52,10 +52,66 @@
attr_date_or_time(:time, name, options, &block)
end
alias :attr_datetime :attr_time
+ def attr_date_range(name, options={}, &block)
+ options = {
+ :validate => true
+ }.merge(options)
+
+ required = (true == options.delete(:required))
+
+ # expecting the default value to be a date range
+ # so extract out the first and last parts for the from and to
+ # otherwise, it may just be a date or nil
+ default = options.delete(:default)
+ default = default.is_a?(Range) ? default : (default..default)
+ defaults = {
+ :from => default.first,
+ :to => default.last
+ }
+
+ converter = block_given? ? block : Converters.converter_for(:date)
+
+ # return from and to as range
+ define_method name do
+ # can't have range starting or ending with nil, so return nil
+ send(:"#{name}_from")..send(:"#{name}_to") rescue nil
+ end
+
+ define_method "#{name}=" do |value|
+ value ||= nil..nil
+ range = value.is_a?(Range) ? value : value..value
+ send(:"#{name}_from=", range.first)
+ send(:"#{name}_to=", range.last)
+ end
+
+ validates name,
+ :allow_nil => !required,
+ :date_range => true if options[:validate]
+
+ add_attr(name, :date_range)
+
+ # break down into parts
+ [:from, :to].each do |part|
+ attr_reader_with_converter :"#{name}_#{part}", converter
+
+ define_method :"#{name}_#{part}?" do
+ send(:"#{name}_#{part}").present?
+ end
+
+ attr_writer :"#{name}_#{part}"
+
+ validates :"#{name}_#{part}",
+ :allow_nil => !required,
+ :timeliness => { :type => :date } if options[:validate]
+
+ add_attr(:"#{name}_#{part}", :date, converter, options.merge(:default => defaults[part]))
+ end
+ end
+
def attr_boolean(name, options={}, &block)
options = {
:validate => true
}.merge(options)
@@ -63,15 +119,10 @@
converter = block_given? ? block : Converters.converter_for(:boolean)
attr_reader_with_converter name, converter
alias_method "#{name}?", name
- validates name,
- :allow_blank => !required,
- :allow_nil => !required,
- :booleaness => true if options[:validate]
-
attr_writer name
add_attr(name, :boolean, converter, options)
end
@@ -98,11 +149,11 @@
end
validates name,
:allow_blank => !required,
:allow_nil => !required,
- :inclusion => { :in => enum.all } if options[:validate]
+ :inclusion => { :in => enum.values } if options[:validate]
attr_writer name
add_attr(name, :enum, converter, options)
end
@@ -242,10 +293,10 @@
attr_writer name
add_attr(name, type, converter, options)
end
- def add_attr(name, type, converter, options={})
+ def add_attr(name, type, converter=nil, options={})
self._attributes[name] = attribute_info = AttributeInfo.new(name, type, converter, options)
validates name, :presence => true if attribute_info.required?
attribute_info
end
end