diff --git a/README.rst b/README.rst index e27acfda3f..bcf09ee9ea 100644 --- a/README.rst +++ b/README.rst @@ -315,6 +315,9 @@ that deliverable. For each deliverable, we need to track: * the version number to use * highlights for the release notes email (optional) +* cycle highlights that will be published to + ``releases.openstack.org/$SERIES/highlights.html`` (optional, and for + cycle_with_intermediary amd cycle_with_milestone projects only) * the starting points of all branches We track this metadata for the history of all releases of the @@ -370,7 +373,7 @@ The top level of a deliverable file is a mapping with keys: ``artifact-link-mode`` Describe how to link to artifacts produced by the project. The - default is ``tarball`. Valid values are: + default is ``tarball``. Valid values are: tarball Automatically generates links to version-specific files on @@ -380,8 +383,8 @@ The top level of a deliverable file is a mapping with keys: Do not link to anything, just show the version number. ``repository-settings`` - Mapping of special settings to control the behavior for each repository, keyed - by the repository name. + Mapping of special settings to control the behavior for each repository, + keyed by the repository name. ``flags`` A list of flags attached to the repository. @@ -460,6 +463,11 @@ The top level of a deliverable file is a mapping with keys: Stable branch names track upstream release names, rather than OpenStack series names. +``cycle-highlights`` + RST formatted notes of some of the top new features or changes you would like + to point out for this release cycle. These highlights are compiled per team + and published to ``releases.openstack.org/$SERIES/highlights.html``. + ``branches`` A list of the branches for the deliverable. diff --git a/doc/source/queens/highlights.rst b/doc/source/queens/highlights.rst new file mode 100644 index 0000000000..c6e5dca7c1 --- /dev/null +++ b/doc/source/queens/highlights.rst @@ -0,0 +1,7 @@ +========================= +Queens Release Highlights +========================= + +.. serieshighlights:: + :series: queens + diff --git a/doc/source/queens/index.rst b/doc/source/queens/index.rst index 8a5e00b261..9e43c8536b 100644 --- a/doc/source/queens/index.rst +++ b/doc/source/queens/index.rst @@ -9,6 +9,11 @@ Projected Release Date: 28 February 2018 schedule +.. toctree:: + :hidden: + + highlights .. deliverable:: :series: queens + diff --git a/openstack_releases/schema.yaml b/openstack_releases/schema.yaml index 917cec28e5..0ccf8e0b4b 100644 --- a/openstack_releases/schema.yaml +++ b/openstack_releases/schema.yaml @@ -40,6 +40,8 @@ properties: stable-branch-type: type: "string" enum: [ "std", "tagless", "upstream" ] + cycle-highlights: + type: "string" releases: type: "array" items: diff --git a/openstack_releases/sphinxext.py b/openstack_releases/sphinxext.py index 115d86a315..f370a7f6ef 100644 --- a/openstack_releases/sphinxext.py +++ b/openstack_releases/sphinxext.py @@ -380,10 +380,65 @@ def _generate_team_pages(app): return +class HighlightsDirective(rst.Directive): + """Directive to pull series highlights into docs output.""" + + option_spec = { + 'series': directives.unchanged, + } + + def _get_deliverable_highlights(self, series): + """Collects the highlights for the series. + + :param series: The series to extract highlights from. + :returns: The available highlights for the series. + """ + series_highlights = {} + series_deliverables = _deliverables.get_deliverables(None, series) + for deliv in series_deliverables: + series_info = deliv[3] + highlights = series_info.get('cycle-highlights') + if highlights: + # Add highlights to any existing notes already collected + notes = series_highlights.get(series_info['team']) + series_highlights[series_info['team']] = '{}{}\n\n'.format( + notes, highlights) + + return series_highlights + + def run(self): + env = self.state.document.settings.env + app = env.app + + # Get the series we are reporting on + series = self.options.get('series') + if not series: + raise self.error('series value must be set to a valid cycle name.') + + result = ViewList() + series_highlights = self._get_deliverable_highlights(series) + source_name = '<{}>'.format(__name__) + + for team in series_highlights.keys(): + app.info('[highlights] rendering %s highlights for %s' % + (team.title(), series)) + + result.append(team.title(), source_name) + result.append('-' * len(team), source_name) + result.append(series_highlights[team], source_name) + result.append('', source_name) + + node = nodes.section() + node.document = self.state.document + nested_parse_with_titles(self.state, result, node) + return node.children + + def setup(app): _initialize_deliverable_data(app) app.add_directive('deliverable', DeliverableDirective) app.add_directive('independent-deliverables', IndependentDeliverablesDirective) app.add_directive('team', TeamDirective) + app.add_directive('serieshighlights', HighlightsDirective) _generate_team_pages(app)