class Reckon::DateColumn

Attributes

endian_precedence[RW]

Public Class Methods

likelihood(entry) click to toggle source
# File lib/reckon/date_column.rb, line 60
def self.likelihood(entry)
  date_score = 0
  date_score += 10 if entry =~ /\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i
  date_score += 5 if entry =~ /^[\-\/\.\d:\[\]]+$/
  date_score += entry.gsub(/[^\-\/\.\d:\[\]]/, '').length if entry.gsub(/[^\-\/\.\d:\[\]]/, '').length > 3
  date_score -= entry.gsub(/[\-\/\.\d:\[\]]/, '').length
  date_score += 30 if entry =~ /^\d+[:\/\.-]\d+[:\/\.-]\d+([ :]\d+[:\/\.]\d+)?$/
  date_score += 10 if entry =~ /^\d+\[\d+:GMT\]$/i
  return date_score
end
new( arr = [], options = {} ) click to toggle source
# File lib/reckon/date_column.rb, line 4
def initialize( arr = [], options = {} )
  @options = options
  arr.each do |value|
    if options[:date_format]
      begin
        value = Date.strptime(value, options[:date_format])
      rescue
        puts "I'm having trouble parsing '#{value}' with the desired format: #{options[:date_format]}"
        exit 1
      end
    else
      value = [$1, $2, $3].join("/") if value =~ /^(\d{4})(\d{2})(\d{2})\d+\[\d+\:GMT\]$/ # chase format
      value = [$3, $2, $1].join("/") if value =~ /^(\d{2})\.(\d{2})\.(\d{4})$/            # german format
      value = [$3, $2, $1].join("/") if value =~ /^(\d{2})\-(\d{2})\-(\d{4})$/            # nordea format
      value = [$1, $2, $3].join("/") if value =~ /^(\d{4})\-(\d{2})\-(\d{2})$/            # yyyy-mm-dd format
      value = [$1, $2, $3].join("/") if value =~ /^(\d{4})(\d{2})(\d{2})/                 # yyyymmdd format


      unless @endian_precedence # Try to detect endian_precedence
        reg_match = value.match( /^(\d\d)\/(\d\d)\/\d\d\d?\d?/ )
        # If first one is not \d\d/\d\d/\d\d\d?\d set it to default
        if !reg_match
          @endian_precedence = [:middle, :little]
        elsif reg_match[1].to_i > 12
          @endian_precedence = [:little]
        elsif reg_match[2].to_i > 12
          @endian_precedence = [:middle]
        end
      end
    end
    self.push( value )
  end
  # if endian_precedence still nil, raise error
  unless @endian_precedence || options[:date_format]
    raise( "Unable to determine date format. Please specify using --date-format" )
  end
end

Public Instance Methods

for( index ) click to toggle source
# File lib/reckon/date_column.rb, line 42
def for( index )
  value = self.at( index )
  guess = Chronic.parse(value, :context => :past,
                        :endian_precedence => @endian_precedence )
  if guess.to_i < 953236800 && value =~ /\//
    guess = Chronic.parse((value.split("/")[0...-1] + [(2000 + value.split("/").last.to_i).to_s]).join("/"), :context => :past,
                          :endian_precedence => @endian_precedence)
  end
  guess && guess.to_date
end
pretty_for(index) click to toggle source
# File lib/reckon/date_column.rb, line 53
def pretty_for(index)
  date = self.for(index)
  return "" if date.nil?

  date.strftime(@options[:ledger_date_format] || '%Y-%m-%d')
end