class RailsAttrEnum::EnumAccumulator

Class to build up enum values

Attributes

entries[R]
validation_rules[R]

Public Class Methods

new() click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 9
def initialize
  @entries = []
  @validation_rules = {}
  @values = SortedSet.new
end

Public Instance Methods

add(key) click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 15
def add(key)
  if key.is_a?(Hash)
    key, value = key.first

    case value
    when String
      label = value
      value = next_free_value
    when Hash
      label = value[:label] || key.to_s.titleize
      value = value[:value] || next_free_value
    when Numeric
      label = key.to_s.titleize
    end
  else
    value = next_free_value
    label = key.to_s.titleize
  end

  const_name = key.to_s.upcase

  add_entry(const_name, key, value, label)
end
validates(rules = {}) click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 39
def validates(rules = {})
  @validation_rules = rules
end

Private Instance Methods

add_entry(const_name, key, value, label) click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 45
def add_entry(const_name, key, value, label)
  Entry.new(const_name, key, value, label).tap do |entry|
    revalue_entries!(value)
    @entries << entry
    @values << value
  end
end
next_free_value() click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 61
def next_free_value
  counter = 0
  value =
    if @values.empty?
      0
    else
      @values.each do |v|
        next if v < 0
        break if v != counter
        counter += 1
      end
      counter
    end

  value
end
next_free_value!() click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 78
def next_free_value!
  next_free_value.tap { |v| @values << v }
end
revalue_entries!(value) click to toggle source
# File lib/rails_attr_enum/enum_accumulator.rb, line 53
def revalue_entries!(value)
  @entries.each do |entry|
    if entry.value == value
      entry.value = next_free_value!
    end
  end
end