class ActiveRecordSchemaScrapper::Attributes

Constants

DEFAULT_REGISTERED_DEFAULTS
DEFAULT_REGISTERED_TYPES

Attributes

model[R]

Public Class Methods

new(model:) click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 84
def initialize(model:)
  @model  = model
  @errors = []
end
register_default(default:, replacement_default:, cast_type: :not_given, type: :not_given) click to toggle source

@param [String] default original default value from schema @param [Object] replacement_default the replacement value @param [Object#===, Proc#===] cast_type to be compared to the db schema returned value @param [Symbol] type matches the type from the schema

# File lib/active_record_schema_scrapper/attributes.rb, line 68
def register_default(default:, replacement_default:, cast_type: :not_given, type: :not_given)
  registered_defaults << { default: default, replacement_default: replacement_default, cast_type: cast_type, type: type }
end
register_type(name:, klass:, cast_type: :not_given) click to toggle source

@param [Symbol] name original type from schema @param [Object, Virtus::Attribute] klass a ruby type used to coerce values @param [Object#===, Proc#===] cast_type to be compared to the db schema returned value

# File lib/active_record_schema_scrapper/attributes.rb, line 26
def register_type(name:, klass:, cast_type: :not_given)
  registered_types << { type: name, replacement_type: klass, cast_type: cast_type }
end
registered_defaults() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 72
def registered_defaults
  @registered_defaults ||= DEFAULT_REGISTERED_DEFAULTS.dup
end
registered_types() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 30
def registered_types
  @registered_types ||= DEFAULT_REGISTERED_TYPES.dup
end
reset_registered_defaults() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 76
def reset_registered_defaults
  @registered_defaults = DEFAULT_REGISTERED_DEFAULTS.dup
end
reset_registered_types() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 34
def reset_registered_types
  @registered_types = DEFAULT_REGISTERED_TYPES.dup
end

Public Instance Methods

each() { |attr| ... } click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 91
def each
  call.each { |attr| yield(attr) }
end
errors() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 99
def errors
  to_a
  @errors
end
to_a() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 95
def to_a
  @to_a ||= map { |v| v }
end

Private Instance Methods

call() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 106
def call
  @attributes ||= begin
    parse_attributes
  rescue NoMethodError => e
    no_method_error(e)
  rescue TypeError => e
    model.try!(:abstract_class?) ? statement_invalid(e) : []
  rescue ActiveRecord::StatementInvalid => e
    statement_invalid(e)
  end
end
cast_type(v) click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 154
def cast_type(v)
  if v.respond_to?(:cast_type)
    v.cast_type
  elsif v.respond_to?(:sql_type_metadata)
    v.sql_type_metadata
  end
end
no_method_error(e) click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 133
def no_method_error(e)
  puts e.message
  @errors << ErrorObject.new(class_name:     model.name,
                             message:        "#{model.name} is not a valid ActiveRecord model.",
                             original_error: e,
                             level:          :error,
                             type:           :invalid_model)
  []
end
parse_attributes() click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 118
def parse_attributes
  model.columns_hash.map do |k, v|
    ActiveRecordSchemaScrapper::Attribute.new(
      name:      k,
      type:      v.type,
      precision: v.precision,
      limit:     v.limit,
      scale:     v.scale,
      default:   v.default,
      null:      v.null,
      cast_type: cast_type(v)
    )
  end
end
statement_invalid(e) click to toggle source
# File lib/active_record_schema_scrapper/attributes.rb, line 143
def statement_invalid(e)
  level   = model.abstract_class? ? :warn : :error
  message = model.abstract_class? ? "#{model.name} is an abstract class and has no associated table." : e.try!(:message)
  @errors << ErrorObject.new(class_name:     model.name,
                             message:        message,
                             original_error: e,
                             level:          level,
                             type:           :no_table)
  []
end