Sha256: 757d0da1af272a3cb2524c5d734b9518228b11b1405e3bceffca29a8140e521f

Contents?: true

Size: 1.47 KB

Versions: 4

Compression:

Stored size: 1.47 KB

Contents

# rubocop:disable all
# frozen_string_literal: true

class ActWithFlags::Admin

  attr_reader :model
  attr_reader :origin
  attr_reader :delete_mask

  def initialize(model)
    @model = model
    @origin = :flags
    @map = {}
    @delete_mask = 0
    @max_position = 512 - 1
    @boolean_hash = {}
    [true,  'true',  1, '1'].each { |x| @boolean_hash[x] = true }
    [false, 'false', 0, '0'].each { |x| @boolean_hash[x] = false }
  end

  def reset_model(model)
    initialize model
  end

  def names
    @map.keys.sort
  end

  def to_boolean(value)
    res = @boolean_hash[value]
    return res  unless res.nil?

    raise "invalid boolean <#{value}>"
  end

  def origin=(name)
    raise 'invalid update of origin'  unless @map.empty? || (origin == name)
    @origin = name
  end

  def position(name)
    pos = @map[name]
    return pos  if pos

    parent = self.model.superclass.act_with_flags
    return parent.position(name)  if parent

    raise "unknown flag '#{model}##{name}'"
  end

  def mask(*names)
    names.inject(0) { |msk, name| msk | ( 1 << position(name) ) }
  end

  def add(name, pos)
    values = @map.values
    pos ||= (0..@max_position).detect { |i| !values.include?(i) }
    raise "invalid position '#{name} @ #{pos}'"  unless pos
    raise "name in use '#{name} @ #{pos}'"       if @map.key?(name)
    raise "position in use '#{name} @ #{pos}'"   if @map.value?(pos)
    @map[name] = pos
  end

  def add_to_delete_mask(name)
    @delete_mask |= mask(name)
  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
act_with_flags-0.2.4 lib/act_with_flags/admin.rb
act_with_flags-0.2.3 lib/act_with_flags/admin.rb
act_with_flags-0.2.0 lib/act_with_flags/admin.rb
act_with_flags-0.1.0 lib/act_with_flags/admin.rb