class Ptimelog::Day

Wrap loading of all entries of a day

Public Class Methods

new(date) click to toggle source
# File lib/ptimelog/day.rb, line 6
def initialize(date)
  @date = NamedDate.new.date(date)
end

Public Instance Methods

entries() click to toggle source
# File lib/ptimelog/day.rb, line 10
def entries
  timelog.each_with_object({}) do |(date, lines), entries|
    next unless date # guard against the machine
    next unless @date.to_s == 'all' || @date == date # limit to one day if passed

    entries[date] = join_similar(entries_of_day(lines)) # lines |> entries_of_day |> join_similar
  end
end

Private Instance Methods

entries_of_day(lines) click to toggle source
# File lib/ptimelog/day.rb, line 25
def entries_of_day(lines)
  entries = []
  start = nil # at the start of the day, we have no previous end

  lines.each do |line|
    entry = Entry.from_timelog(line)
    entry.start_time = start

    entries << entry if entry.valid?

    start = entry.finish_time # store previous ending for nice display of next entry
  end

  entries
end
join_similar(list) click to toggle source
# File lib/ptimelog/day.rb, line 41
def join_similar(list)
  return [] if list.empty?
  return list if list.one?

  one, *tail = list
  two, *rest = tail

  joined = maybe_join(one, two)

  if joined.one?
    join_similar(joined + rest)
  else
    [one] + join_similar(tail)
  end
end
maybe_join(one, two) click to toggle source
# File lib/ptimelog/day.rb, line 57
def maybe_join(one, two)
  if one.ticket == two.ticket &&
     one.description == two.description &&
     one.finish_time == two.start_time

    joined = one.dup
    joined.finish_time = two.finish_time

    [joined]
  else
    [one, two]
  end
end
timelog() click to toggle source
# File lib/ptimelog/day.rb, line 21
def timelog
  Timelog.load
end