class HasMeta::MetaData

Attributes

data_type[R]
value[RW]

Public Class Methods

generate_value_hash(*values) click to toggle source
# File lib/has_meta/meta_data.rb, line 23
def self.generate_value_hash *values
  # values = 'some text'
  # values = ['some text', 'some other text']
  # values = ['some text', 'some other text', 9]
  if values.size == 1
    # {text_value: 'some text'}
    value_hash_for values.pop
  else
    # ['some text', 'some other text', 9]
    # [{text_value: 'some text'}, {text_value: 'some other text'}, {integer_value: 9}]
    # {:text_value=>[{:text_value=>"some text"}, {:text_value=>"some other text"}], :integer_value=>[{:integer_value=>9}]}
    # values.map { |value| value_hash_for value }.group_by { |x| x.keys.first }.map {|k, v| {k => v.map {|x| x.values.first}}}
    values
      .map { |value| value_hash_for value }
      .group_by { |x| x.keys.first }
      .reduce({}) do |acc, hash|
        key, value = *hash 
        acc.merge({key => value.size == 1 ? value.first.values.first : value.map {|x| x.values.first}})
      end
      # .map {|k, v| {k => v.map {|x| x.values.first}}}
  end
end

Private Class Methods

date_try_convert(value) click to toggle source
# File lib/has_meta/meta_data.rb, line 104
def self.date_try_convert value
  begin
    value.to_date if value =~ /^\d{4}-\d{2}-\d{2}$/
  rescue
    nil
  end
end
datetime_try_convert(value) click to toggle source
# File lib/has_meta/meta_data.rb, line 112
def self.datetime_try_convert value
  begin
    value.to_datetime if value =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (\+|-)\d{4}$/
  rescue
    nil
  end
end
has_datetime_column?() click to toggle source
# File lib/has_meta/meta_data.rb, line 141
def self.has_datetime_column?
  self.column_names.include? 'datetime_value'
end
max_integer_value() click to toggle source
# File lib/has_meta/meta_data.rb, line 98
def self.max_integer_value
  column_limit = HasMeta::MetaData.column_for_attribute(:integer_value).limit
  column_limit = 4 if column_limit.in? [nil, 11]
  (256**column_limit)/2 - 1
end
resolve_data_type!(value) click to toggle source
# File lib/has_meta/meta_data.rb, line 69
def self.resolve_data_type! value
  case value
  when ->(x) {x.kind_of? Integer}
    if value < max_integer_value
      return :integer, value
    else
      return :text, value.to_s
    end
  when ->(x) {x.kind_of? Float}
    return :decimal, value
  when ->(x) {x.kind_of? Date}
    return :date, value
  when ->(x) {x.acts_like? :time}
    if has_datetime_column?
      return :datetime, value
    else
      return :text, value
    end
  when ->(x) {x.respond_to? :id}
    return :integer, value.id
  else
    return :integer, value.to_i if value =~ /^-?\d+$/
    return :decimal, value.to_f if value =~ /^-?\d*\.\d+$/
    return :date, value.to_date if date_try_convert value
    return :datetime, value.to_datetime if has_datetime_column? and datetime_try_convert(value)
    return :text, value
  end            
end
value_hash_for(value) click to toggle source
# File lib/has_meta/meta_data.rb, line 64
def self.value_hash_for value
  data_type, value = resolve_data_type! value
  {"#{data_type}_value": value}
end

Public Instance Methods

value=(value, options={}) click to toggle source
# File lib/has_meta/meta_data.rb, line 13
def value= value, options={}
  if options[:as]
    @data_type = options[:as]
    @value = value
  else
    @data_type, @value = resolve_data_type! value
  end
  set_attribute
end

Private Instance Methods

convert_type(value) click to toggle source
# File lib/has_meta/meta_data.rb, line 48
def convert_type value
  begin
    if value =~ /^-?\d+/ and value.to_i > 2000000000
      value.to_i
    elsif value =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (\+|-)\d{4}$/
      value.to_time
    elsif value =~ /^\d{4}-\d{2}-\d{2}$/
      value.to_date
    else
      value
    end
  rescue
    value
  end
end
reset_values() click to toggle source
# File lib/has_meta/meta_data.rb, line 130
def reset_values
  value_attributes.keys.each do |attribute|
    self[attribute] = nil
  end
end
resolve_data_type!(value) click to toggle source
# File lib/has_meta/meta_data.rb, line 120
def resolve_data_type! value
  self.class.resolve_data_type! value
end
set_attribute() click to toggle source
# File lib/has_meta/meta_data.rb, line 136
def set_attribute
  reset_values
  self[:"#{@data_type}_value"] = @value
end
value_attributes() click to toggle source
# File lib/has_meta/meta_data.rb, line 124
def value_attributes 
  self.attributes.select do |k, _|
    k =~ /_value/
  end
end