class Suspiciouss::Linter

Constants

KNOWN_FILETYPES
SUGGESTIONS

Public Class Methods

new() click to toggle source
# File lib/suspiciouss/linter.rb, line 18
def initialize
  @result = Hash.new { |hash, key| hash[key] = [] }
end

Public Instance Methods

process(input = nil) click to toggle source

Process a diff file and return the result. It will read the input sequentially from a string or standard input.

# File lib/suspiciouss/linter.rb, line 24
def process(input = nil)
  if input.nil?
    input = STDIN
  end

  input.each_line do |line|
    detect_filename_in line
    parse line if @filename
  end

  if input.is_a? IO
    puts result_as(Suspiciouss::Result::PlainText)
  else
    result_as(Suspiciouss::Result::Markdown)
  end
end
suggestions_to_use() click to toggle source
# File lib/suspiciouss/linter.rb, line 41
def suggestions_to_use
  included_suggestions.reject { |s| excluded_suggestions.include?(s) }
end

Private Instance Methods

config() click to toggle source
# File lib/suspiciouss/linter.rb, line 104
def config
  return {} unless has_config?

  @config ||= YAML::load(File.open(config_file))
end
config_file() click to toggle source
# File lib/suspiciouss/linter.rb, line 114
def config_file
  '.suspiciouss.yml'
end
detect_filename_in(full_line) click to toggle source

Detects if the diff block references a known file type

# File lib/suspiciouss/linter.rb, line 48
def detect_filename_in(full_line)
  line_might_contain_filename = full_line.scan(/^\+\+\+ b(.+)$/)

  return if line_might_contain_filename.empty?
  @filename = line_might_contain_filename.first.first

  if @filename !~ KNOWN_FILETYPES
    @filename = nil
  end
end
excluded_suggestions() click to toggle source
# File lib/suspiciouss/linter.rb, line 99
def excluded_suggestions
  return [] unless config.has_key?(:exclude)
  SUGGESTIONS.constants.select { |s| config[:exclude].include?(s.to_s) }
end
has_config?() click to toggle source
# File lib/suspiciouss/linter.rb, line 110
def has_config?
  File.exists?(config_file)
end
included_suggestions() click to toggle source
# File lib/suspiciouss/linter.rb, line 94
def included_suggestions
  return SUGGESTIONS.constants unless config.has_key?(:include)
  SUGGESTIONS.constants.select { |s| config[:include].include?(s.to_s) }
end
known_suggestions() click to toggle source
# File lib/suspiciouss/linter.rb, line 88
def known_suggestions
  @known_suggestions ||= suggestions_to_use.map do |suggestion_class|
    SUGGESTIONS.const_get(suggestion_class).new
  end
end
parse(full_line) click to toggle source

Parses a line with each of the known suggestions and adds the result to the final output.

# File lib/suspiciouss/linter.rb, line 61
def parse(full_line)
  line = strip_diff_syntax(remove_line_comments(full_line))

  return unless full_line =~ /^\+ /

  known_suggestions.each do |suggestion|
    if result = suggestion.parse(line)
      @result[@filename] << "#{result}: #{line}"
    end
  end
end
remove_line_comments(line) click to toggle source

Returns a line without comments

# File lib/suspiciouss/linter.rb, line 84
def remove_line_comments(line)
  line.gsub /\/\/.*$/, ''
end
result_as(formatter) click to toggle source

Renders the result using the specified formatter

# File lib/suspiciouss/linter.rb, line 74
def result_as(formatter)
  formatter.new(@result).format
end
strip_diff_syntax(line) click to toggle source

Returns a line without the “+ ” added by diff

# File lib/suspiciouss/linter.rb, line 79
def strip_diff_syntax(line)
  line[2..-1]
end