Sha256: c724149dc5565a1776189d76658a1a43d72b516552dd8a1ec6434b3c54d233ef

Contents?: true

Size: 1.72 KB

Versions: 8

Compression:

Stored size: 1.72 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]
      !!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

8 entries across 8 versions & 1 rubygems

Version Path
gherkin-2.12.1 lib/gherkin/tag_expression.rb
gherkin-2.12.1-x86-mswin32 lib/gherkin/tag_expression.rb
gherkin-2.12.1-x86-mingw32 lib/gherkin/tag_expression.rb
gherkin-2.12.1-java lib/gherkin/tag_expression.rb
gherkin-2.12.0 lib/gherkin/tag_expression.rb
gherkin-2.12.0-x86-mingw32 lib/gherkin/tag_expression.rb
gherkin-2.12.0-x86-mswin32 lib/gherkin/tag_expression.rb
gherkin-2.12.0-java lib/gherkin/tag_expression.rb