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