Sha256: 21b911d3cb8f4dd68c855c3bdba7c5fa7e8c431ef28b63efd211b21b39e3f1fa

Contents?: true

Size: 1021 Bytes

Versions: 6

Compression:

Stored size: 1021 Bytes

Contents

module Cucumber
  class TagExpression
    attr_reader :limits

    def self.parse(tag_expressions)
      tag_expressions.inject(TagExpression.new) { |e, expr| e.add(expr.strip.split(/\s*,\s*/)); e }
    end

    def initialize
      @ands = []
      @limits = {}
    end

    def add(tags)
      negatives, positives = tags.partition{|tag| tag =~ /^~/}
      positive_limits = Hash[*positives.map{|positive| tag, limit = positive.split(':'); [tag, limit ? limit.to_i : nil]}.flatten]
      @limits.merge!(positive_limits)
      @ands << (negatives + positive_limits.keys)
    end

    def eval(tags)
      return true if @ands.flatten.empty?
      vars = Hash[*tags.map{|tag| [tag, true]}.flatten]
      !!Kernel.eval(ruby_expression)
    end

  private

    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

6 entries across 6 versions & 2 rubygems

Version Path
cucumber-0.6.4 lib/cucumber/tag_expression.rb
cucumber-0.6.3 lib/cucumber/tag_expression.rb
davidtrogers-cucumber-0.6.2 lib/cucumber/tag_expression.rb
cucumber-0.6.2 lib/cucumber/tag_expression.rb
cucumber-0.6.1 lib/cucumber/tag_expression.rb
cucumber-0.6.0 lib/cucumber/tag_expression.rb