module Vinber

Constants

VERSION
VINBER_CONFLICT_MESSAGE

Public Class Methods

extended(base) click to toggle source
# File lib/vinber.rb, line 10
def self.extended(base)
  base.class_attribute(:defined_vinbers, instance_writer: false)
  base.defined_vinbers = {}
end

Public Instance Methods

inherited(base) click to toggle source
Calls superclass method
# File lib/vinber.rb, line 15
def inherited(base)
  base.defined_vinbers = defined_vinbers.deep_dup
  super
end
vinber(definitions) click to toggle source
# File lib/vinber.rb, line 20
def vinber(definitions)
  need_validates = definitions.delete(:validates)
  need_scope = definitions.delete(:scope)
  definitions.each do |name, values|
    detect_vinber_conflict! name
    validates_from_vinber name, values if need_validates
    scope_from_vinber name, values if need_scope
    defined_vinbers[name.to_s] = case
    when values.is_a?(Hash)
      values.with_indifferent_access
    when values.is_a?(Array)
      values
    else
      Array.wrap values.to_s
    end
  end
end
vinber_defined?(attr_key = nil) click to toggle source
# File lib/vinber.rb, line 42
def vinber_defined?(attr_key = nil)
  attr_key ? defined_vinbers.has_key?(attr_key.to_s) : defined_vinbers.present?
end
vinbers() click to toggle source
# File lib/vinber.rb, line 38
def vinbers
  Vinber::CurrentVinbers.new defined_vinbers
end

Private Instance Methods

detect_vinber_conflict!(name) click to toggle source
# File lib/vinber.rb, line 51
def detect_vinber_conflict!(name)
  if vinber_defined?(name)
    raise_vinber_conflict_error(name, 'Vinber')
  elsif defined_enums[name.to_s]
    raise_vinber_conflict_error(name, 'Enum')
  end
end
raise_vinber_conflict_error(name, source) click to toggle source
# File lib/vinber.rb, line 72
def raise_vinber_conflict_error(name, source)
  raise ArgumentError, VINBER_CONFLICT_MESSAGE % {
    name: name,
    klass: self.name,
    source: source
  }
end
scope_from_vinber(name, val) click to toggle source
# File lib/vinber.rb, line 64
def scope_from_vinber(name, val)
  if val.is_a?(Hash)
    val.each do |key, value|
      class_eval { scope key, -> { where(name => value) } }
    end
  end
end
validates_from_vinber(name, val) click to toggle source
# File lib/vinber.rb, line 59
def validates_from_vinber(name, val)
  val = val.is_a?(Hash) ? val.values : Array.wrap(val).flatten
  class_eval { validates name.to_sym, inclusion: {in: val} }
end