Skip to content

Instantly share code, notes, and snippets.

@cfcosta
Created June 17, 2013 17:47
Show Gist options
  • Save cfcosta/5798725 to your computer and use it in GitHub Desktop.
Save cfcosta/5798725 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'fileutils'
require 'rubygems'
require 'sqlite3'
class WeightTracker
def initialize
@db_file = File.expand_path("~/.wt.db")
end
def setup
db.execute <<-SQL
create table if not exists weights (
time datetime,
weight float
)
SQL
end
def teardown
FileUtils.cp(@db_file, @db_file + ".bkp.#{Date.today}")
FileUtils.rm(@db_file)
end
def insert(time, weight)
db.execute("insert into weights values(?, ?)", [time.to_s, weight])
end
def averages
db.execute("select date(time), avg(weight) from weights group by date(time) order by date(time)")
end
private
def db
@db ||= SQLite3::Database.new(@db_file)
end
end
class ConsoleAverageWeightRenderer
def initialize(data)
@data = data
end
def render
puts "-" * 30
older_weight = 0
@data.each do |date, weight|
pretty_weight = "% 4.1f" % weight
if weight > older_weight
pretty_weight = red(pretty_weight)
else
pretty_weight = green(pretty_weight)
end
older_weight = weight
puts "| %s %s | %s |" % [date, " " * 6, pretty_weight]
end
puts "-" * 30
end
private
def green(str) "\e[32m#{str}\e[0m" end
def red(str) "\e[31m#{str}\e[0m" end
end
tracker = WeightTracker.new
case ARGV[0]
when 'setup'
tracker.setup
puts "Setup ran correctly."
when 'teardown'
tracker.teardown
puts "Teardown ran correctly."
when 'insert'
value = Float(ARGV[1].to_s)
tracker.insert(DateTime.now, value)
puts "Weight #{value} inserted for time #{DateTime.now}! Keep up the good work!"
when 'averages'
ConsoleAverageWeightRenderer.new(tracker.averages).render
else
puts "No idea what you mean by that dude"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment