# HG changeset patch # User Bernhard Herzog # Date 1173810097 -3600 # Node ID 0cdda44240a64ff219ae6f6e54dde82e7b31ba5c # Parent d5c24cfce05e89aa2b1fc017c25d272855afc158 Add treepkg/report.py for reporting and use it in reportstatus.py diff -r d5c24cfce05e -r 0cdda44240a6 reportstatus.py --- a/reportstatus.py Tue Mar 13 16:51:46 2007 +0100 +++ b/reportstatus.py Tue Mar 13 19:21:37 2007 +0100 @@ -11,8 +11,7 @@ import os from optparse import OptionParser -from treepkg.packager import create_package_line, PackagerGroup -from treepkg.readconfig import read_config +from treepkg.report import get_packager_group, prepare_report def parse_commandline(): parser = OptionParser() @@ -21,17 +20,22 @@ parser.add_option("--config-file") return parser.parse_args() + +def report_text(group): + report = prepare_report(group) + for revno, row in report.revisions: + for col in row: + if col: + print "%s %s: %s" % (col.name, revno, col.status.desc) + if col.status.start: + print " Start:", col.status.start + print " Stop:", col.status.stop + print + def main(): options, args = parse_commandline() + group = get_packager_group(options.config_file) + report_text(group) - treepkg_opts, packager_opts = read_config(options.config_file) - group = PackagerGroup([create_package_line(**opts) - for opts in packager_opts], - **treepkg_opts) - for line in group.get_package_lines(): - for revision in line.get_revisions(): - print line.name, revision.revision, revision.status.status - print " start:", revision.status.start - print " stop:", revision.status.stop main() diff -r d5c24cfce05e -r 0cdda44240a6 treepkg/report.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/treepkg/report.py Tue Mar 13 19:21:37 2007 +0100 @@ -0,0 +1,97 @@ +# Copyright (C) 2007 by Intevation GmbH +# Authors: +# Bernhard Herzog +# +# This program is free software under the GPL (>=v2) +# Read the file COPYING coming with the software for details. + +"""Support for status reports""" + +from packager import create_package_line, PackagerGroup +from readconfig import read_config + +class struct(object): + + """Class to create simple struct like objects + + All keyword arguments passed to the constructor are available as + instance variables. + """ + + def __init__(self, **kw): + self.__dict__.update(kw) + + def __repr__(self): + fields = ["%s=%r" % item for item in self.__dict__.items()] + return "struct(" + ", ".join(fields) + ")" + + +def get_packager_group(config_file): + treepkg_opts, packager_opts = read_config(config_file) + return PackagerGroup([create_package_line(**opts) + for opts in packager_opts], + **treepkg_opts) + +status_expansions = dict( + binary_package_created="build successful", + creating_binary_package="building binary packages", + source_package_created="source package created", + creating_source_package="creating source package", + error="error") + +def status_finished(status): + return status.status == "binary_package_created" + +def status_error(status): + return status.status == "error" + +def status_class(status): + """Returns the CSS class for a status""" + if status_finished(status): + return "finished" + elif status_error(status): + return "error" + else: + return "inprogress" + +def format_time(timestamp): + """Formats a datetime object for a status report + + if the argument is true, the return value is simply str applied to + the argument, which for datetime objects is a string with the format + 'YYYY-MM-DD hh:mm:ss'. If the argument is false, the return value + is ''. + """ + if timestamp: + return str(timestamp) + else: + return "" + + +def prepare_status(status): + return struct(desc=status_expansions.get(status.status, + status.status), + start=format_time(status.start), + stop=format_time(status.stop), + cls=status_class(status)) + +def prepare_report(group): + revisions = [] + columns = [] + pkglines = group.get_package_lines() + num_columns = len(pkglines) + for column, line in enumerate(pkglines): + columns.append((column, line.name)) + for revision in line.get_revisions(): + row = [None] * num_columns + row[column] = struct(revno=revision.revision, + revision=revision, + column=column, + name=line.name, + status=prepare_status(revision.status)) + revisions.append((revision.revision, row)) + revisions.sort() + revisions.reverse() + + return struct(columns=columns, + revisions=revisions)