governance/openstack_governance/_wiki.py
Doug Hellmann bf88100e43 add a script to randomly assign TC members as liaisons
This script reads the TC liaison assignments from the wiki and fills
in the gaps by randomly assigning members to work with teams.

Change-Id: I1d7eaad0e78fd020472fa560f08b5e7bfb9028b5
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
2018-10-09 15:55:24 -04:00

94 lines
2.6 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Do dirty things with wikis.
"""
import collections
import itertools
import mwclient
def get_page_section(page_content, section_start):
"Return iterable of lines making up a section of a wiki page."
lines = page_content.splitlines()
lines = itertools.dropwhile(
lambda x: x != section_start,
lines,
)
next(lines) # skip the start_section line
lines = itertools.takewhile(
lambda x: not x.startswith('='), # another section or subsection
lines,
)
return lines
def get_wiki_table(section_content):
"""Return iterable of dicts making up rows of a wiki table.
Assumes there is only one table per section.
"""
lines = itertools.dropwhile(
lambda x: x != '{| class="wikitable"',
section_content,
)
headings = []
items = []
for line in lines:
if line == '|-':
continue
elif line.startswith('!'):
headings = [h.strip() for h in line.lstrip('!').split('!!')]
elif line in ['}', '|}']:
# end of table
break
elif line.startswith('|'):
items.extend(i.strip() for i in line.lstrip('|').split('||'))
if len(items) == len(headings):
row = {
h: i
for (h, i) in zip(headings, items)
}
yield row
items = []
def get_wiki_page(name):
"Return the text of a wiki page as a string."
site = mwclient.Site('wiki.openstack.org')
page = site.Pages[name]
return page.text()
def get_liaison_data():
"Return team -> liaisons mapping"
project_to_liaisons = collections.OrderedDict()
wiki_page = get_wiki_page('OpenStack_health_tracker')
section = get_page_section(wiki_page, '=== Project Teams ===')
table = get_wiki_table(section)
for row in table:
if not row:
continue
liaisons = [
m.strip()
for m in row['TC members'].split(',')
if m.strip()
]
project_to_liaisons[row['Group']] = liaisons
return project_to_liaisons