module Overcommit::Utils::MessagesUtils
Utility to process messages
Public Class Methods
extract_messages(output_messages, regex, type_categorizer = nil)
click to toggle source
Extract file, line number, and type of message from an error/warning messages in output.
Assumes each element of `output` is a separate error/warning with all information necessary to identify it.
@param output_messages [Array<String>] unprocessed error/warning messages @param regex [Regexp] regular expression defining `file`, `line` and
`type` capture groups used to extract file locations and error/warning type from each line of output
@param type_categorizer [Proc] function executed against the `type`
capture group to convert it to a `:warning` or `:error` symbol. Assumes `:error` if `nil`.
@raise [Overcommit::Exceptions::MessageProcessingError] line of output did
not match regex
@return [Array<Message>]
# File lib/overcommit/utils/messages_utils.rb, line 23 def extract_messages(output_messages, regex, type_categorizer = nil) output_messages.map.with_index do |message, index| unless match = message.match(regex) raise Overcommit::Exceptions::MessageProcessingError, 'Unexpected output: unable to determine line number or type ' \ "of error/warning for output:\n" \ "#{output_messages[index..-1].join("\n")}" end file = extract_file(match, message) line = extract_line(match, message) if match.names.include?('line') && match[:line] type = extract_type(match, message, type_categorizer) Overcommit::Hook::Message.new(type, file, line, message) end end
Private Class Methods
extract_file(match, message)
click to toggle source
# File lib/overcommit/utils/messages_utils.rb, line 42 def extract_file(match, message) return unless match.names.include?('file') if match[:file].to_s.empty? raise Overcommit::Exceptions::MessageProcessingError, "Unexpected output: no file found in '#{message}'" end match[:file] end
extract_line(match, message)
click to toggle source
# File lib/overcommit/utils/messages_utils.rb, line 53 def extract_line(match, message) return unless match.names.include?('line') Integer(match[:line]) rescue ArgumentError, TypeError raise Overcommit::Exceptions::MessageProcessingError, "Unexpected output: invalid line number found in '#{message}'" end
extract_type(match, message, type_categorizer)
click to toggle source
# File lib/overcommit/utils/messages_utils.rb, line 61 def extract_type(match, message, type_categorizer) if type_categorizer type_match = match.names.include?('type') ? match[:type] : nil type = type_categorizer.call(type_match) unless Overcommit::Hook::MESSAGE_TYPES.include?(type) raise Overcommit::Exceptions::MessageProcessingError, "Invalid message type '#{type}' for '#{message}': must " \ "be one of #{Overcommit::Hook::MESSAGE_TYPES.inspect}" end type else :error # Assume error since no categorizer was defined end end