class Differential::Calculator::Item

Consider this as being line-level and is the lowest point of calculation. Ultimately a Report object will turn all added Record objects into Item objects (placed in Group objects.)

Attributes

a_records[R]
b_records[R]
id[R]

Public Class Methods

new(id) click to toggle source
# File lib/differential/calculator/item.rb, line 23
def initialize(id)
  raise ArgumentError, 'id is required' unless id

  @a_records  = []
  @b_records  = []
  @id         = id.is_a?(::Differential::Parser::Id) ? id : ::Differential::Parser::Id.new(id)
end

Public Instance Methods

add(record, side) click to toggle source
# File lib/differential/calculator/item.rb, line 31
def add(record, side)
  raise ArgumentError, 'record is required' unless record
  raise ArgumentError, 'side is required'   unless side
  raise ArgumentError, "mismatch: #{record.id} != #{id}" if id != record.id

  totals.add(record.value, side)

  account_for_record(record, side)

  self
end
data_peek(field, side = nil) click to toggle source
# File lib/differential/calculator/item.rb, line 43
def data_peek(field, side = nil)
  data_object = record_peek(side)&.data

  return nil unless data_object

  if data_object.respond_to?(field)
    data_object.send(field)
  elsif data_object.respond_to?(:[])
    data_object[field]
  end
end

Private Instance Methods

account_for_record(record, side) click to toggle source
# File lib/differential/calculator/item.rb, line 67
def account_for_record(record, side)
  case side
  when A
    @a_records << record
  when B
    @b_records << record
  else
    raise ArgumentError, "unknown side: #{side}"
  end

  nil
end
record_peek(side) click to toggle source
# File lib/differential/calculator/item.rb, line 57
def record_peek(side)
  if [nil, A].include?(side) && a_records.any?
    a_records
  elsif [nil, B].include?(side) && b_records.any?
    b_records
  else
    []
  end.first
end