sds/haml-lint

View on GitHub
lib/haml_lint/reporter.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'haml_lint/reporter/hooks'

module HamlLint
  # Abstract lint reporter. Subclass and override {#display_report} to
  # implement a custom lint reporter.
  #
  # @abstract
  class Reporter
    include Reporter::Hooks

    # The CLI names of all configured reporters.
    #
    # @return [Array<String>]
    def self.available
      descendants.flat_map do |reporter|
        available = reporter.available
        available.unshift(reporter) if reporter.available?
        available
      end
    end

    # A flag for whether to show the reporter on the command line.
    #
    # @return [Boolean]
    def self.available?
      true
    end

    # The name of the reporter as passed from the CLI.
    #
    # @return [String]
    def self.cli_name
      name
        .split('::')
        .last
        .sub(/Reporter$/, '')
        .gsub(/([A-Z]+)([A-Z][a-z])/, '\1-\2')
        .gsub(/([a-z\d])([A-Z])/, '\1-\2')
        .downcase
    end

    # Creates the reporter that will display the given report.
    #
    # @param logger [HamlLint::Logger]
    def initialize(logger)
      @log = logger
    end

    # Implemented by subclasses to display lints from a {HamlLint::Report}.
    #
    # @param report [HamlLint::Report]
    def display_report(report)
      raise NotImplementedError,
            "Implement `display_report` to display #{report}"
    end

    # Keep tracking all the descendants of this class for the list of available
    # reporters.
    #
    # @return [Array<Class>]
    def self.descendants
      @descendants ||= []
    end

    # Executed when this class is subclassed.
    #
    # @param descendant [Class]
    def self.inherited(descendant)
      descendants << descendant
    end

    private

    # @return [HamlLint::Logger] logger to send output to
    attr_reader :log
  end
end