lib/TimeLogger.rb in TimeLogger-0.0.1 vs lib/TimeLogger.rb in TimeLogger-0.0.2

- old
+ new

@@ -1,129 +1,259 @@ \ No newline at end of file +module TimeLogger + class TimeLogger + + def initialize(timer, ui) + @timer, @ui = timer, ui + end + + def start(name) + unless @current_task.nil? + if @current_task.name != name + stop(@current_task.name) + end + end + @current_task = tasks[name] + if @current_task.nil? + @current_task = Task.new(name) + tasks[name] = @current_task + end + @current_task.start(@timer) + + @ui.start(@current_task) + end + + def stop(name) + task = tasks[name] + task.stop(@timer) + @current_task = nil + + @ui.stop(task) + end + + def list + @ui.list(tasks.values) + end + + private + + def tasks + @tasks ||= {} + end + end + + class Task + + def initialize(name) + @name = name + end + + def name + @name + end + + def start(timer) + @activity = TaskActivity.new(timer) + @activity.start + end + + def stop(timer) + @activity.stop + past_activities << @activity + @activity = nil + end + + def time + past_activities.inject(0) { |t, a| t + a.time } + end + + private + + def past_activities + @past_activities ||= [] + end + end + + class TaskActivity + + def initialize(timer) + @timer = timer + end + + def start + @started_at = @timer.now() + end + + def stop + @stopped_at = @timer.now() + end + + def time + diff = @stopped_at.to_i - @started_at.to_i + mins = diff / 60 + end + end + + class Timer + + def now + @now ||= Time.now + end + + def add_minutes(val) + @now = Time.at(@now.to_i + val * 60) + end + end + + class UI + + def start(task) + message("Started task: #{task.name}") + end + + def stop(task) + message("Stopped task: #{task.name} (#{task.time} minutes)") + end + + def list(tasks) + tasks.each do |task| + message("#{task.name} (#{task.time} minutes)") + end + end + + def message(msg) + msgs << msg + end + + def msgs + @msgs ||= [] + end + end +end