r-cochran/cuke_sniffer

View on GitHub
lib/cuke_sniffer/rules_evaluator.rb

Summary

Maintainability
A
1 hr
Test Coverage
module CukeSniffer

  # Author::    Robert Cochran  (mailto:cochrarj@miamioh.edu)
  # Copyright:: Copyright (C) 2014 Robert Cochran
  # License::   Distributes under the MIT License
  # Evaluates all cucumber components found in CukeSniffer with the passed rules
  class RulesEvaluator
    include CukeSniffer::Constants
    attr_accessor :rules

    def initialize(cli, rules)
      raise "A CLI must be provided for evaluation." if cli.nil?
      raise "Rules must be provided for evaluation." if rules.nil? or rules.empty?
      @rules = rules
      judge_features(cli.features)
      judge_objects(cli.step_definitions, "StepDefinition")
      judge_objects(cli.hooks, "Hook")
    end

    private

    def judge_features(features)
      features.each do |feature|
        judge_feature(feature)
      end
    end

    def judge_feature(feature)
      judge_object(feature, "Feature")
      judge_object(feature.background, "Background") unless feature.background.nil?
      judge_objects(feature.scenarios, "Scenario")
      feature.update_score
    end

    def judge_objects(objects, type)
      objects.each do | object |
        judge_object(object, type)
      end
    end

    def judge_object(object, type)
      @rules.each do |rule|
        fail "No targets for rule: #{rule.phrase}" if rule.targets.nil? or rule.targets.empty?
        next unless rule.targets.include? type and rule.enabled
        if rule.reason.(object, rule) == true
          phrase = rule.phrase.gsub("{class}", type)
          object.store_rule(rule, phrase)
        end
      end
    end
  end
end