class Cucumber::CucumberExpressions::CucumberExpression
Constants
- ESCAPE_PATTERN
Public Class Methods
new(expression, parameter_type_registry)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 12 def initialize(expression, parameter_type_registry) @expression = expression @parameter_type_registry = parameter_type_registry @parameter_types = [] parser = CucumberExpressionParser.new ast = parser.parse(expression) pattern = rewrite_to_regex(ast) @tree_regexp = TreeRegexp.new(pattern) end
Public Instance Methods
match(text)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 22 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 30 def regexp @tree_regexp.regexp end
source()
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 26 def source @expression end
to_s()
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 34 def to_s @source.inspect end
Private Instance Methods
assert_no_optionals(node, &raise_error)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 117 def assert_no_optionals(node, &raise_error) nodes = node.nodes.select { |astNode| NodeType::OPTIONAL == astNode.type } raise_error.call(nodes[0]) if nodes.length > 0 end
assert_no_parameters(node, &raise_error)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 112 def assert_no_parameters(node, &raise_error) nodes = node.nodes.select { |astNode| NodeType::PARAMETER == astNode.type } raise_error.call(nodes[0]) if nodes.length > 0 end
assert_not_empty(node, &raise_error)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 107 def assert_not_empty(node, &raise_error) text_nodes = node.nodes.select { |astNode| NodeType::TEXT == astNode.type } raise_error.call(node) if text_nodes.length == 0 end
escape_regex(expression)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 60 def escape_regex(expression) expression.gsub(ESCAPE_PATTERN, '\\\\\1') end
rewrite_alternation(node)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 72 def rewrite_alternation(node) # Make sure the alternative parts aren't empty and don't contain parameter types node.nodes.each { |alternative| if alternative.nodes.length == 0 raise AlternativeMayNotBeEmpty.new(alternative, @expression) end assert_not_empty(alternative) { |astNode| raise AlternativeMayNotExclusivelyContainOptionals.new(astNode, @expression) } } regex = node.nodes.map { |n| rewrite_to_regex(n) }.join('|') "(?:#{regex})" end
rewrite_alternative(node)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 84 def rewrite_alternative(node) node.nodes.map { |lastNode| rewrite_to_regex(lastNode) }.join('') end
rewrite_expression(node)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 102 def rewrite_expression(node) regex = node.nodes.map { |n| rewrite_to_regex(n) }.join('') "^#{regex}$" end
rewrite_optional(node)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 64 def rewrite_optional(node) assert_no_parameters(node) { |astNode| raise ParameterIsNotAllowedInOptional.new(astNode, @expression) } assert_no_optionals(node) { |astNode| raise OptionalIsNotAllowedInOptional.new(astNode, @expression) } assert_not_empty(node) { |astNode| raise OptionalMayNotBeEmpty.new(astNode, @expression) } regex = node.nodes.map { |n| rewrite_to_regex(n) }.join('') "(?:#{regex})?" end
rewrite_parameter(node)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 88 def rewrite_parameter(node) name = node.text parameter_type = @parameter_type_registry.lookup_by_type_name(name) if parameter_type.nil? raise UndefinedParameterTypeError.new(node, @expression, name) end @parameter_types.push(parameter_type) regexps = parameter_type.regexps if regexps.length == 1 return "(#{regexps[0]})" end "((?:#{regexps.join(')|(?:')}))" end
rewrite_to_regex(node)
click to toggle source
# File lib/cucumber/cucumber_expressions/cucumber_expression.rb, line 40 def rewrite_to_regex(node) case node.type when NodeType::TEXT return escape_regex(node.text) when NodeType::OPTIONAL return rewrite_optional(node) when NodeType::ALTERNATION return rewrite_alternation(node) when NodeType::ALTERNATIVE return rewrite_alternative(node) when NodeType::PARAMETER return rewrite_parameter(node) when NodeType::EXPRESSION return rewrite_expression(node) else # Can't happen as long as the switch case is exhaustive raise "#{node.type}" end end