diff options
Diffstat (limited to 'placement-api-ref/ext/validator.py')
-rw-r--r-- | placement-api-ref/ext/validator.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/placement-api-ref/ext/validator.py b/placement-api-ref/ext/validator.py new file mode 100644 index 0000000000..44a4cef36a --- /dev/null +++ b/placement-api-ref/ext/validator.py @@ -0,0 +1,68 @@ +# 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. +"""Test to see if docs exists for routes and methods in the placement API.""" + +import os + +from nova.api.openstack.placement import handler + +# A humane ordering of HTTP methods for sorted output. +ORDERED_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] +DEPRECATED_METHODS = [('POST', '/resource_providers/{uuid}/inventories')] + + +def _header_line(map_entry): + method, route = map_entry + line = '.. rest_method:: %s %s' % (method, route) + return line + + +def inspect_doc(app): + """Load up doc_files and see if any routes are missing. + + The routes are defined in handler.ROUTE_DECLARATIONS. + """ + doc_files = [os.path.join(app.srcdir, file) + for file in os.listdir(app.srcdir) if file.endswith(".inc")] + + routes = [] + for route in sorted(handler.ROUTE_DECLARATIONS, key=len): + # Skip over the '' route. + if route: + for method in ORDERED_METHODS: + if method in handler.ROUTE_DECLARATIONS[route]: + routes.append((method, route)) + + header_lines = [] + for map_entry in routes: + if map_entry not in DEPRECATED_METHODS: + header_lines.append(_header_line(map_entry)) + + content_lines = [] + for doc_file in doc_files: + with open(doc_file) as doc_fh: + content_lines.extend(doc_fh.read().splitlines()) + + missing_lines = [] + for line in header_lines: + if line not in content_lines: + missing_lines.append(line) + + if missing_lines: + msg = ['Documentation likely missing for the following routes:', ''] + for line in missing_lines: + msg.append(line) + raise ValueError('\n'.join(msg)) + + +def setup(app): + app.connect('builder-inited', inspect_doc) |