class Danger::DangerKotlinDetekt

This is your plugin class. Any attributes or methods you expose here will be available from within your Dangerfile.

To be published on the Danger plugins site, you will need to have the public interface documented. Danger uses [YARD](yardoc.org/) for generating documentation from your plugin source, and you can verify by running `danger plugins lint` or `bundle exec rake spec`.

You should replace these comments with a public description of your library.

@example Ensure people are well warned about merging on Mondays

my_plugin.warn_on_mondays

@see Nicolas Fesquet/danger-kotlin_detekt @tags monday, weekends, time, rattata

Constants

SEVERITY_LEVELS

Attributes

filtering[RW]

Enable filtering Only show messages within changed files.

gradle_task[RW]

Custom gradle task to run. This is useful when your project has different flavors. Defaults to “detektCheck”. @return [String]

report_file[RW]

Location of Detekt report file If your Detekt task outputs to a different location, you can specify it here. Defaults to “build/reports/detekt/detekt-checkstyle.xml”. @return [String]

severity[W]

Defines the severity level of the execution. Selected levels are the chosen one and up. Possible values are “Warning”, “Error” or “Fatal”. Defaults to “Warning”. @return [String]

skip_gradle_task[RW]

Skip gradle task

Public Instance Methods

detekt(inline_mode: false) click to toggle source

Calls Detekt task of your gradle project. It fails if `gradlew` cannot be found inside current directory. It fails if `severity` level is not a valid option. It fails if `xmlReport` configuration is not set to `true` in your `build.gradle` file. @return [void]

# File lib/kotlin_detekt/plugin.rb, line 59
def detekt(inline_mode: false)
  if !skip_gradle_task && !gradlew_exists?
    fail("Could not find `gradlew` inside current directory")
    return
  end

  unless SEVERITY_LEVELS.include?(severity)
    fail("'#{severity}' is not a valid value for `severity` parameter.")
    return
  end

  system "./gradlew #{gradle_task || 'detektCheck'}" unless skip_gradle_task

  unless File.exist?(report_file)
    fail("Detekt report not found at `#{report_file}`. "\
      "Have you forgot to add `xmlReport true` to your `build.gradle` file?")
  end

  issues = read_issues_from_report
  filtered_issues = filter_issues_by_severity(issues)

  if inline_mode
    # Report with inline comment
    send_inline_comment(filtered_issues)
  else
    message = message_for_issues(filtered_issues)
    markdown("### Detekt found issues\n\n" + message) unless message.to_s.empty?
  end
end
severity() click to toggle source

A getter for `severity`, returning “warning” if value is nil. @return [String]

# File lib/kotlin_detekt/plugin.rb, line 91
def severity
  @severity || SEVERITY_LEVELS.first
end

Private Instance Methods

filter_issues_by_severity(issues) click to toggle source
# File lib/kotlin_detekt/plugin.rb, line 106
def filter_issues_by_severity(issues)
  issues.select do |issue|
    severity_index(issue.get("severity")) >= severity_index(severity)
  end
end
gradlew_exists?() click to toggle source
# File lib/kotlin_detekt/plugin.rb, line 172
def gradlew_exists?
  `ls gradlew`.strip.empty? == false
end
message_for_issues(issues) click to toggle source
# File lib/kotlin_detekt/plugin.rb, line 116
def message_for_issues(issues)
  message = ""

  SEVERITY_LEVELS.reverse.each do |level|
    filtered = issues.select{|issue| issue.get("severity") == level}
    message << parse_results(filtered, level) unless filtered.empty?
  end

  message
end
parse_results(results, heading) click to toggle source
# File lib/kotlin_detekt/plugin.rb, line 127
def parse_results(results, heading)
  target_files = (git.modified_files - git.deleted_files) + git.added_files
  dir = "#{Dir.pwd}/"
  count = 0
  message = ""

  results.each do |r|
    location = r.parent
    filename = location.get('name').gsub(dir, "")
    next unless !filtering || (target_files.include? filename)
    line = r.get('line') || 'N/A'
    reason = r.get('message')
    count += 1
    message << "`#{filename}` | #{line} | #{reason} \n"
  end
  if count != 0
    header = "#### #{heading} (#{count})\n\n"
    header << "| File | Line | Reason |\n"
    header << "| ---- | ---- | ------ |\n"
    message = header + message
  end

  message
end
read_issues_from_report() click to toggle source
# File lib/kotlin_detekt/plugin.rb, line 97
def read_issues_from_report
  file = File.open(report_file)

  require 'oga'
  report = Oga.parse_xml(file)

  report.xpath('//error')
end
send_inline_comment(issues) click to toggle source

Send inline comment with danger's warn or fail method

@return [void]

# File lib/kotlin_detekt/plugin.rb, line 156
def send_inline_comment (issues)
  target_files = (git.modified_files - git.deleted_files) + git.added_files
  dir = "#{Dir.pwd}/"
  SEVERITY_LEVELS.reverse.each do |level|
    filtered = issues.select{|issue| issue.get("severity") == level}
    next if filtered.empty?
    filtered.each do |r|
      location = r.parent
      filename = location.get('name').gsub(dir, "")
      next unless !filtering || (target_files.include? filename)
      line = (r.get('line') || "0").to_i
      send(level === "warning" ? "warn" : "fail", r.get('message'), file: filename, line: line)
    end
  end
end
severity_index(severity) click to toggle source
# File lib/kotlin_detekt/plugin.rb, line 112
def severity_index(severity)
  SEVERITY_LEVELS.index(severity) || 0
end