Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add pmd xml driver #117

Merged
merged 4 commits into from Jun 30, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions diff_cover/diff_quality_tool.py
Expand Up @@ -25,7 +25,7 @@
jshint_driver, eslint_driver, pydocstyle_driver,
pycodestyle_driver)
from diff_cover.violationsreporters.java_violations_reporter import (
CheckstyleXmlDriver, checkstyle_driver, FindbugsXmlDriver)
CheckstyleXmlDriver, checkstyle_driver, FindbugsXmlDriver, PmdXmlDriver)

QUALITY_DRIVERS = {
'pycodestyle': pycodestyle_driver,
Expand All @@ -37,7 +37,8 @@
'pydocstyle': pydocstyle_driver,
'checkstyle': checkstyle_driver,
'checkstylexml': CheckstyleXmlDriver(),
'findbugs': FindbugsXmlDriver()
'findbugs': FindbugsXmlDriver(),
'pmd': PmdXmlDriver()
}

VIOLATION_CMD_HELP = "Which code quality tool to use (%s)" % "/".join(sorted(QUALITY_DRIVERS))
Expand Down
44 changes: 44 additions & 0 deletions diff_cover/violationsreporters/java_violations_reporter.py
Expand Up @@ -3,6 +3,7 @@
"""
from __future__ import unicode_literals

import os
from collections import defaultdict

from xml.etree import cElementTree
Expand Down Expand Up @@ -115,3 +116,46 @@ def installed(self):
Returns: boolean False: As findbugs analyses bytecode, it would be hard to run it from outside the build framework.
"""
return False


class PmdXmlDriver(QualityDriver):
def __init__(self):
"""
See super for args
"""
super(PmdXmlDriver, self).__init__(
'pmd',
['java'],
[]
)

def parse_reports(self, reports):
"""
Args:
reports: list[str] - output from the report
Return:
A dict[Str:Violation]
Violation is a simple named tuple Defined above
"""
violations_dict = defaultdict(list)
for report in reports:
xml_document = cElementTree.fromstring("".join(report))
files = xml_document.findall(".//file")
for file in files:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please rename the file variable here.

File is a type in python so using it as a variable name can be confusing.

>>> file
<type 'file'>

for error in file.findall('violation'):
line_number = error.get('beginline')
error_str = "{}: {}".format(error.get('rule'),
error.text.strip())
violation = Violation(int(line_number), error_str)
filename = GitPathTool.relative_path(file.get('name'))
filename = filename.replace(os.sep, "/")
violations_dict[filename].append(violation)

return violations_dict

def installed(self):
"""
Method checks if the provided tool is installed.
Returns: boolean False: As findbugs analyses bytecode, it would be hard to run it from outside the build framework.
"""
return True
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you want return False here.

Diff-cover is unlikely to be running findbugs, instead it will be parsing a report provided by the user.

If you intend to have diff-cover run findbugs this PR is going to need a bit more work to actually be able to run it.