pypy / testrunner /

from lxml.etree import parse
from collections import defaultdict
from os.path import join, exists
import argparse
parser = argparse.ArgumentParser()

opts = parser.parse_args()

xml = parse(opts.junitxml)
root = xml.getroot()

bugstarts = 'interpreter', 'tool', 'module'
def findfile(root, classname):
    if not classname:
    parts = classname.split('.')
    #pytest bug workaround
    first = parts[0]
    for start in bugstarts:
        if first.startswith(start) and \
           first != start and \
           first[len(start)] != '.':
            parts[0] = start
            parts.insert(1, 'py'+first[len(start):])

    while parts:
        path = join(root, *parts) + '.py'
        if exists(path):
            return join(*parts) + '.py'

accum = defaultdict(list)
garbageitems = []

for item in root:
    filename = findfile(opts.fileroot, item.attrib['classname'])
    if filename is None:

garbage = accum.pop(None, [])
if garbage:
    print 'garbage', sum(garbage), len(garbage)

for key in sorted(accum):
    value = accum[key]
    print key, sum(value), len(value)

print '-'*30

for item in garbageitems:
    print item.attrib
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.