lib/herodot/worklog.rb in herodot-0.2.0 vs lib/herodot/worklog.rb in herodot-0.2.1
- old
+ new
@@ -1,85 +1,88 @@
-class Herodot::Worklog
- attr_reader :branches
- END_TRACK_EVENTS = [:work_end, :lunch_break_start, :after_last_dates_end].freeze
- START_TRACK_EVNETS = [:work_start, :lunch_break_end, :before_first_dates_start].freeze
- EVENTS = (END_TRACK_EVENTS + START_TRACK_EVNETS).freeze
+module Herodot
+ class Worklog
+ attr_reader :branches
+ END_TRACK_EVENTS = %i[work_end lunch_break_start after_last_dates_end].freeze
+ START_TRACK_EVNETS = %i[work_start lunch_break_end before_first_dates_start].freeze
+ EVENTS = (END_TRACK_EVENTS + START_TRACK_EVNETS).freeze
- def initialize(config)
- @raw_logs = []
- @branches = {}
- @dates = []
- @config = config
- end
+ def initialize(config)
+ @raw_logs = []
+ @branches = {}
+ @dates = []
+ @config = config
+ end
- def add_entry(time, project_path, branch)
- project = project_path.gsub(@config.projects_directory.to_s, '')
- id = "#{project}:#{branch}"
- @raw_logs << { time: time, id: id }
- @branches[id] = { branch: branch, project: project, path: project_path }
- end
+ def add_entry(time, project_path, branch)
+ return if project_path.nil?
+ project = project_path.gsub(@config.projects_directory.to_s, '')
+ id = "#{project}:#{branch}"
+ @raw_logs << { time: time, id: id }
+ @branches[id] = { branch: branch, project: project, path: project_path }
+ end
- def logs_with_events
- filtered_logs = @raw_logs.chunk { |x| x[:id] }.map(&:last).map(&:first)
- filtered_logs += work_time_events
- filtered_logs << { time: Time.new(0), id: :before_first_dates_start }
- filtered_logs << { time: Time.now, id: :after_last_dates_end }
- filtered_logs.sort_by { |log| log[:time] }
- end
+ def logs_with_events
+ filtered_logs = @raw_logs.chunk { |x| x[:id] }.map(&:last).map(&:first)
+ filtered_logs += work_time_events
+ filtered_logs << { time: Time.new(0), id: :before_first_dates_start }
+ filtered_logs << { time: Time.now, id: :after_last_dates_end }
+ filtered_logs.sort_by { |log| log[:time] }
+ end
- def logs_with_times
- current_id = nil
- logs_with_events.each_cons(2).map do |log, following_log|
- current_id = log[:id] unless EVENTS.include?(log[:id])
- log.merge id: actual_id(current_id, log[:id]),
- time: time_between(log, following_log),
- date: log[:time].to_date
+ def logs_with_times
+ current_id = nil
+ logs_with_events.each_cons(2).map do |log, following_log|
+ current_id = log[:id] unless EVENTS.include?(log[:id])
+ log.merge id: actual_id(current_id, log[:id]),
+ time: time_between(log, following_log),
+ date: log[:time].to_date
+ end
end
- end
- def logs_with_times_cleaned
- logs_with_times.reject { |log| EVENTS.include?(log[:id]) }
- end
+ def logs_with_times_cleaned
+ logs_with_times.reject { |log| EVENTS.include?(log[:id]) }
+ end
- def totals
- grouped = logs_with_times_cleaned.group_by { |time| time[:date] }
- dates.map do |date|
- time_sums = grouped[date].each_with_object({}) do |time, sums|
- id = time[:id]
- sums[id] ||= { time: 0, **branch(id) }
- sums[id][:time] += time[:time]
+ def totals
+ grouped = logs_with_times_cleaned.group_by { |time| time[:date] }
+ dates.map do |date|
+ time_sums = grouped[date].each_with_object({}) do |time, sums|
+ id = time[:id]
+ sums[id] ||= { time: 0, **branch(id) }
+ sums[id][:time] += time[:time]
+ end
+ [date, time_sums.values]
end
- [date, time_sums.values]
end
- end
- def branch(id)
- @branches.fetch(id, {})
- end
+ def branch(id)
+ @branches.fetch(id, {})
+ end
- def dates
- @raw_logs.map { |log| log[:time].to_date }.uniq.sort
- end
+ def dates
+ @raw_logs.map { |log| log[:time].to_date }.uniq.sort
+ end
- def work_time_events
- dates.flat_map do |date|
- @config.work_times.map { |event, (hour, minute)|
- time = Time.new(date.year, date.month, date.day, hour, minute)
- next if time > Time.now
- { id: event, time: time }
- }.compact
+ def work_time_events
+ dates.flat_map do |date|
+ @config.work_times.map { |event, (hour, minute)|
+ time = Time.new(date.year, date.month, date.day, hour, minute)
+ next if time > Time.now
+ { id: event, time: time }
+ }.compact
+ end
end
- end
- def same_date?(log_entry, other_log_entry)
- log_entry[:time].to_date == other_log_entry[:time].to_date
- end
+ def same_date?(log_entry, other_log_entry)
+ log_entry[:time].to_date == other_log_entry[:time].to_date
+ end
- def time_between(log_entry, following_entry)
- return 0 unless same_date?(log_entry, following_entry)
- following_entry[:time] - log_entry[:time]
- end
+ def time_between(log_entry, following_entry)
+ return 0 unless same_date?(log_entry, following_entry)
+ following_entry[:time] - log_entry[:time]
+ end
- def actual_id(current_id, id)
- END_TRACK_EVENTS.include?(id) ? id : current_id || id
+ def actual_id(current_id, id)
+ END_TRACK_EVENTS.include?(id) ? id : current_id || id
+ end
end
end