validates_timeliness/lib/validates_timeliness/attribute_methods.rb
Adam Meehan e5bb096161 Move method generation to ActiveModel only and use type system in AR
The ActiveModel type system with extensions in ActiveRecord provide
us a lot of convenience. Some general attribute code is now moved to
ActiveModel only as the AR types provide raw value capturing
(before_type_cast) and type classes to handle type specific string
value parsing if enabled.

In my view, we need to go futher and strip out more from ActiveModel
extension but at least we should have compatibility at the moment.
2018-05-19 15:22:23 +10:00

49 lines
1.3 KiB
Ruby

module ValidatesTimeliness
module AttributeMethods
extend ActiveSupport::Concern
included do
class_attribute :timeliness_validated_attributes
self.timeliness_validated_attributes = []
end
end
end
ActiveModel::Type::Date.class_eval do
# Module.new do |m|
def cast_value(value)
return super unless ValidatesTimeliness.use_plugin_parser
if value.is_a?(::String)
return if value.empty?
value = Timeliness::Parser.parse(value, :date)
value.to_date if value
elsif value.respond_to?(:to_date)
value.to_date
else
value
end
end
# end.tap { |mod| include mod }
end
ActiveModel::Type::Time.class_eval do
def user_input_in_time_zone(value)
if value.is_a?(String) && ValidatesTimeliness.use_plugin_parser
dummy_time_value = value.sub(/\A(\d\d\d\d-\d\d-\d\d |)/, Date.current.to_s + ' ')
Timeliness::Parser.parse(dummy_time_value, :datetime, zone: :current)
else
value.in_time_zone
end
end
end
ActiveModel::Type::DateTime.class_eval do
def user_input_in_time_zone(value)
if value.is_a?(String) && ValidatesTimeliness.use_plugin_parser
Timeliness::Parser.parse(value, :datetime, zone: :current)
else
value.in_time_zone
end
end
end