module Bitfields::InstanceMethods
Public Instance Methods
bitfield_changes()
click to toggle source
# File lib/bitfields.rb, line 187 def bitfield_changes self.class.bitfields.values.flat_map(&:keys).each_with_object({}) do |bit, changes| old, current = bitfield_value_was(bit), bitfield_value(bit) changes[bit.to_s] = [old, current] unless old == current end end
bitfield_values(column)
click to toggle source
# File lib/bitfields.rb, line 183 def bitfield_values(column) Hash[self.class.bitfields[column.to_sym].map{|bit_name, _| [bit_name, bitfield_value(bit_name)]}] end
Private Instance Methods
bitfield_info(bit_name)
click to toggle source
# File lib/bitfields.rb, line 236 def bitfield_info(bit_name) column = self.class.bitfield_column(bit_name) [ column, self.class.bitfields[column][bit_name], # bit (send(column)||0) # current value ] end
bitfield_value(bit_name)
click to toggle source
# File lib/bitfields.rb, line 196 def bitfield_value(bit_name) _, bit, current_value = bitfield_info(bit_name) current_value & bit != 0 end
bitfield_value_before_last_save(bit_name)
click to toggle source
# File lib/bitfields.rb, line 206 def bitfield_value_before_last_save(bit_name) column, bit, _ = bitfield_info(bit_name) column_before_last_save = send("#{column}_before_last_save") column_before_last_save.nil? ? nil : column_before_last_save & bit != 0 end
bitfield_value_change(bit_name)
click to toggle source
# File lib/bitfields.rb, line 212 def bitfield_value_change(bit_name) values = [bitfield_value_was(bit_name), bitfield_value(bit_name)] values unless values[0] == values[1] end
bitfield_value_was(bit_name)
click to toggle source
# File lib/bitfields.rb, line 201 def bitfield_value_was(bit_name) column, bit, _ = bitfield_info(bit_name) send("#{column}_was") & bit != 0 end
saved_change_to_bitfield_value(bit_name)
click to toggle source
# File lib/bitfields.rb, line 217 def saved_change_to_bitfield_value(bit_name) value_before_last_save = bitfield_value_before_last_save(bit_name) current_value = bitfield_value(bit_name) unless value_before_last_save.nil? || (value_before_last_save == current_value) [value_before_last_save, current_value] end end
set_bitfield_value(bit_name, value)
click to toggle source
# File lib/bitfields.rb, line 225 def set_bitfield_value(bit_name, value) column, bit, current_value = bitfield_info(bit_name) new_value = TRUE_VALUES.include?(value) old_value = bitfield_value(bit_name) return if new_value == old_value # 8 + 1 == 9 // 8 + 8 == 8 // 1 - 8 == 1 // 8 - 8 == 0 new_bits = if new_value then current_value | bit else (current_value | bit) - bit end send("#{column}=", new_bits) end