module ActiveMocker::MockCreator::Attributes

Public Instance Methods

attributes() click to toggle source
# File lib/active_mocker/mock_creator/attributes.rb, line 5
def attributes
  @attributes ||= begin
    a = schema_scrapper.attributes.to_a
    a << primary_key unless a.any? { |aa| aa.name == "id" }
    a.map(&method(:process_attr))
    a
  end
end
enums(attribute) click to toggle source
# File lib/active_mocker/mock_creator/attributes.rb, line 44
def enums(attribute)
  @enums ||= begin
    raw_enums = class_introspector
                  .class_macros
                  .select { |hash| hash.key?(:enum) }
    if raw_enums
      raw_enums
        .map { |hash| hash[:enum].flatten.first }
        .each_with_object({}) { |v, h| h.merge!(v) }
    else
      {}
    end
  end

  @enums.fetch(attribute.to_sym, {})
end
process_attr(attr) click to toggle source
# File lib/active_mocker/mock_creator/attributes.rb, line 14
def process_attr(attr)
  enums                 = enums(attr.name)
  attr.default          = Virtus::Attribute.build(attr.type).coerce(attr.default)
  attr.attribute_writer = "write_attribute(:#{attr.name}, val)"
  attr.attribute_reader = "read_attribute(:#{attr.name})"

  unless enums.empty?
    enum_type = ActiveMocker::AttributeTypes::Enum.build(
      enums:         enums,
      table_name:    table_name,
      attribute:     attr.name,
      db_value_type: attr.type,
    )
    if ActiveRecord::VERSION::MAJOR >= 5
      enum_type.ignore_value = true
      attr.type              = enum_type
      if attr.default
        attr.default = Virtus::Attribute.build(enum_type).get_key(attr.default)
      end
    elsif ActiveRecord::VERSION::MAJOR == 4
      attr.attribute_writer = "@#{attr.name}_enum_type ||= Virtus::Attribute.build(#{enum_type})\nwrite_attribute(:#{attr.name}, @#{attr.name}_enum_type.coerce(val))"
      attr.attribute_reader = "@#{attr.name}_enum_type ||= Virtus::Attribute.build(#{enum_type})\n@#{attr.name}_enum_type.get_key(read_attribute(:#{attr.name}))"
      if attr.default
        attr.default = Virtus::Attribute.build(attr.type).coerce(attr.default)
      end
    end
    attr
  end
end