interop/tools/jsonToRst.py
Mark T. Voelker c8138d4fa5 Add pep8/flake8 checks, fix flake8 errors
We're starting to accumulate a number of python scripts in
various parts of the tree, and probably will continue to do so.
To make maintenance easier over time, we should have basic
pep8/flake8 checks in place for python code, as is best practice
elsewhere in the OpenStack project.  This patch adds basic checks
and corrects existing errors in our python scripts so that going
forward we can opt to gate on clean python code.

Change-Id: Ie32ee7a14ee608e12f42288e137a0849555b5ed8
2015-08-18 12:18:01 +00:00

185 lines
5.2 KiB
Python
Executable File

#!/usr/bin/env python
#
# Copyright 2015 Alexander Hirschfeld
#
# 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.
#
# This was build for python 2.7, The print statements are failing with
# Python 3.X
import json
import sys
import textwrap
def printHelpArrays(input):
if(len(input) == 0):
return 'None'
output = ""
for i in input:
output = output + i.capitalize() + ', '
return output[0:-2]
wrapper = textwrap.TextWrapper(width=79, subsequent_indent=' ')
inFileName = "NONE"
for potentialFile in sys.argv:
if ".json" in potentialFile:
inFileName = potentialFile
if inFileName is "NONE":
print "Please pass the JSON file"
sys.exit(1)
print "reading from", inFileName
with open(inFileName) as f:
data = json.load(f)
if not isinstance(data, dict):
print 'Make sure this is a valid file'
sys.exit(1)
outFileName = 'doc/source/guidelines/' + inFileName.replace("json", "rst")
print "writing to", outFileName
# intro
with open(outFileName, "w") as outFile:
if data.get('id') is None:
print 'Make sure there is a valid id'
sys.exit(1)
line01 = "OpenStack DefCore %s" % data["id"]
outFile.write('=' * len(line01) + '\n')
outFile.write(line01 + '\n')
outFile.write('=' * len(line01) + '\n')
# Nonlooping
if data.get('platform') is None:
print "The platform section is not found"
sys.exit(1)
# Correct Source
if data.get('source') != \
'http://git.openstack.org/cgit/openstack/defcore/':
print "The expected DefCore source not found"
sys.exit(1)
outFile.write("""
:Status: {status}
:Replaces: {replaces}
:JSON Master: http://git.openstack.org/cgit/openstack/defcore/tree/{id}.json
This document outlines the mandatory capabilities and designated
sections required to exist in a software installation in order to
be eligible to use marks controlled by the OpenStack Foundation.
This document was generated from the `master JSON version <{id}.json>`_.
Releases Covered
==============================
Applies to {releases}
Platform Components
==============================
:Required: {platformRequired}
:Advisory: {platformAdvisory}
:Deprecated: {platformDepric}
:Removed: {platformRemoved}
""".format(status=data.get("status"),
replaces=data.get("replaces"),
id=data.get("id"),
releases=printHelpArrays(data.get("releases")),
platformRequired=printHelpArrays(data["platform"].get("required")),
platformAdvisory=printHelpArrays(data["platform"].get("advisory")),
platformDepric=printHelpArrays(data["platform"].get("deprecated")),
platformRemoved=printHelpArrays(data["platform"].get("removed"))))
# looping
if data.get('components') is None:
print "No components found"
sys.exit(1)
components = sorted(data["components"].keys())
order = ["required", "advisory", "deprecated", "removed"]
for component in components:
outFile.write("""
{component} Component Capabilities
""".format(component=component.capitalize()))
outFile.write('=' * (len(component) + 23)) # footer
for event in order:
outFile.write("\n{event} Capabilities\n".format(
event=event.capitalize()))
outFile.write("-" * (len(event) + 15) + "\n")
if(len(data['components'][component][event]) == 0):
outFile.write("None\n")
for req in data['components'][component][event]:
outFile.write("* {name} ({project})\n".format(
name=req,
project=data["capabilities"][req].get(
"project").capitalize()))
# Designated -Sections
if 'designated-sections' not in data:
print "designated-sections not in json file"
sys.exit(1)
outFile.write("""
Designated Sections
=====================================
The following designated sections apply to the same releases as
this specification.""")
order = ['required', 'advisory', 'deprecated', 'removed']
desig = data.get("designated-sections")
for event in order:
outFile.write('\n\n{event} Designated Sections\n'.format(
event=event.capitalize()))
# +20 is for length of header
outFile.write('-' * (len(event) + 20) + '\n\n')
names = sorted(desig[event].keys())
if len(names) is 0:
outFile.write('None')
outlines = []
for name in names:
outlines.append(
wrapper.fill(
"* {name} : {guide}".format(
name=name.capitalize(),
guide=desig[event][name].get('guidance'))))
outFile.write("\n".join(outlines))
outFile.write('\n')