class Recipe::RubyistPrinter

Public Class Methods

new(name, elements, mixes = nil) click to toggle source
# File lib/recipe/printer/rubyist_printer.rb, line 3
def initialize(name, elements, mixes = nil)
  @name      = name
  @elements  = elements
  @mixes     = mixes
  @string_io = StringIO.new
  push_out
end

Public Instance Methods

format_string() click to toggle source
# File lib/recipe/printer/rubyist_printer.rb, line 66
def format_string
  indent = 0
  spaces = ""
  prev_line = nil

  @string_io.string.each_line do |line|
    line = line.strip
    if prev_line
      indent+=2 if prev_line.start_with?("class ") or prev_line.start_with?("def ")
      indent-= 2 if line == 'end'

      string = ""
      indent.times do
        string << " "
      end
      spaces = string
      puts "#{spaces}#{line}"
    else
      puts line
    end
    prev_line = line
  end

  @string_io.close
end
ingredient(element) click to toggle source
# File lib/recipe/printer/rubyist_printer.rb, line 11
def ingredient(element)
  @string_io << "def #{element.name.downcase.gsub(" ", '_')}\n"
  @string_io << "'#{element.measurement}'\n"
  @string_io << "end\n"
end
instruction(element) click to toggle source
# File lib/recipe/printer/rubyist_printer.rb, line 17
def instruction(element)
  @string_io << "def instruction_#{@instruction_counter}\n"
  @string_io <<  "'#{element.text}'\n"
  @string_io << "end\n"
  @instruction_counter+=1
end
push_out() click to toggle source
# File lib/recipe/printer/rubyist_printer.rb, line 24
def push_out
  @string_io << "class #{@name.capitalize.gsub(" ", '')}\n"
  @instruction_counter = 0

  if @mixes.is_a?(Array) && @mixes.count >= 1
    mix_id = 0
    @mixes.each do |mix|
      counter = 0
      @string_io << "class #{@elements[mix_id].name.split(' ').each{ |i| i.capitalize}.join('').gsub(" ", '')}\n"
      mix.each do |object|
        case object.class.to_s
        when "Recipe::Instruction"
          instruction(object)
        when "Recipe::Ingredient"
          ingredient(object)
        end
        @string_io << "\n" unless counter >= mix.count
      end
      @string_io << "end\n"
      @string_io << "\n" unless counter >= mix.count
      mix_id+=1
    end
    @string_io << "end\n"

  else
    counter = 0
    @elements.each do |element|
      case element.class.to_s
      when "Recipe::Instruction"
        instruction(element)
      when "Recipe::Ingredient"
        ingredient(element)
      end
      @string_io << "\n" unless counter >= @elements.count-1
      counter+=1
    end
    @string_io << "end\n"
  end

  format_string
end