X-Git-Url: https://piware.de/gitweb/?a=blobdiff_plain;f=workitems.py;h=1147efab359e3ea0471025678392554770e1768e;hb=c4d56a5784f69f6f9b442058b14be5cc05a8ed26;hp=301b9499de64ca506ff16ba34e648d262df193d3;hpb=fe7796b53082506f99a552fe820c78ae1e8c08b0;p=bin.git diff --git a/workitems.py b/workitems.py index 301b949..1147efa 100755 --- a/workitems.py +++ b/workitems.py @@ -41,6 +41,9 @@ def parse_argv(): help='Regex pattern for blueprint name', dest='pattern') optparser.add_option('-D', '--dump', action='store_true', default=False, help='Dump database', dest='dump') + optparser.add_option('-m', '--moin', metavar='URL', + help='moin URL for additional work items (can be given multiple times)', + action='append', dest='moin', default=[]) optparser.add_option('-t', '--text', action='store_true', default=False, help='Print work item summary in text format', dest='text') optparser.add_option('-c', '--csv', action='store_true', default=False, @@ -62,7 +65,7 @@ def parse_argv(): return (opts, args) -def get_blueprints(url, nname_pattern): +def get_blueprints(url, name_pattern): '''Return a list of blueprint URLs for the current release.''' blueprint_name_filter = re.compile('href="(/ubuntu/\+spec/%s[^"]+)"' % @@ -76,7 +79,7 @@ def get_blueprints(url, nname_pattern): return result -def get_workitems(blueprint_url): +def get_blueprint_workitems(blueprint_url): '''Collect work items from a particular blueprint URL. This will return a list of ('item', 'status') pairs. @@ -91,9 +94,7 @@ def get_workitems(blueprint_url): found_workitems = True continue - l = l.strip() - if l.endswith('
'): - l = l[:-6] + l = l.replace('
', '').replace('', '').strip() # ends with empty line if l.endswith('

') or not l: @@ -108,6 +109,8 @@ def get_workitems(blueprint_url): state = state.strip().lower() if not state: state = 'todo' + if state == 'completed': + state = 'done' if state not in valid_states: print >> sys.stderr, 'ERROR: invalid state "%s" for work item "%s"' % ( state, desc) @@ -116,6 +119,31 @@ def get_workitems(blueprint_url): return result +def get_moin_workitems(url): + '''Collect work items from a moin wiki URL. + + Every line starting with "|| " is treated as a work item. + + Return a list of ('item', 'status') pairs. + ''' + result = [] + for line in urllib.urlopen(url): + if line.startswith('|| '): + fields = line.strip().split('||') + assert not fields[0] # should be empty + desc = fields[1].strip() + for f in fields[2:]: + if 'DONE' in f: + result.append((desc, 'done')) + break + elif 'POSTPONED' in f: + result.append((desc, 'done')) + break + else: + result.append((desc, 'todo')) + + return result + def dump(db): '''Dump database contents.''' @@ -137,15 +165,17 @@ def import_lp(db, name_pattern, release): blueprints = get_blueprints('%s//ubuntu/%s/+specs' % (blueprints_base_url, opts.release), name_pattern) + cur = db.cursor() + cur.execute('DELETE FROM work_items WHERE date = date(CURRENT_TIMESTAMP)') + for bp in blueprints: #print 'Checking', bp bpname = bp.split('/')[-1] - work_items = get_workitems(bp) + work_items = get_blueprint_workitems(bp) if not work_items: print >> sys.stderr, 'WARNING: %s has no work items' % bpname for (item, status) in work_items: add_work_item(db, bpname, item, status) - db.commit() def workitems_over_time(db): '''Calculate work item development over time. @@ -229,6 +259,13 @@ def csv(db, from_date, to_date): entry.get('postponed', 0)) d += datetime.timedelta(days=1) +def import_moin(db, urls): + '''Collect blueprint work items from a moin wiki.''' + + for url in urls: + for (d, s) in get_moin_workitems(url): + add_work_item(db, url, d, s) + # # main # @@ -245,4 +282,6 @@ elif opts.csv: csv(db, opts.from_date, opts.to_date) else: import_lp(db, opts.pattern, opts.release) + import_moin(db, opts.moin) + db.commit()