sanger/sequencescape

View on GitHub
lib/validateable.rb

Summary

Maintainability
A
0 mins
Test Coverage
B
80%
# frozen_string_literal: true
module Validateable
  %i[save save! update_attribute].each { |attr| define_method(attr) {} }

  def method_missing(symbol, *_params)
    send($1) if symbol.to_s =~ /(.*)_before_type_cast$/
  end

  def self.append_features(base)
    super
    base.send(:include, ActiveModel::Validations)
    base.extend ClassMethods
  end

  def validate!
    raise(ActiveRecord::RecordInvalid, self) unless valid?
  end

  module ClassMethods
    def self_and_descendants_from_active_record
      [self]
    end

    def human_attribute_name(attribute_key_name, options = {}) # rubocop:todo Metrics/AbcSize
      defaults =
        self_and_descendants_from_active_record.map do |klass|
          "#{klass.name.underscore}.#{attribute_key_name}" \
            "#{klass.name.underscore}.#{attribute_key_name}"
        end
      defaults << options[:default] if options[:default]
      defaults.flatten!
      defaults << attribute_key_name.to_s.humanize
      options[:count] ||= 1
      I18n.t(defaults.shift, **options.merge(default: defaults, scope: %i[activerecord attributes]))
    end

    def human_name(options = {})
      defaults =
        self_and_descendants_from_active_record.map do |klass|
          "#{klass.name.underscore}" \
            "#{klass.name.underscore}"
        end
      defaults << name.humanize
      I18n.t(defaults.shift, { scope: %i[activerecord models], count: 1, default: defaults }.merge(options))
    end
  end
end