Created
December 21, 2012 16:37
-
-
Save colezlaw/4353889 to your computer and use it in GitHub Desktop.
Simple Python script for transforming results from PMD to HTML with support for prettify, bootstrap, etc. Instead of using XSLT, it's just manually selecting things based on XPath and pulls in the source code from the file if it can find it. Requires lxml (http://pypi.python.org/pypi/lxml/).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse, sys | |
from lxml import etree | |
class PMDTransformer(object): | |
def __init__(self): | |
self.etree = None | |
self.args = None | |
self.violations = None | |
def parse(self): | |
self.etree = etree.parse(self.args.infile).getroot() | |
def get_issues(self): | |
self.violations = etree.XML('<div id="violations" class="span8"></div>') | |
for x in range(1,6): | |
r = self.etree.xpath('/pmd/file/violation[@priority="{0:d}"]'.format(x)) | |
for violation in r: | |
self.do_one(violation) | |
def do_one(self, violation): | |
rule = violation.get('rule') | |
fn = violation.getparent().get('name') | |
begin = violation.get('beginline') | |
end = violation.get('endline') | |
text = violation.text.strip() | |
node = etree.XML("""<div class="finding"> | |
<h4>{1:s}</h4><br /> | |
<strong>Severity: {0:s}</strong><br /> | |
<em>{2:s}</em>:{3:s}-{4:s}<br /> | |
{5:s}<br /> | |
</div>""".format( | |
violation.get('priority'), | |
rule, | |
fn, | |
begin, | |
end, | |
text)) | |
pre = etree.XML('<pre class="prettyprint linenums:{0:s} lang-java" style="padding-left:20px"></pre>'.format(begin)) | |
try: | |
infile = open(fn, 'r') | |
lines = infile.readlines() | |
pre.text = ''.join(lines[int(begin) - 1:int(end)]) | |
except Exception, e: | |
pre.text = 'NO EVIDENCE AVAILABLE' | |
print e.message | |
node.append(pre) | |
self.violations.append(node) | |
def print_html(self): | |
html = etree.XML('''<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Violations</title> | |
<link rel="stylesheet" href="bootstrap.min.css" media="screen"></link> | |
<link rel="stylesheet" href="bootstrap-responsive.min.css" media="screen"></link> | |
<link rel="stylesheet" href="report.css" media="screen"></link> | |
<link rel="stylesheet" href="prettify.css"></link> | |
<script language="javascript" src="prettify.js"> </script> | |
</head> | |
</html>''') | |
body = etree.XML('<body onload="prettyPrint()"><div class="row"><div class="span2"></div></div></body>') | |
body.append(self.violations) | |
body.append(etree.XML('<div class="span2"></div>')) | |
html.append(body) | |
self.args.outfile.write(etree.tostring(html, pretty_print=True, doctype="<!DOCTYPE html>")) | |
def main(self): | |
parser = argparse.ArgumentParser(description='Transform PMD output to HTML') | |
parser.add_argument('-i', '--infile', nargs='?', type=argparse.FileType('r'), | |
default=sys.stdin) | |
parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), | |
default=sys.stdout) | |
self.args = parser.parse_args() | |
self.parse() | |
self.get_issues() | |
self.print_html() | |
if __name__ == '__main__': | |
PMDTransformer().main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment