enkessler/cuke_linter

View on GitHub
lib/cuke_linter/linters/linter.rb

Summary

Maintainability
A
35 mins
Test Coverage
module CukeLinter

  # A generic linter that can be used to make arbitrary linting rules
  class Linter

    # Returns the name of the linter
    attr_reader :name

    # Creates a new linter object
    def initialize(name: nil, message: nil, rule: nil)
      @name    = name || self.class.name.split('::').last
      @message = message || "#{self.name} problem detected"
      @rule    = rule
    end

    # Lints the given model and returns linting data about said model
    def lint(model)
      raise 'No linting rule provided!' unless @rule || respond_to?(:rule)

      problem_found = respond_to?(:rule) ? rule(model) : @rule.call(model)

      return nil unless problem_found

      build_problem(model)
    end


    private


    def build_problem(model)
      problem_message = respond_to?(:message) ? message : @message

      if model.is_a?(CukeModeler::FeatureFile)
        { problem: problem_message, location: model.path }
      else
        { problem: problem_message, location: "#{model.get_ancestor(:feature_file).path}:#{model.source_line}" }
      end
    end

  end
end