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