changeset 19:0cdda44240a6

Add treepkg/report.py for reporting and use it in reportstatus.py
author Bernhard Herzog <bh@intevation.de>
date Tue, 13 Mar 2007 19:21:37 +0100
parents d5c24cfce05e
children 467013d9d627
files reportstatus.py treepkg/report.py
diffstat 2 files changed, 112 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- /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 <bh@intevation.de>
+#
+# 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 '<unknown>'.
+    """
+    if timestamp:
+        return str(timestamp)
+    else:
+        return "<unknown>"
+
+
+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)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)