SpeciesFileGroup/taxonworks

View on GitHub
lib/soft_validation/soft_validation_method.rb

Summary

Maintainability
A
45 mins
Test Coverage
module SoftValidation

  # A metadata structure for each soft validation
  class SoftValidationMethod

    # @param [Symbol]
    # the soft validation method
    attr_accessor :method

    # @param [Symbol]
    # the (base) klass that has method
    attr_accessor :klass

    # @return [String, nil]
    #  human name/title of this soft validation
    attr_accessor :name

    # @return [String, nil]
    # human description of this soft validation
    attr_accessor :description

    # @return [Array, nil]
    # of symbols
    attr_accessor :resolution

    # @return [Symbol, nil]
    #  assign this soft validation method to a set
    attr_accessor :set

    # @return [Symbol, nil]
    #  the name of the method that will fix this issue 
    attr_accessor :fix

    # @return [Boolean]
    #   flagged methods are not executed by default
    attr_accessor :flagged

    # @param [Hash] args
    def initialize(options)
      raise(SoftValidationError, 'missing method and klass') if options[:method].nil? || options[:klass].nil?
      options.each do |k,v|
        send("#{k}=", v)
      end
    end

    # @param [Array] v
    # @return [Array]
    def resolution=(v)
      raise(SoftValidationError, 'resolution: must be an Array') if v && v.class != Array
      @resolution = v
      @resolution ||= []
      @resolution
    end

    # @return [Array]
    def resolution
      @resolution || []
    end

    # @return[Boolean]
    #  a name and description provided
    def described?
      !name.blank? && !description.blank?
    end

    # @return[Boolean]
    #   whether there resolutions
    def resolutions?
      resolution.size > 0
    end

    # @return [Boolean]
    def fixable?
      @fix.kind_of?(Symbol)
    end

    # @return [Boolean]
    def flagged? 
      @flagged == true
    end

    # @return[String]
    #   a human readable string describing the general point of this soft validation method
    def to_s
      [(name.blank? ? "#{method} (temporary name)" : name), (description.blank? ? '(no description provided)' : description)].join(': ')
    end

    private

    # @return Boolean
    #   true - the soft validation method should be retained
    #   false - the soft validation method does not match, it will be excluded from soft_validate()
    # @param is_fixable [Boolean, nil] 
    #   nil, false - don't require method be fixable to pass
    #   true - require method to be fixable to pass
    # @param is_flagged [Boolean] 
    #    true - allow all
    #    false - allow only if not flagged 
    def matches?(is_fixable, include_flagged = false)
      a = is_fixable.nil? ? true : (is_fixable ? fixable? : true)
      b = include_flagged == true ? true : !flagged
      a && b
    end
    
  end

end