class Outcome
Constants
- FILENAME
Attributes
baseline[RW]
baseline_date[RW]
last_measure[R]
name[R]
persist[RW]
scale[R]
target[RW]
target_date[RW]
Public Class Methods
new(name, scale, persist = false)
click to toggle source
register a name (String
) and scale (Scale
) of measurement at creation time
# File lib/mobiusloop/outcome.rb, line 20 def initialize(name, scale, persist = false) raise "name must not be nil" if name == nil raise "scale must be of type Scale" unless scale.is_a? Scale @name = name @scale = scale @persist = persist end
Public Instance Methods
format_number(measure)
click to toggle source
format number for display (1000000 => 1,000,000) unless number starts with 0 or .
# File lib/mobiusloop/outcome.rb, line 52 def format_number(measure) if measure != nil || measure.value != nil whole, decimal = measure.value.to_s.split(".") whole_with_commas = whole.chars.to_a.reverse.each_slice(3).map(&:join).join(",").reverse [whole_with_commas, decimal].compact.join(".") end end
measure()
click to toggle source
perform the measurement using the provide scale delegate the details to any class extending Scale
TODO: Change measurement to benchmark
# File lib/mobiusloop/outcome.rb, line 31 def measure begin start_time = Time.now @last_measure = @scale.measure elapsed_time = (Time.now - start_time) return "Success! Measured " + format_number(@last_measure) + " " + @name + " in #{elapsed_time.round(1)} seconds!" rescue Exception => e return "Error! Measurement failed with message: " + e.message end end
report()
click to toggle source
used to report progress towards goals
# File lib/mobiusloop/outcome.rb, line 43 def report report = "" report << report_progress report << report_remaining report end
Private Instance Methods
percent_progress()
click to toggle source
percentage progress towards target as of now
# File lib/mobiusloop/outcome.rb, line 138 def percent_progress ((@last_measure.value.to_i - @baseline.to_i).to_f / (@target.to_i - @baseline.to_i).to_f * 100) end
percent_remaining()
click to toggle source
percent remaining
# File lib/mobiusloop/outcome.rb, line 150 def percent_remaining 100 - percent_progress end
percent_schedule()
click to toggle source
percentage schedule used as of o now
# File lib/mobiusloop/outcome.rb, line 144 def percent_schedule ((DateTime.now - DateTime.parse(@baseline_date)).to_i / (DateTime.parse(@target_date) - DateTime.parse(@baseline_date)).to_f * 100) end
progress_days()
click to toggle source
days from baseline date until now
# File lib/mobiusloop/outcome.rb, line 155 def progress_days (DateTime.now - DateTime.parse(baseline_date)).to_i end
remaining_days()
click to toggle source
days remaining until target date
# File lib/mobiusloop/outcome.rb, line 160 def remaining_days (DateTime.parse(target_date) - DateTime.now).to_i end
report_progress()
click to toggle source
report percentage progress towards the target
# File lib/mobiusloop/outcome.rb, line 76 def report_progress config = ConfigFile.load_template("#{Dir.pwd}/goals/support/config.yml") progress = percent_progress.round(0) schedule = percent_schedule.round(0) delta = (progress - schedule).abs days = progress_days result = "" # TODO: FIX LOGIC, ADD MORE TEST CASES if config.has_key?('progress') && config['progress'].has_key?('green_threshold') && config['progress'].has_key?('red_threshold') good = config['progress']['green_threshold'].to_i bad = config['progress']['red_threshold'].to_i if (delta <= good) result = "#{progress}% progress to target using #{schedule}% of the time (#{days} days)\n".colorize(:green) elsif (delta >= bad) result = "#{progress}% progress to target using #{schedule}% of the time (#{days} days)\n".colorize(:red) else result = "#{progress}% progress to target using #{schedule}% of the time (#{days} days)\n".colorize(:yellow) end end result end
report_remaining()
click to toggle source
# File lib/mobiusloop/outcome.rb, line 103 def report_remaining config = ConfigFile.load_template("#{Dir.pwd}/goals/support/config.yml") days_remaining = remaining_days remaining = percent_remaining.round(0) progress = percent_progress.round(0) schedule = percent_schedule.round(0) delta = (progress - schedule).abs result = "" if config.has_key?('progress') && config['progress'].has_key?('good_percent') && config['progress'].has_key?('bad_percent') good = config['progress']['good_percent'].to_i bad = config['progress']['bad_percent'].to_i # if delta is positive, green # if delta is negative, but still within green threshold, green # if delta is negative, and greater than red threshold, red # else yellow if (delta >= 0) result = "#{remaining}% remaining to target in #{days_remaining} days\n".colorize(:green) elsif (delta < 0 && delta <= good) result = "#{remaining}% remaining to target in #{days_remaining} days\n".colorize(:green) elsif (delta < 0 && delta >= bad) result = "#{remaining}% remaining to target in #{days_remaining} days\n".colorize(:red) else result = "#{remaining}% remaining to target in #{days_remaining} days\n".colorize(:yellow) end end result end
status()
click to toggle source
report the status. Very simplistic now, need to validate if there is need for this or we should just drop and let others determine status
# File lib/mobiusloop/outcome.rb, line 65 def status status = percent_progress - percent_schedule # this value of 10 is temporary. TODO: need to make this more flexible and explainable if status.abs < 10 "Hooray! You are on track!\n" else "Sorry, you are not on track\n" end end