def getHeaderLine(self, tests, version, linkFromDetailsToOverview): testName, state, extraVersion = tests[0] if len(tests) == 1: linksToOverview = self.getLinksToOverview( version, testName, extraVersion, linkFromDetailsToOverview) headerText = "TEST " + repr(state) + " " + testName + " (" container = HTMLgen.Container(headerText, linksToOverview) return HTMLgen.Heading(4, container, ")") else: headerText = str(len(tests)) + " TESTS " + repr(state) return HTMLgen.Heading(4, headerText)
def __init__(self, tag, pageTitle, pageSubTitles): tagText = getDisplayText(tag) pageDetailTitle = "Detailed test results for " + pageTitle + ": " + tagText self.document = HTMLgen.SimpleDocument( title=TitleWithDateStamp(pageDetailTitle), meta='<meta charset="' + locale.getpreferredencoding() + '">') headerText = tagText + " - detailed test results for " + pageTitle self.document.append(HTMLgen.Heading(1, headerText, align='center')) for subTitle, command in pageSubTitles: self.document.append(HTMLgen.Center(HTMLgen.Emphasis(subTitle))) self.document.append( HTMLgen.Center( HTMLgen.Paragraph(command, style='font-family:monospace'))) self.totalCategoryHandler = CategoryHandler() self.versionSections = []
def addVersionSection(self, version, categoryHandler, linkFromDetailsToOverview): self.totalCategoryHandler.update(categoryHandler) container = HTMLgen.Container() container.append(HTMLgen.HR()) container.append(self.getSummaryHeading(version, categoryHandler)) for desc, testInfo in categoryHandler.getTestsWithDescriptions(): fullDescription = self.getFullDescription( testInfo, version, linkFromDetailsToOverview) if fullDescription: container.append(HTMLgen.Name(version + desc)) container.append( HTMLgen.Heading( 3, "Detailed information for the tests that " + desc + ":")) container.append(fullDescription) self.versionSections.append(container)
def getSummaryHeading(self, version, categoryHandler): return HTMLgen.Heading( 2, version + ": " + categoryHandler.generateTextSummary())
def generateExtraVersionLinks(self, extraVersions): cont = HTMLgen.Container() for extra in extraVersions: fullName = self.version + "." + extra cont.append(HTMLgen.Href("#" + fullName, extra)) return HTMLgen.Heading(2, cont, align='center')
def makeTableHeaderCell(self, tableHeader): container = HTMLgen.Container() container.append(HTMLgen.Name(tableHeader)) container.append( HTMLgen.U(HTMLgen.Heading(1, tableHeader, align='center'))) return HTMLgen.TD(container)
def generate(self, repositoryDirs, subPageNames, archiveUnused): minorVersionHeader = HTMLgen.Container() allMonthSelectors = set() latestMonth = None pageToGraphs = {} for version, repositoryDirInfo in list(repositoryDirs.items()): self.diag.info("Generating " + version) tagData, stateFiles, successFiles = self.findTestStateFilesAndTags( repositoryDirInfo) if len(stateFiles) > 0 or len(successFiles) > 0: tags = list(tagData.keys()) tags.sort(key=self.tagSortKey) selectors = self.makeSelectors(subPageNames, tags) monthSelectors = SelectorByMonth.makeInstances(tags) allMonthSelectors.update(monthSelectors) allSelectors = selectors + list(reversed(monthSelectors)) # If we already have month pages, we only regenerate the current one if len(self.getExistingMonthPages()) == 0: selectors = allSelectors else: currLatestMonthSel = monthSelectors[-1] if latestMonth is None or currLatestMonthSel.linkName == latestMonth: selectors.append(monthSelectors[-1]) latestMonth = currLatestMonthSel.linkName selectedTags = set() unusedTags = set(tags) for selector in selectors: currTags = set(selector.selectedTags) selectedTags.update(currTags) if archiveUnused: unusedTags.difference_update(currTags) tags = [t for t in tags if t in selectedTags] if archiveUnused and unusedTags: plugins.log.info( "Automatic repository cleaning will now remove old data for the following runs:" ) for tag in sorted(unusedTags, key=self.tagSortKey): plugins.log.info("- " + tag) plugins.log.info( "(To disable automatic repository cleaning in future, please run with the --manualarchive flag when collating the HTML report.)" ) self.removeUnused(unusedTags, tagData) loggedTests = OrderedDict() categoryHandlers = {} self.diag.info("Processing " + str(len(stateFiles)) + " teststate files") relevantFiles = 0 for stateFile, repository in stateFiles: tag = self.getTagFromFile(stateFile) if len(tags) == 0 or tag in tags: relevantFiles += 1 testId, state, extraVersion = self.processTestStateFile( stateFile, repository) loggedTests.setdefault(extraVersion, OrderedDict()).setdefault( testId, OrderedDict())[tag] = state categoryHandlers.setdefault( tag, CategoryHandler()).registerInCategory( testId, state.category, extraVersion, state) if relevantFiles % 100 == 0: self.diag.info("- Processed " + str(relevantFiles) + " files with matching tags so far") self.diag.info("Processed " + str(relevantFiles) + " relevant teststate files") self.diag.info("Processing " + str(len(successFiles)) + " success files") for successFile, repository in successFiles: testId = self.getTestIdentifier(successFile, repository) extraVersion = self.findExtraVersion(repository) with open(successFile) as f: fileTags = set() for line in f: parts = line.strip().split(" ", 1) if len(parts) != 2: continue tag, text = parts if tag in fileTags: sys.stderr.write( "WARNING: more than one result present for tag '" + tag + "' in file " + successFile + "!\n") sys.stderr.write("Ignoring later ones\n") continue fileTags.add(tag) if len(tags) == 0 or tag in tags: loggedTests.setdefault( extraVersion, OrderedDict()).setdefault( testId, OrderedDict())[tag] = text categoryHandlers.setdefault( tag, CategoryHandler()).registerInCategory( testId, "success", extraVersion, text) self.diag.info("Processed " + str(len(successFiles)) + " success files") versionToShow = self.removePageVersion(version) hasData = False for sel in selectors: filePath = self.getPageFilePath(sel) if filePath in self.pagesOverview: page, pageColours = self.pagesOverview[filePath] else: page = self.createPage() pageColours = set() self.pagesOverview[filePath] = page, pageColours tableHeader = self.getTableHeader(version, repositoryDirs) heading = self.getHeading(versionToShow) hasNewData, graphLink, tableColours = self.addTable( page, self.resourceNames, categoryHandlers, version, loggedTests, sel, tableHeader, filePath, heading, repositoryDirInfo) hasData |= hasNewData pageColours.update(tableColours) if graphLink: pageToGraphs.setdefault(page, []).append(graphLink) if hasData and versionToShow: link = HTMLgen.Href("#" + version, versionToShow) minorVersionHeader.append(link) # put them in reverse order, most relevant first linkFromDetailsToOverview = [ sel.getLinkInfo(self.pageVersion) for sel in allSelectors ] for tag in tags: details = self.pagesDetails.setdefault( tag, TestDetails(tag, self.pageTitle, self.pageSubTitles)) details.addVersionSection(version, categoryHandlers[tag], linkFromDetailsToOverview) selContainer = HTMLgen.Container() selectors = self.makeSelectors(subPageNames) for sel in selectors: target, linkName = sel.getLinkInfo(self.pageVersion) selContainer.append(HTMLgen.Href(target, linkName)) monthContainer = HTMLgen.Container() if len(allMonthSelectors) == 1: # Don't want just one month, no navigation possible prevMonth = list(allMonthSelectors)[0].getPreviousMonthSelector() allMonthSelectors.add(prevMonth) for sel in sorted(allMonthSelectors, key=lambda s: s.sortKey()): target, linkName = sel.getLinkInfo(self.pageVersion) monthContainer.append(HTMLgen.Href(target, linkName)) for page, pageColours in list(self.pagesOverview.values()): if len(monthContainer.contents) > 0: page.prepend(HTMLgen.Heading(2, monthContainer, align='center')) graphs = pageToGraphs.get(page) page.prepend(HTMLgen.Heading(2, selContainer, align='center')) if minorVersionHeader.contents: if not graphs is None and len(graphs) > 1: page.prepend(HTMLgen.Heading(1, *graphs, align='center')) page.prepend( HTMLgen.Heading(1, minorVersionHeader, align='center')) creationDate = TitleWithDateStamp("").__str__().strip() page.prepend(HTMLgen.Paragraph(creationDate, align="center")) page.prepend(HTMLgen.Heading(1, self.getHeading(), align='center')) if len(pageColours) > 0: page.prepend(HTMLgen.BR()) page.prepend(HTMLgen.BR()) page.script = self.getFilterScripts(pageColours) self.writePages()