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