class StepParser

Class that parses step definitions from Ruby files

Attributes

steps[R]

Public Class Methods

new() click to toggle source
# File lib/step_parser.rb, line 6
def initialize
  @steps = []
end

Public Instance Methods

read(file) click to toggle source
# File lib/step_parser.rb, line 10
def read(file)
  @current_file = file
  @line_number = 0
  @lines = IO.read(file).split(/\r?\n/)
  parse_lines
end

Private Instance Methods

next_line() click to toggle source
# File lib/step_parser.rb, line 20
def next_line
  @line_number += 1
  @lines.shift
end
parse_lines() click to toggle source
# File lib/step_parser.rb, line 30
def parse_lines
  @comments = []
  while not @lines.empty?

    line = next_line
    case line
    when /^ *#/
      @comments << line
    when /^(Given|When|Then|Before|After|AfterStep|Transform) /
      unread(line)
      parse_step
      @comments = []
    when /^\s+(Given|When|Then|Before|After|AfterStep|Transform) /
      puts "WARNING:  Indented step definition in file #{@current_file}:  #{line}"
      @comments = []
    else
      @comments = []
    end

  end
end
parse_step() click to toggle source
# File lib/step_parser.rb, line 52
def parse_step
  type = parse_step_type(@lines.first)
  name = parse_step_name(@lines.first)
  line_number = @line_number + 1
  code = @comments
  line = ""
  while !@lines.empty? && !(line =~ /^end\s*$/)
    line = next_line
    code << line
  end
  @steps << { :type => type, :name => name, :filename => @current_file, :code => code, :line_number => line_number }
end
parse_step_name(line) click to toggle source
# File lib/step_parser.rb, line 69
def parse_step_name(line)
  line = line.sub(/^(Given|When|Then|Transform) +\/\^?(.*?)\$?\/.*/, '\1 \2')
  line = line.gsub('\ ', ' ')
  line
end
parse_step_type(line) click to toggle source
# File lib/step_parser.rb, line 65
def parse_step_type(line)
  line.sub(/^([A-Za-z]+).*/, '\1')
end
unread(line) click to toggle source
# File lib/step_parser.rb, line 25
def unread(line)
  @line_number -= 1
  @lines.unshift(line)
end