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