Sha256: 97e20c382591150ffa84f8d618b589b1080de2b77cda872c770e231d39afc1ad
Contents?: true
Size: 1.82 KB
Versions: 7
Compression:
Stored size: 1.82 KB
Contents
require 'gherkin/native' module Gherkin class TagExpression native_impl('gherkin') attr_reader :limits def initialize(tag_expressions) @ands = [] @limits = {} tag_expressions.each do |expr| add(expr.strip.split(/\s*,\s*/)) end end def empty? @ands.empty? end def evaluate(tags) return true if @ands.flatten.empty? vars = Hash[*tags.map{|tag| [tag.name, true]}.flatten] raise "No vars" if vars.nil? # Useless statement to prevent ruby warnings about unused var !!Kernel.eval(ruby_expression) end private def add(tags_with_negation_and_limits) negatives, positives = tags_with_negation_and_limits.partition{|tag| tag =~ /^~/} @ands << (store_and_extract_limits(negatives, true) + store_and_extract_limits(positives, false)) end def store_and_extract_limits(tags_with_negation_and_limits, negated) tags_with_negation = [] tags_with_negation_and_limits.each do |tag_with_negation_and_limit| tag_with_negation, limit = tag_with_negation_and_limit.split(':') tags_with_negation << tag_with_negation if limit tag_without_negation = negated ? tag_with_negation[1..-1] : tag_with_negation if @limits[tag_without_negation] && @limits[tag_without_negation] != limit.to_i raise "Inconsistent tag limits for #{tag_without_negation}: #{@limits[tag_without_negation]} and #{limit.to_i}" end @limits[tag_without_negation] = limit.to_i end end tags_with_negation end def ruby_expression "(" + @ands.map do |ors| ors.map do |tag| if tag =~ /^~(.*)/ "!vars['#{$1}']" else "vars['#{tag}']" end end.join("||") end.join(")&&(") + ")" end end end
Version data entries
7 entries across 5 versions & 2 rubygems