governance/doc/source/_exts/teams.py
Doug Hellmann 5d986f3ef5 change projects schema to support more ptl contact data
Change-Id: I3e8c9eebd9b6c506f84bdad4fe9e7c010d0fe344
2015-10-13 20:05:21 +00:00

128 lines
3.8 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.
"""Report on the current list of projects.
"""
from docutils import nodes
from docutils.parsers import rst
from docutils.statemachine import ViewList
from sphinx.util.nodes import nested_parse_with_titles
import projects
IRC_LOG_URL_BASE = 'http://eavesdrop.openstack.org/irclogs/%23'
def _team_to_rst(name, info):
yield '.. _project-%s:' % projects.slugify(name)
yield ''
yield '=' * len(name)
yield name.title()
yield '=' * len(name)
yield ''
yield ':Home Page: ' + info.get('url', '')
ptl = info.get('ptl', {'name': '', 'irc': ''})
yield ':PTL: %(name)s (%(irc)s)' % ptl
irc_channel = info.get('irc-channel')
if irc_channel:
yield ':IRC Channel: `#%s <%s%s>`__' % (
irc_channel, IRC_LOG_URL_BASE, irc_channel)
service = info.get('service')
if service:
yield ':Service: ' + service
yield ''
mission = info.get('mission', '').rstrip()
if mission:
yield "Mission"
yield '-------'
yield ''
yield mission
yield ''
tags = info.get('tags', [])
if tags:
yield 'Team based tags'
yield '----------------'
yield ''
for tag in tags:
yield '- :ref:`tag-%s`' % tag
yield ''
yield 'Deliverables and Tags'
yield '---------------------'
yield ''
deliverables = info.get('deliverables', [])
if deliverables:
for name, deliverable in deliverables.items():
title = '- %s' % name
repos = deliverable.get('repos', [])
if repos:
repolist = " ("
for repo in repos:
repolist += ':repo:`%s`, ' % repo
title += repolist[0:-2] + ")"
yield title
tags = deliverable.get('tags', [])
if tags is not []:
yield ''
for tag in tags:
yield ' - :ref:`tag-%s`' % tag
else:
yield 'None'
yield ''
yield 'Extra ATCs'
yield '-----------'
yield '.. extraatcstable:: '
yield ' :project: %s' % name
yield ''
def _write_team_pages(app):
all_teams = projects.get_project_data()
files = []
for team, info in all_teams.items():
slug = projects.slugify(team)
filename = 'reference/projects/%s.rst' % slug
app.info('generating team page for %s' % team)
with open(filename, 'w') as f:
f.write('\n'.join(_team_to_rst(team, info)))
files.append(filename)
return files
class TeamsListDirective(rst.Directive):
has_content = False
def run(self):
all_teams = projects.get_project_data()
# Build the view of the data to be parsed for rendering.
result = ViewList()
for team_name in sorted(all_teams.keys()):
team_info = all_teams[team_name]
for line in _team_to_rst(team_name, team_info):
result.append(line, '<' + __name__ + '>')
# Parse what we have into a new section.
node = nodes.section()
node.document = self.state.document
nested_parse_with_titles(self.state, result, node)
return node.children
def setup(app):
app.info('loading teams extension')
app.add_directive('teamslist', TeamsListDirective)
_write_team_pages(app)