class Cucumber::CucumberExpressions::CucumberExpression

Constants

ALTERNATIVE_NON_WHITESPACE_TEXT_REGEXP
DOUBLE_ESCAPE
ESCAPE_REGEXP

Does not include (){} characters because they have special meaning

OPTIONAL_REGEXP
PARAMETER_REGEXP
PARAMETER_TYPES_CANNOT_BE_ALTERNATIVE
PARAMETER_TYPES_CANNOT_BE_OPTIONAL

Attributes

source[R]

Public Class Methods

new(expression, parameter_type_registry) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 19
def initialize(expression, parameter_type_registry)
  @source = expression
  @parameter_types = []
  
  expression = process_escapes(expression)
  expression = process_optional(expression)
  expression = process_alternation(expression)
  expression = process_parameters(expression, parameter_type_registry)
  expression = "^#{expression}$"

  @tree_regexp = TreeRegexp.new(expression)
end

Public Instance Methods

match(text) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 32
def match(text)
  Argument.build(@tree_regexp, text, @parameter_types)
end
regexp() click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 36
def regexp
  @tree_regexp.regexp
end
to_s() click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 40
def to_s
  @source.inspect
end

Private Instance Methods

build_capture_regexp(regexps) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 93
def build_capture_regexp(regexps)
  return "(#{regexps[0]})" if regexps.size == 1
  capture_groups = regexps.map { |group| "(?:#{group})" }
  "(#{capture_groups.join('|')})"
end
check_no_parameter_type(s, message) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 99
def check_no_parameter_type(s, message)
  if PARAMETER_REGEXP =~ s
    raise CucumberExpressionError.new("#{message}#{source}")
  end
end
process_alternation(expression) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 60
def process_alternation(expression)
  expression.gsub(ALTERNATIVE_NON_WHITESPACE_TEXT_REGEXP) do
    # replace \/ with /
    # replace / with |
    replacement = $&.tr('/', '|').gsub(/\\\|/, '/')
    if replacement.include?('|')
      replacement.split(/\|/).each do |part|
        check_no_parameter_type(part, PARAMETER_TYPES_CANNOT_BE_ALTERNATIVE)
      end
      "(?:#{replacement})"
    else
      replacement
    end
  end
end
process_escapes(expression) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 46
def process_escapes(expression)
  expression.gsub(ESCAPE_REGEXP, '\\\\\1')
end
process_optional(expression) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 50
def process_optional(expression)
  # Create non-capturing, optional capture groups from parenthesis
  expression.gsub(OPTIONAL_REGEXP) do
    g2 = $2
    check_no_parameter_type(g2, PARAMETER_TYPES_CANNOT_BE_OPTIONAL)
    # look for double-escaped parentheses
    $1 == DOUBLE_ESCAPE ? "\\(#{g2}\\)" : "(?:#{g2})?"
  end
end
process_parameters(expression, parameter_type_registry) click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 76
def process_parameters(expression, parameter_type_registry)
  # Create non-capturing, optional capture groups from parenthesis
  expression.gsub(PARAMETER_REGEXP) do
    if ($1 == DOUBLE_ESCAPE)
      "\\{#{$2}\\}"
    else
      type_name = $2
      ParameterType.check_parameter_type_name(type_name)
      parameter_type = parameter_type_registry.lookup_by_type_name(type_name)
      raise UndefinedParameterTypeError.new(type_name) if parameter_type.nil?
      @parameter_types.push(parameter_type)

      build_capture_regexp(parameter_type.regexps)
    end
  end
end