class NamedValidations

Naming to ActiveModel/ActiveRecord validations

Constants

RESERVED

Reserved names

VERSION

Public Class Methods

aliases() click to toggle source

Returns list of defined alias names @return [Array<Symbol>]

# File lib/named_validations.rb, line 35
def aliases
  @aliases ||= []
end
define(name, *spec, &block) click to toggle source

@overload define(name, validation, params)

Defines a new simple alias (define-by-value)
@param name [Symbol] new alias name
@param validation [Symbol] validation name or defined alias name
@param params [Object] parameters or arguments for validation

@overload define(name, block)

Defines a new alias by block (define-by-block)
@param name [Symbol] new alias name
@param block [Proc] body of alias
# File lib/named_validations.rb, line 25
def define(name, *spec, &block)
  raise ArgumentError, "reserved name #{name}" if RESERVED.include?(name)
  return define_by_block(name, block) if spec.empty?

  validation, params, = spec
  define_by_value(name, validation, params)
end

Private Class Methods

define_by_block(name, block) click to toggle source
# File lib/named_validations.rb, line 46
def define_by_block(name, block)
  define_method(name, block)
  aliases << name
  name
end
define_by_value(name, validation, params) click to toggle source
# File lib/named_validations.rb, line 52
def define_by_value(name, validation, params)
  raise ArgumentError,
        "unknown alias #{name}" unless aliases.include?(validation)

  block = -> (*opts) { public_send(validation, params, *opts) }
  define_by_block(name, block)
end
define_for(name) click to toggle source

Defines aliases for ActiveModel/ActiveRecord validations @!macro attach define_for

Apply `$1` to `self` and return a new object
@!method $1(arg, *opts)
@return [NamedValidations]
# File lib/named_validations.rb, line 65
def define_for(name)
  define(name) { |arg, *opts| deep_merge(name, arg, *opts) }
end
inherited(sub_class) click to toggle source
# File lib/named_validations.rb, line 41
def inherited(sub_class)
  # Merge defined alias names list
  aliases.each { |name| sub_class.aliases << name }
end

Public Instance Methods

extractable_options?() click to toggle source

Returns true

@note This method is needed for ActiveSupport ‘Hash#extract_options!`.

# File lib/named_validations.rb, line 89
def extractable_options?
  true
end
inspect() click to toggle source

Inspects self

# File lib/named_validations.rb, line 94
def inspect
  klass = self.class
  class_name = klass.name ||
               Kernel.format('(Anonymous:0x%x)', klass.object_id)
  Kernel.format('#<%s:0x%x>', class_name, object_id)
end

Protected Instance Methods

deep_merge(validation, params, *opts) click to toggle source

Returns a new object containing the given validations and the current validations.

# File lib/named_validations.rb, line 105
def deep_merge(validation, params, *opts)
  new_obj = deep_merge_internal(validation, params)
  opts.inject(new_obj) { |obj, opt| obj.deep_merge(validation, opt) }
end

Private Instance Methods

deep_merge_internal(validation, params) click to toggle source
# File lib/named_validations.rb, line 112
def deep_merge_internal(validation, params)
  cur_params = self[validation]
  if !params.is_a?(Hash) || !cur_params.is_a?(Hash)
    new_params = params
  else
    new_params = params.inject(cur_params) do |hash, (key, value)|
      hash.merge(key => value)
    end
  end

  merge(validation => new_params)
end