class TimesheetReader::Parser

Parser class

Attributes

keywords[RW]
token[RW]

Public Class Methods

new() click to toggle source
# File lib/timesheet_reader/parser.rb, line 15
def initialize
  @keyword = 'timesheet'
  @token = '##'
end

Public Instance Methods

run(relative_path) click to toggle source
# File lib/timesheet_reader/parser.rb, line 20
def run(relative_path)
  file = read_file(relative_path)
  lines = build_lines(file[:lines])

  { filename: file[:filename], lines: lines }
end

Private Instance Methods

build_lines(lines) click to toggle source
# File lib/timesheet_reader/parser.rb, line 51
def build_lines(lines)
  parsed_lines = parse_statements_block(lines)
  validate_timesheet_intervals(parsed_lines)

  parsed_lines.map do |line|
    statement, hours, minutes = line.split(':')
    validate_time_sheet_hours(hours)
    validate_time_sheet_minutes(minutes)
    hours = hours.to_i.zero? ? 24 : hours.to_i

    { statement: statement, hours: hours, minutes: minutes.to_i }
  end
end
parse_statements_block(lines) click to toggle source
# File lib/timesheet_reader/parser.rb, line 37
def parse_statements_block(lines)
  token_index = lines.index do |line|
    line.downcase == "#{@token} #{@keyword}"
  end

  start_of_block = token_index + 1

  end_of_block = lines[start_of_block..-1].index do |line|
    line.include?(@token.to_s)
  end

  lines[start_of_block..end_of_block]
end
read_file(relative_path) click to toggle source
# File lib/timesheet_reader/parser.rb, line 29
def read_file(relative_path)
  absolute_path = File.expand_path(relative_path)
  _, filename = File.split(relative_path)
  lines = File.read(absolute_path).squeeze("\n").split("\n")

  { filename: filename, lines: lines }
end
validate_time_sheet_hours(hours) click to toggle source
# File lib/timesheet_reader/parser.rb, line 70
def validate_time_sheet_hours(hours)
  hours = hours.to_i
  msg = 'You should use a number between 0-23 to define hours'
  raise ParserError, msg if hours.negative? || hours > 23
end
validate_time_sheet_minutes(minutes) click to toggle source
# File lib/timesheet_reader/parser.rb, line 76
def validate_time_sheet_minutes(minutes)
  minutes = minutes.to_i
  msg = 'You should use a number between 0-59 to define minutes'
  raise ParserError, msg if minutes.negative? || minutes > 59
end
validate_timesheet_intervals(lines) click to toggle source
# File lib/timesheet_reader/parser.rb, line 65
def validate_timesheet_intervals(lines)
  msg = 'You should close the interval of last line'
  raise ParserError, msg if lines.length.odd?
end