class Danger::DangerCodenarc

Shows errors and warnings from codenarc You'll need [codenarc](codenarc.sourceforge.net/) installed and generating a XML report file to use this plugin. This plugin does not run codenarc for you.

@example Showing summary

danger-codenarc.report 'CodeNarcXmlReport.xml'

@see IntrepidPursuits/danger-codenarc @tags codenarc, groovy

Public Instance Methods

project_root() click to toggle source

The project root, which will be used to make the paths relative. Defaults to `pwd`. @return [String] project_root value attr_accessor :project_root

# File lib/codenarc/plugin.rb, line 22
def project_root
  root = @project_root || Dir.pwd
  root += "/" unless root.end_with? "/"
  root
end
report(file_path) click to toggle source

Reads a puppet-lint summary file and reports it.

@param [String] file_path Path for puppet-lint report. @return [void]

# File lib/codenarc/plugin.rb, line 40
def report(file_path)
  raise "Summary file not found" unless File.file?(file_path)

  run_summary(file_path)
end
sticky_summary() click to toggle source

Defines if the test summary will be sticky or not. Defaults to `false`. @return [Boolean] sticky attr_accessor :sticky_summary

# File lib/codenarc/plugin.rb, line 32
def sticky_summary
  @sticky_summary || false
end

Private Instance Methods

run_summary(report_file) click to toggle source
# File lib/codenarc/plugin.rb, line 48
def run_summary(report_file)
  doc = Nokogiri::XML(File.open(report_file))

  # Create Summary
  pkg_summary = doc.xpath("//PackageSummary")[0]
  tf = pkg_summary.attr("totalFiles")
  fwv = pkg_summary.attr("filesWithViolations")
  p1_count = pkg_summary.attr("priority1")
  p2_count = pkg_summary.attr("priority2")
  p3_count = pkg_summary.attr("priority3")
  summary = "CodeNarc scanned #{tf} files. Found #{fwv} files with violations. #{p1_count} P1 violations, #{p2_count} P2 violations, and #{p3_count} P3 violations"
  message(summary, sticky: sticky_summary)

  # Iterate Packages
  doc.xpath("//Package").each do |pack_el|
    pack_el.xpath("File").each do |file_el|
      file_el.xpath("Violation").each do |violation|
        package_path = pack_el.attr("path")
        filename = file_el.attr("name")
        line_num = violation.attr("lineNumber")
        priority = violation.attr("priority")
        rule = violation.attr("ruleName")
        is_err = (priority == 1)

        violation_text = violation.xpath("Message")[0].text.strip!
        source_line = "    #{violation.xpath("SourceLine")[0].text.strip!}"
        violation_message = "#{package_path}/#{filename}#L#{line_num} - P#{priority} [#{rule}] - #{violation_text}\n#{source_line}"

        if is_err
          fail(violation_message, sticky: false)
        else
          warn(violation_message, sticky: false)
        end
      end
    end
  end
end