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