Class: StepMaster::Matcher

Inherits:
Object
  • Object
show all
Defined in:
lib/step_master/matcher.rb

Overview

steps that start with a given string (taking into account captures and imbedded regexps).

The is_match? method lets you check if a string exactly matches to a step definition

Constant Summary collapse

STEP_REGEX =
/^\s*(Given|Then|When)\s*\(?\s*\/\^?(.*)\/(\w*)\s*\)?\s*(?:do|\{)\s*(\|[^\|]+\|)?/.freeze
ARG_NAMES_REGEX =
/\|(.*)\|/
ARG_TEXT_REGEX =
/\(.*?[^\\]\)[\?\+\*]?/
NON_CAPTURE_REGEX =
/^\(\?\:/
CHUNK_REGEX =
/\S+|\s\??/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(match_table = Possible.new) ⇒ Matcher

Returns a new instance of Matcher.



31
32
33
# File 'lib/step_master/matcher.rb', line 31

def initialize(match_table = Possible.new )
  @match_table = match_table
end

Instance Attribute Details

#match_tableObject (readonly)

Returns the value of attribute match_table.



29
30
31
# File 'lib/step_master/matcher.rb', line 29

def match_table
  @match_table
end

Instance Method Details

#<<(value) ⇒ Object

Insert a Ruby Step definition into the Match Table

Examples

matcher << "Given /^this is a step$/ do"


40
41
42
# File 'lib/step_master/matcher.rb', line 40

def <<(value)
  add(value, :format => :rb)
end

#add(value, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/step_master/matcher.rb', line 44

def add(value, options = {})
  
  raise "#{value.inspect} is not a step" unless value =~ STEP_REGEX
  
  full_line = $&
  step_type = $1
  regex = $2.chomp("$")
  regex_options = $3
  args = $4
  
  arg_names = (args =~ ARG_NAMES_REGEX) ? $1.split(/\s*,\s*/) : []
  arg_regexs = extract_captures(regex)
  
  arg_objects = arg_regexs.collect do |x|
    is_non_capture = (x =~ NON_CAPTURE_REGEX) != nil
    StepVariable.new(x, regex_options, (is_non_capture) ? nil : arg_names.shift)
  end
  
  if arg_regexs.length > 0
    regex.split(Regexp.union(arg_regexs.collect { |x| Regexp.new(Regexp.escape(x)) })).collect { |x|
      x.scan(CHUNK_REGEX).collect { |i| StepItem.new(i, regex_options) }
    }.+(Array.new(5)).zip(arg_objects).flatten.compact.unshift(StepItem.new(" ", regex_options)).unshift(StepItem.new(step_type, regex_options))
  else
    regex.scan(CHUNK_REGEX).unshift(" ").unshift(step_type).collect { |i| StepItem.new(i, regex_options) }
  end.inject(@match_table) { |parent, i| parent[i] ||= Possible.new }.terminal!(value, options)          
  
end

#complete(string, options = {}) ⇒ Object

Returns all possible outcomes of a string.

Parameters

  • string - The string to try to auto complete

  • options - :easy => true will replace captures with the variable names in the step definition

Examples

matcher.complete("Given this")
matcher.complete("Given this", :easy => true)


82
83
84
# File 'lib/step_master/matcher.rb', line 82

def complete(string, options = {})
  possible_strings find_possible(string), options
end

#is_match?(string) ⇒ Boolean

Returns true if the string matches exactly to a step definition

Examples

matcher << "Given /^this$/ do"
matcher.is_match?("Given this") #=> true
matcher.is_match?("Given that") #=> false

Returns:

  • (Boolean)


93
94
95
# File 'lib/step_master/matcher.rb', line 93

def is_match?(string)
  find_possible(string).any?{ |x| x.terminal? }
end

#terminals(string) ⇒ Object



101
102
103
# File 'lib/step_master/matcher.rb', line 101

def terminals(string)
  find_possible(string).select{ |x| x.terminal? }
end

#where_is?(string) ⇒ Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/step_master/matcher.rb', line 97

def where_is?(string)
  find_possible(string).select{ |x| x.terminal? }.collect { |x| x.file || x.result }
end