lib/dolly/property.rb in dolly-1.1.7 vs lib/dolly/property.rb in dolly-3.0.0

- old
+ new

@@ -1,85 +1,96 @@ +require 'refinements/string_refinements' + module Dolly class Property - attr_writer :value - attr_accessor :name - attr_reader :class_name, :default + attr_reader :key, :class_name, :default + CANT_CLONE = [NilClass, TrueClass, FalseClass, Integer] - CANT_CLONE = [NilClass, TrueClass, FalseClass, Fixnum].freeze + using StringRefinements - def initialize opts = {} - @class_name = opts.delete(:class_name) if opts.present? - @name = opts.delete(:name).to_s - @default = opts.delete(:default) - @default = @default.clone if @default && CANT_CLONE.none? { |klass| @default.is_a? klass } - @value = @default if @default - warn 'There are some unprocessed options!' if opts.present? + def initialize(key, class_name, default = nil) + @key = key + @default = default + @class_name = class_name end - def value - #TODO: tets if this actually sets `doc[ "name" ]` - return @default if @value.nil? - return @value unless self_klass + def cast_value(value) + return set_default if value.nil? + return value unless class_name + return self_klass.new(value) unless respond_to?(klass_sym) + send(klass_sym, value) + end - klass_sym = :"#{self_klass.name.underscore}_#{__method__}" + def boolean? + [TrueClass, FalseClass].include?(class_name) + end - return self_klass.new @value unless self.respond_to?(klass_sym) - - self.send klass_sym + def string_value(value) + value.to_s end - def array_value - @value.to_a + def hash_value(value) + value.to_h end - def hash_value - @value.to_h + def integer_value(value) + value.to_i end - def string_value - @value.to_s + def float_value(value) + value.to_f end - def integer_value - @value.to_i + def date_value(value) + return value.to_date if value.respond_to?(:to_date) + Date.parse(value) end - def float_value - @value.to_f + def time_value(value) + return value.to_time if value.respond_to?(:to_time) + DateTime.parse(value).to_time end - def date_value - @value.to_date + def date_time_value(value) + return value.to_datetime if value.respond_to?(:to_datetime) + DateTime.parse(value) end - def time_value - @value.to_time + def true_class_value(value) + truthy_value?(value) end - def date_time_value - @value.to_datetime + def false_class_value(value) + truthy_value?(value) end - def true_class_value - truthy_value? + private + + def truthy_value?(value) + value =~ /true/ || value === true end - def false_class_value - truthy_value? + def klass_sym + :"#{self_klass.name.underscore}_value" end - def boolean? - self_klass == TrueClass || self_klass == FalseClass + def self_klass + return unless class_name + return class_name if class_name.is_a?(Class) + Object.const_get class_name end - private - def truthy_value? - @value =~ /true/ || @value === true + def set_default + return unless default_present? + return default unless cant_clone_default? + default.clone end - def self_klass - return unless @class_name - @class_name.is_a?(Class)? @class_name : @class_name.constantize + def cant_clone_default? + CANT_CLONE.none? { |klass| default.is_a? klass } end + def default_present? + !default.nil? + end end end