prontolabs/pronto

View on GitHub
lib/pronto/message.rb

Summary

Maintainability
A
45 mins
Test Coverage
A
100%
module Pronto
  class Message
    attr_reader :path, :line, :level, :msg, :commit_sha, :runner

    LEVELS = %i[info warning error fatal].freeze

    def initialize(path, line, level, msg, commit_sha = nil, runner = nil)
      unless LEVELS.include?(level)
        raise ::ArgumentError, "level should be set to one of #{LEVELS}"
      end

      @path = path
      @line = line
      @level = level
      @msg = msg
      @runner = runner
      @commit_sha = commit_sha
      @commit_sha ||= line.commit_sha if line
    end

    def full_path
      repo.path.join(path) if repo
    end

    def repo
      line.patch.repo if line
    end

    def ==(other)
      comparison_attributes.all? do |attribute|
        send(attribute) == other.send(attribute)
      end
    end

    alias eql? ==

    def hash
      comparison_attributes.reduce(0) do |hash, attribute|
        hash ^ send(attribute).hash
      end
    end

    def to_h
      {
        path: path,
        line: line,
        level: level,
        msg: msg,
        commit_sha: commit_sha,
        runner: @runner && @runner.title
      }
    end

    private

    def comparison_attributes
      line ? %i[path msg level line] : %i[path msg level commit_sha]
    end
  end
end