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