From 13373c4f60c0ad89df809f87f5783e8a07f99b6b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 4 Apr 2013 00:05:41 +0200 Subject: [PATCH] support varying output modifiers for report Signed-off-by: Nico Schottelius --- bin/ctt | 5 ++-- lib/ctt/__init__.py | 1 + lib/ctt/report.py | 58 ++++++++++++++++++++++++++++++++++----------- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/bin/ctt b/bin/ctt index 976ca3c..25aae20 100755 --- a/bin/ctt +++ b/bin/ctt @@ -69,8 +69,9 @@ def parse_argv(argv, version): parser['report'].add_argument("project", help="Project to report time for", nargs=1) parser['report'].add_argument("-s", "--start", help="Start date (default: first of last month, format: %s)" % ctt.DATEFORMAT_PLAIN, nargs=1) - parser['report'].add_argument("-e", "--end", help="End date (default: last of last month, format: %s)" % ctt.DATEFORMAT_PLAIN, nargs=1, - default=None) + parser['report'].add_argument("-e", "--end", help="End date (default: last of last month, format: %s)" % ctt.DATEFORMAT_PLAIN, nargs=1, default=None) + + parser['report'].add_argument("-f", "--format", help="Output format (default: %s)" % ctt.REPORTFORMAT, default=ctt.REPORTFORMAT, dest="output_format") #parser['track'].add_argument("-t", "--tag", help="Add tags", # action="store_true") diff --git a/lib/ctt/__init__.py b/lib/ctt/__init__.py index 64427a9..95d29a9 100644 --- a/lib/ctt/__init__.py +++ b/lib/ctt/__init__.py @@ -30,6 +30,7 @@ DATEFORMAT = "%Y-%m-%d" DATEFORMAT_PLAIN= DATEFORMAT.replace("%","") DATETIMEFORMAT = "%Y-%m-%d-%H%M" DATETIMEFORMAT_PLAIN= DATETIMEFORMAT.replace("%","") +REPORTFORMAT = "{0} ({1}): {2}" # Name of the folder to create - should not contain special characters # to ensure cross-os compatibility diff --git a/lib/ctt/report.py b/lib/ctt/report.py index 7e1bb01..1ad0e14 100755 --- a/lib/ctt/report.py +++ b/lib/ctt/report.py @@ -28,6 +28,7 @@ import time import os import os.path +import re import sys import ctt @@ -37,17 +38,19 @@ log = logging.getLogger(__name__) class Report(object): """Create a report on tracked time""" - def __init__(self, project, start_date, end_date): + def __init__(self, project, start_date, end_date, output_format): self.project = project self.project_dir = ctt.project_dir(self.project) + self.output_format = output_format + self._init_date(start_date, end_date) self._init_report_db() @classmethod def commandline(cls, args): - report = cls(args.project[0], args.start, args.end) + report = cls(args.project[0], args.start, args.end, args.output_format) report.report() @@ -56,9 +59,16 @@ class Report(object): now = datetime.datetime.now() - first_day = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) - default_end_date = first_day - datetime.timedelta(days=1) - default_start_date = default_end_date.replace(day=1) + first_day_this_month = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) + next_month = first_day_this_month.replace(day=28) + datetime.timedelta(days=4) + first_day_next_month = next_month.replace(day=1) + last_day_this_month = first_day_next_month - datetime.timedelta(seconds=1) + + default_start_date = first_day_this_month + default_end_date = last_day_this_month + + #default_end_date = first_day - datetime.timedelta(days=1) + #default_start_date = default_end_date.replace(day=1) try: if start_date: @@ -85,24 +95,36 @@ class Report(object): if not os.path.isdir(self.project_dir): raise ctt.Error("Project does not exist: %s" % (self.project)) + # self.regexp = "^rails19" + self.regexp = None + self._report_db = {} for dirname in os.listdir(self.project_dir): dir_datetime = datetime.datetime.strptime(dirname, ctt.DISKFORMAT) if dir_datetime >= self.start_date and dir_datetime <= self.end_date: filename = os.path.join(self.project_dir, dirname, ctt.FILE_DELTA) + comment_filename = os.path.join(self.project_dir, dirname, ctt.FILE_COMMENT) + + # Check for matching comment + comment = None + if os.path.exists(comment_filename): + with open(comment_filename, "r") as fd: + comment = fd.read().rstrip('\n') + + # If regular expression given, but not matching, skip entry + if self.regexp and not re.search(self.regexp, comment): + continue + self._report_db[dirname] = {} + if comment: + self._report_db[dirname]['comment'] = comment with open(filename, "r") as fd: self._report_db[dirname]['delta'] = fd.read().rstrip('\n') log.debug("Recording: %s: %s" % (dirname, self._report_db[dirname]['delta'])) - comment_filename = os.path.join(self.project_dir, dirname, ctt.FILE_COMMENT) - if os.path.exists(comment_filename): - with open(comment_filename, "r") as fd: - self._report_db[dirname]['comment'] = fd.read().rstrip('\n') - else: log.debug("Skipping: %s" % dirname) @@ -140,7 +162,11 @@ class Report(object): entry = self._report_db[time] start_datetime = datetime.datetime.strptime(time, ctt.DATETIMEFORMAT) + + delta_seconds = int(float(entry['delta'])) + delta_minutes = int(delta_seconds/60) delta = datetime.timedelta(seconds=int(float(entry['delta']))) + end_datetime = start_datetime + delta # Strip off microsecends - this is really too much @@ -152,7 +178,11 @@ class Report(object): else: comment = False - if comment: - print("%s (%s): %s" % (start_datetime, delta, comment)) - else: - print("%s (%s)" % (start_datetime, delta)) + #output_format="{0};{4};{2}" + + print(self.output_format.format(start_datetime, delta, comment, delta_seconds, delta_minutes)) + + #if comment: + # print("%s (%s): %s" % (start_datetime, delta, comment)) + #else: + # print("%s (%s)" % (start_datetime, delta))