Parent

Reckon::LedgerParser

Attributes

entries[RW]

Public Class Methods

new(ledger, options = {}) click to toggle source
# File lib/reckon/ledger_parser.rb, line 10
def initialize(ledger, options = {})
  @entries = []
  parse(ledger)
end

Public Instance Methods

balance(accounts) click to toggle source
# File lib/reckon/ledger_parser.rb, line 37
def balance(accounts)
  if accounts.any? { |i| i[:amount].nil? }
    sum = accounts.inject(0) {|m, account| m + (account[:amount] || 0) }
    count = 0
    accounts.each do |account|
      if account[:amount].nil?
        count += 1
        account[:amount] = 0 - sum
      end
    end
    if count > 1
      puts "Warning: unparsable entry due to more than one missing money value."
      p accounts
      puts
    end
  end

  accounts
end
clean_money(money) click to toggle source
# File lib/reckon/ledger_parser.rb, line 57
def clean_money(money)
  return nil if money.nil? || money.length == 0
  money.gsub(/[^0-9.-]/, '').to_f
end
parse(ledger) click to toggle source
# File lib/reckon/ledger_parser.rb, line 15
def parse(ledger)
  @entries = []
  date = desc = nil
  accounts = []
  ledger.strip.split("\n").each do |entry|
    next if entry =~ /^\s*$/ || entry =~ /^[^ \t\d]/
    if entry =~ /^([\d\/-]+)(\=[\d\/-]+)?(\s+[\*!]?\s*.*?)$/
      @entries << { :date => date.strip, :desc => desc.strip, :accounts => balance(accounts) } if date
      date = $1
      desc = $3
      accounts = []
    elsif date && entry =~ /^\s+([a-z\s:_\-]+)(\s*$|(\s+[\$\.,\-\d\+]+)($|\s+($|[^\$\.,\-\d\+])))/
      accounts << { :name => $1.strip, :amount => clean_money($3) }
    else
      @entries << { :date => date.strip, :desc => desc.strip, :accounts => balance(accounts) } if date
      date = desc = nil
      accounts = []
    end
  end
  @entries << { :date => date.strip, :desc => desc.strip, :accounts => balance(accounts) } if date
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.