Last active
August 29, 2015 14:05
-
-
Save benjaminjb/0ef05665c1f4500f57c9 to your computer and use it in GitHub Desktop.
first day hw--a recipe parser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Recipe | |
attr_reader :name, :servings, :ingredients | |
def initialize(name, servings) | |
@name = name | |
@servings = servings | |
@ingredients = [] | |
end | |
def add_ingredient(i) | |
@ingredients << i | |
end | |
# I added this publish method just to see if it was working correctly/make it look nice | |
def publish | |
print "For #{@name}, you will need:\n" | |
print ( @ingredients.map {|ingred| "#{ingred.quantity} #{ingred.units} #{ingred.name}"}.join("\n")) | |
print "\nServes #{@servings}.\n" | |
end | |
end | |
class Ingredient | |
attr_reader :name, :quantity, :units | |
def initialize(name, quantity=:to_taste, units=nil) | |
@name = name | |
@quantity = quantity | |
@units = units | |
end | |
end | |
class RecipeParser | |
def self.parse | |
cookbook = [] | |
raw = File.read('recipes.txt') | |
step1 = raw.split("\n\n") | |
step2 = step1.map { |x| x.split("\n") } | |
step3 = step2.map do |rec| | |
{ | |
name: rec.first, | |
serves: rec[1].split.last.to_i, | |
ingredients: rec[2..-1] | |
} | |
end | |
step3.map do |rec| | |
temp = Recipe.new(rec[:name],rec[:serves]) | |
rec[:ingredients].each {|ing| temp.add_ingredient(self.ingredient_parse(ing))} | |
cookbook << temp | |
end | |
self.display(cookbook) | |
end | |
def self.ingredient_parse(line) | |
ingredient_line = line.split | |
measure_units = ["oz","tbs","lbs","cup"] | |
counter = 0 | |
if ingredient_line.first.to_i > 0 | |
quantity = ingredient_line.first.to_i | |
counter += 1 | |
if measure_units.include?(ingredient_line[1]) | |
units = ingredient_line[1] | |
counter += 1 | |
end | |
end | |
name = ingredient_line[counter..-1].join(" ") | |
return Ingredient.new(name,quantity,units) | |
end | |
# Again, I added this display method just to help me see the results. | |
def self.display(cookbook) | |
cookbook.each { |recipe| recipe.publish } | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment