Merge "Add projects.yaml support"
This commit is contained in:
commit
107c686fa2
|
@ -1,3 +1,7 @@
|
|||
# Only pay attention to the project index
|
||||
reference/tsc/projects/*.rst
|
||||
!reference/tsc/projects/index.rst
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
openstack-doc-tools>=1.6.0
|
||||
openstackdocstheme>=1.19.0 # Apache-2.0
|
||||
sphinx>=1.6.2
|
||||
yamlordereddictloader
|
||||
|
|
|
@ -15,8 +15,9 @@
|
|||
import re
|
||||
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst.directives.tables import Table
|
||||
from docutils.parsers.rst import directives
|
||||
from docutils.parsers.rst.directives.tables import Table
|
||||
from docutils.utils import SystemMessagePropagation
|
||||
from sphinx.util import logging
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -64,7 +65,6 @@ class MembersTable(Table):
|
|||
def run(self):
|
||||
env = self.state.document.settings.env
|
||||
app = env.app
|
||||
config = app.config
|
||||
|
||||
# The required argument to the directive is the name of the
|
||||
# file to parse.
|
||||
|
@ -90,7 +90,7 @@ class MembersTable(Table):
|
|||
'Error processing memberstable directive:\n%s' % err,
|
||||
nodes.literal_block(self.block_text, self.block_text),
|
||||
line=self.lineno,
|
||||
)
|
||||
)
|
||||
return [error]
|
||||
|
||||
# Now find the real path to the file, relative to where we are.
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
# 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"""
|
||||
|
||||
import copy
|
||||
from docutils import nodes
|
||||
from docutils.parsers import rst
|
||||
from docutils import statemachine
|
||||
import os
|
||||
from sphinx.util import logging
|
||||
from sphinx.util.nodes import nested_parse_with_titles
|
||||
import yaml
|
||||
import yamlordereddictloader
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
IRC_LOG_URL_BASE = 'http://eavesdrop.openstack.org/irclogs/%23'
|
||||
|
||||
_projects_yaml = {}
|
||||
|
||||
|
||||
def _get_project_data():
|
||||
"""Return a copy of the project data."""
|
||||
return copy.deepcopy(_projects_yaml)
|
||||
|
||||
|
||||
def _load_project_file(filename='reference/tsc/projects.yaml'):
|
||||
with open(filename, 'r', encoding='utf-8') as f:
|
||||
return yaml.load(
|
||||
f.read(),
|
||||
Loader=yamlordereddictloader.Loader,
|
||||
)
|
||||
|
||||
|
||||
def _project_to_rst(name, info):
|
||||
|
||||
if 'service' in info:
|
||||
title = "{0} ({1})".format(name.title(), info['service'])
|
||||
elif name == 'I18n':
|
||||
title = name
|
||||
else:
|
||||
title = name.title()
|
||||
|
||||
yield '.. _project-%s:' % _slugify(name)
|
||||
yield ''
|
||||
yield '=' * len(title)
|
||||
yield title
|
||||
yield '=' * len(title)
|
||||
yield ''
|
||||
yield ':Home Page: ' + info.get('url', '')
|
||||
tl = info.get('tl', {'name': '', 'irc': '', 'email': ''})
|
||||
yield ':Technical Lead: %(name)s (``%(irc)s``) <%(email)s>' % tl
|
||||
pl = info.get('pl', {'name': '', 'irc': '', 'email': ''})
|
||||
yield ':Project Lead: %(name)s (``%(irc)s``) <%(email)s>' % pl
|
||||
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 ''
|
||||
yield 'Deliverables'
|
||||
yield '------------'
|
||||
yield ''
|
||||
deliverables = info.get('deliverables', [])
|
||||
if deliverables:
|
||||
for repo_name, deliverable in deliverables.items():
|
||||
yield repo_name
|
||||
yield '~' * len(repo_name)
|
||||
yield ''
|
||||
yield ':Repositories: ' + ', '.join(
|
||||
':repo:`%s`' % repo
|
||||
for repo in deliverable.get('repos', [])
|
||||
)
|
||||
yield ''
|
||||
tags = deliverable.get('tags', [])
|
||||
if tags:
|
||||
yield ':Tags:'
|
||||
yield ''
|
||||
for tag in tags:
|
||||
yield ' - :ref:`tag-%s`' % tag
|
||||
yield ''
|
||||
else:
|
||||
yield 'None'
|
||||
yield ''
|
||||
|
||||
|
||||
def _slugify(name):
|
||||
"""Convert name to slug form for references."""
|
||||
return name.lower().replace(' ', '-')
|
||||
|
||||
|
||||
def _write_project_pages(app):
|
||||
all_projects = _get_project_data()
|
||||
files = []
|
||||
for project, info in all_projects.items():
|
||||
LOG.info("project: %s" % project)
|
||||
slug = _slugify(project)
|
||||
filename = 'reference/tsc/projects/%s.rst' % slug
|
||||
LOG.info('generating project page for %s' % project)
|
||||
with open(filename, 'w', encoding='utf-8') as f:
|
||||
f.write('\n'.join(_project_to_rst(project, info)))
|
||||
files.append(filename)
|
||||
return files
|
||||
|
||||
|
||||
class ProjectListDirective(rst.Directive):
|
||||
|
||||
has_content = False
|
||||
|
||||
def run(self):
|
||||
all_projects = _get_project_data()
|
||||
|
||||
# Build the view of the data to be parsed for rendering.
|
||||
result = statemachine.ViewList()
|
||||
for project_name in sorted(all_projects.keys()):
|
||||
project_info = all_projects[project_name]
|
||||
for line in _project_to_rst(project_name, project_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):
|
||||
global _projects_yaml
|
||||
|
||||
LOG.info('loading projects extension')
|
||||
app.add_directive('projectlist', ProjectListDirective)
|
||||
|
||||
filename = os.path.abspath('reference/tsc/projects.yaml')
|
||||
LOG.info('reading %s' % filename)
|
||||
_projects_yaml = _load_project_file(filename)
|
||||
_write_project_pages(app)
|
|
@ -43,8 +43,15 @@ release = u'0.1'
|
|||
extensions = [
|
||||
'members',
|
||||
'openstackdocstheme',
|
||||
'projects',
|
||||
'sphinx.ext.extlinks',
|
||||
]
|
||||
|
||||
# Define shorthand roles for making links to common destinations.
|
||||
extlinks = {
|
||||
'repo': ('https://git.startlingx.io/cgit/%s', ''),
|
||||
}
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
|
|
|
@ -18,6 +18,11 @@ documentation the links below are directly there.
|
|||
* `StarlingX Charter <stx_charter.html>`__
|
||||
* `House Rules <house.html>`__
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
projects/index
|
||||
|
||||
Current Members
|
||||
===============
|
||||
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
---
|
||||
config:
|
||||
pl:
|
||||
name: Dariush Eslimi
|
||||
irc:
|
||||
email: Dariush.Eslimi@windriver.com
|
||||
tl:
|
||||
name: John Kung
|
||||
irc:
|
||||
email: John.Kung@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Configuration
|
||||
mission: >
|
||||
Configure all the things
|
||||
url: https://docs.starlingx.io/stx-config
|
||||
deliverables:
|
||||
config:
|
||||
repos:
|
||||
- stx-config
|
||||
|
||||
distcloud:
|
||||
pl:
|
||||
name: Dariush Eslimi
|
||||
irc:
|
||||
email: Dariush.Eslimi@windriver.com
|
||||
tl:
|
||||
name: Bart Wensley
|
||||
irc:
|
||||
email: Barton.Wensley@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Distributed Cloud
|
||||
mission: >
|
||||
Spreading out the goodness
|
||||
url: https://docs.starlingx.io/stx-distcloud
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-distcloud
|
||||
- stx-distcloud-client
|
||||
|
||||
fault:
|
||||
pl:
|
||||
name: Dariush Eslimi
|
||||
irc:
|
||||
email: Dariush.Eslimi@windriver.com
|
||||
tl:
|
||||
name: Tao Liu
|
||||
irc:
|
||||
email: Tao.Liu@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Fault Management
|
||||
mission: >
|
||||
Manage the faults
|
||||
url: https://docs.starlingx.io/stx-fault
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-fault
|
||||
|
||||
gui:
|
||||
pl:
|
||||
name: Dariush Eslimi
|
||||
irc:
|
||||
email: Dariush.Eslimi@windriver.com
|
||||
tl:
|
||||
name: Tyler Smith
|
||||
irc:
|
||||
email: Tyler.Smith@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Dashboard Plugin
|
||||
mission: >
|
||||
Web GUI
|
||||
url: https://docs.starlingx.io/stx-gui
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-gui
|
||||
|
||||
ha:
|
||||
pl:
|
||||
name: Dariush Eslimi
|
||||
irc:
|
||||
email: Dariush.Eslimi@windriver.com
|
||||
tl:
|
||||
name: Bin Quan
|
||||
irc:
|
||||
email: Bin.Qian@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: High Availability
|
||||
mission: >
|
||||
Stayin' Alive
|
||||
url: https://docs.starlingx.io/stx-ha
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-ha
|
||||
|
||||
metal:
|
||||
pl:
|
||||
name: Ken Young
|
||||
irc:
|
||||
email: Ken.Young@windriver.com
|
||||
tl:
|
||||
name: Eric MacDonald
|
||||
irc:
|
||||
email: Eric.MacDonald@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Bare Metal Management
|
||||
mission: >
|
||||
Tin Cans 'R Us'
|
||||
url: https://docs.starlingx.io/stx-metal
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-metal
|
||||
|
||||
nfv:
|
||||
pl:
|
||||
name: Frank Miller
|
||||
irc:
|
||||
email: Frank.Miller@windriver.com
|
||||
tl:
|
||||
name: Bart Wensley
|
||||
irc:
|
||||
email: Barton.Wensley@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Network Function Virtualization
|
||||
mission: >
|
||||
Don't just stand there, do something!
|
||||
url: https://docs.starlingx.io/stx-nfv
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-nfv
|
||||
|
||||
update:
|
||||
pl:
|
||||
name: Dariush Eslimi
|
||||
irc:
|
||||
email: Dariush.Eslimi@windriver.com
|
||||
tl:
|
||||
name: Don Penney
|
||||
irc:
|
||||
email: Don.Penney@windriver.com
|
||||
irc-channel: starlingx
|
||||
service: Software Update
|
||||
mission: >
|
||||
Keeping up with the neighbors
|
||||
url: https://docs.starlingx.io/stx-update
|
||||
deliverables:
|
||||
fault:
|
||||
repos:
|
||||
- stx-update
|
|
@ -0,0 +1,16 @@
|
|||
==================
|
||||
StarlingX Projects
|
||||
==================
|
||||
|
||||
The projects of StarlingX
|
||||
|
||||
.. _projects:
|
||||
|
||||
Projects
|
||||
--------
|
||||
|
||||
.. toctree::
|
||||
:glob:
|
||||
:titlesonly:
|
||||
|
||||
*
|
|
@ -1,2 +1,3 @@
|
|||
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
|
||||
PyYAML>=3.1.0
|
||||
yamllint>=0.5.2
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash -xe
|
||||
|
||||
# Checks that reference/projects.yaml alphabetized and prints list of
|
||||
# projects that should be sorted.
|
||||
|
||||
export TMPDIR=$(mktemp -d tox.XXXXXX)
|
||||
trap "rm -rf $TMPDIR" EXIT
|
||||
|
||||
pushd $TMPDIR
|
||||
PROJECTS_LIST=$OLDPWD/reference/tsc/projects.yaml
|
||||
|
||||
grep '^[a-zA-Z0-9]' $PROJECTS_LIST > projects_list
|
||||
|
||||
LC_ALL=C sort --ignore-case projects_list -o projects_list.sorted
|
||||
|
||||
if ! diff projects_list projects_list.sorted > projects_list.diff; then
|
||||
echo "The following projects should be alphabetized: "
|
||||
cat projects_list.diff | grep -e '> '
|
||||
exit 1
|
||||
else
|
||||
echo "Projects alphabetized"
|
||||
fi
|
||||
|
||||
popd
|
5
tox.ini
5
tox.ini
|
@ -27,13 +27,14 @@ commands =
|
|||
\( -name .tox -prune \) \
|
||||
-o -type f -name '*.yaml' \
|
||||
-print0 | xargs -0 yamllint"
|
||||
{toxinidir}/tools/check_projects_yaml_alphabetized.sh
|
||||
flake8
|
||||
|
||||
[testenv:pep8]
|
||||
basepython = python3
|
||||
usedevelop = False
|
||||
skip_install = True
|
||||
deps = pep8
|
||||
commands = pep8
|
||||
commands = flake8
|
||||
|
||||
[testenv:venv]
|
||||
basepython = python3
|
||||
|
|
Loading…
Reference in New Issue