class Deeds::Journal

Attributes

file[R]
hours_per_work_day[R]
work_days_per_week[R]

Public Class Methods

new(file:, hours_per_work_day: 8, work_days_per_week: 5) click to toggle source
# File lib/deeds/journal.rb, line 8
def initialize(file:, hours_per_work_day: 8, work_days_per_week: 5)
  @file = Pathname.new(file)
  @hours_per_work_day = hours_per_work_day
  @work_days_per_week = work_days_per_week
end

Public Instance Methods

average_hours_per_day() click to toggle source
# File lib/deeds/journal.rb, line 59
def average_hours_per_day
  return 0 if average_minutes_per_day.zero?
  average_minutes_per_day / 60
end
average_minutes_per_day() click to toggle source
# File lib/deeds/journal.rb, line 54
def average_minutes_per_day
  return 0 if minutes.zero?
  minutes / days_count
end
days_count() click to toggle source
# File lib/deeds/journal.rb, line 50
def days_count
  entries_per_day.keys.count
end
days_with_more_than_one_entry() click to toggle source
# File lib/deeds/journal.rb, line 72
def days_with_more_than_one_entry
  entries_per_day.values.select { |entries| entries.count > 1 }.count
end
dump() click to toggle source
# File lib/deeds/journal.rb, line 14
def dump
  entries.map(&:dump).join "\n"
end
entries() click to toggle source
# File lib/deeds/journal.rb, line 18
def entries
  all_entries.reject(&:error)
end
first_monday() click to toggle source
# File lib/deeds/journal.rb, line 64
def first_monday
  @first_monday ||= entries.sort_by(&:mjd).detect(&:monday?).try!(:date)
end
full_time_days() click to toggle source
# File lib/deeds/journal.rb, line 38
def full_time_days
  hours / hours_per_work_day
end
full_time_months() click to toggle source
# File lib/deeds/journal.rb, line 46
def full_time_months
  full_time_weeks / (52 / 12)
end
full_time_weeks() click to toggle source
# File lib/deeds/journal.rb, line 42
def full_time_weeks
  full_time_days / work_days_per_week
end
hours() click to toggle source
# File lib/deeds/journal.rb, line 34
def hours
  minutes / 60
end
invalid_entries() click to toggle source
# File lib/deeds/journal.rb, line 22
def invalid_entries
  all_entries.select(&:error)
end
last_sunday() click to toggle source
# File lib/deeds/journal.rb, line 68
def last_sunday
  @last_sunday ||= entries.sort_by(&:mjd).reverse.detect(&:sunday?).try!(:date)
end
minutes() click to toggle source
# File lib/deeds/journal.rb, line 30
def minutes
  BigDecimal.new entries.sum(&:minutes)
end
void_entries() click to toggle source
# File lib/deeds/journal.rb, line 26
def void_entries
  all_entries.reject(&:minutes?)
end

Private Instance Methods

all_entries() click to toggle source
# File lib/deeds/journal.rb, line 80
def all_entries
  @all_entries ||= all_entries!
end
all_entries!() click to toggle source
# File lib/deeds/journal.rb, line 84
def all_entries!
  result = []
  file.each_line.with_index do |line, index|
    next if line.blank?
    next if line.strip.start_with?('#')
    result << Journals::Entry.new(input: line.chomp, line: index + 1)
  end
  result
end
entries_per_day() click to toggle source
# File lib/deeds/journal.rb, line 94
def entries_per_day
  @entries_per_day ||= entries_per_day!
end
entries_per_day!() click to toggle source
# File lib/deeds/journal.rb, line 98
def entries_per_day!
  result = {}
  entries.each do |entry|
    next if entry.date.nil?
    result[entry.date.mjd] ||= []
    result[entry.date.mjd] << entry
  end
  result
end