|
|
|
|
|
from __future__ import with_statement |
|
|
|
|
|
import logging |
|
|
import sys |
|
|
import os.path |
|
|
|
|
|
import colorama |
|
|
from colorama import Fore, Back, Style |
|
|
from docopt import docopt |
|
|
|
|
|
from jxml.etree import XSLTCoverage |
|
|
from jxml.etree import xsltcoverage |
|
|
|
|
|
|
|
|
def colorama_init(f): |
|
|
def wrapper(*args, **kwargs): |
|
|
colorama.init() |
|
|
try: |
|
|
return f(*args, **kwargs) |
|
|
finally: |
|
|
colorama.deinit() |
|
|
return wrapper |
|
|
|
|
|
|
|
|
@colorama_init |
|
|
def annotate_main(): |
|
|
__doc__ = ''' |
|
|
Usage: jxml-annotate [options] <xml-file>... |
|
|
|
|
|
<xml-file> Cobertura-compatible coverage data file |
|
|
--color=[auto|yes|no] Output with colors |
|
|
|
|
|
Example: |
|
|
jxml-annotate --color=yes coverage.xml | less -R |
|
|
''' |
|
|
args = docopt(__doc__) |
|
|
|
|
|
logging.basicConfig() |
|
|
logger = logging.getLogger('jxml.annotate') |
|
|
|
|
|
use_color = args['--color'] == 'yes' |
|
|
if args['--color'] in ('auto', None): |
|
|
use_color = sys.stdout.isatty() |
|
|
|
|
|
coverage = XSLTCoverage() |
|
|
for arg in args['<xml-file>']: |
|
|
coverage.read_from(arg) |
|
|
|
|
|
traces = coverage.traces |
|
|
for filename in sorted(traces): |
|
|
covered_lines = traces[filename] |
|
|
if not os.path.exists(filename): |
|
|
logger.info('skipping %s: not exists', filename) |
|
|
continue |
|
|
print filename |
|
|
|
|
|
with open(filename) as f: |
|
|
for line_no, line in enumerate(f): |
|
|
line_no += 1 |
|
|
count = covered_lines.get(line_no, 0) |
|
|
annotated = '%8d: %s' % (count, line) |
|
|
|
|
|
if use_color: |
|
|
if count == 0: |
|
|
color = Fore.RED |
|
|
else: |
|
|
color = Fore.RESET |
|
|
annotated = color + annotated + Fore.RESET |
|
|
sys.stdout.write(annotated) |
|
|
|
|
|
print '' |
|
|
|
|
|
|
|
|
def load_tests(filenames): |
|
|
import unittest |
|
|
ts = unittest.TestSuite() |
|
|
testloader = unittest.defaultTestLoader |
|
|
for filename in filenames: |
|
|
d = dict() |
|
|
execfile(filename, d) |
|
|
for name in d: |
|
|
x = d[name] |
|
|
if isinstance(x, type) and issubclass(x, unittest.TestCase): |
|
|
ts.addTests(testloader.loadTestsFromTestCase(x)) |
|
|
return ts |
|
|
|
|
|
|
|
|
def cov_test_main(): |
|
|
__doc__ = ''' |
|
|
Usage: jxml-cov-test [options] <output-file> <unittest-file>... |
|
|
|
|
|
<output-file> Cobertura-compatible coverage data file. |
|
|
<unittest-file> unittest files. |
|
|
|
|
|
Example: |
|
|
jxml-cov-test coverage.xml test1.py test2.py |
|
|
''' |
|
|
args = docopt(__doc__) |
|
|
|
|
|
logging.basicConfig() |
|
|
logger = logging.getLogger('jxml.cov-test') |
|
|
|
|
|
from java.lang import System |
|
|
import unittest |
|
|
|
|
|
props = System.getProperties() |
|
|
props['javax.xml.transform.TransformerFactory'] = 'org.apache.xalan.processor.TransformerFactoryImpl' |
|
|
props['javax.xml.parsers.DocumentBuilderFactory'] = 'org.apache.xerces.jaxp.DocumentBuilderFactoryImpl' |
|
|
props['javax.xml.parsers.SAXParserFactory'] = 'org.apache.xerces.jaxp.SAXParserFactoryImpl' |
|
|
|
|
|
output_name = args['<output-file>'] |
|
|
test_filenames = args['<unittest-file>'] |
|
|
ts = load_tests(test_filenames) |
|
|
runner = unittest.TextTestRunner() |
|
|
with xsltcoverage(output_name) as coverage: |
|
|
runner.run(ts) |
|
|
|