# Copyright 2015 ksyun.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You # may not use this file except in compliance with the License. A copy of # the License is located at # # http://www.apache.org/licenses/LICENSE-2.0 # # or in the "license" file accompanying this file. This file 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. from kscore.docs.shape import ShapeDocumenter from kscore.docs.utils import py_default class BaseExampleDocumenter(ShapeDocumenter): def document_example(self, section, shape, prefix=None, include=None, exclude=None): """Generates an example based on a shape :param section: The section to write the documentation to. :param shape: The shape of the operation. :param prefix: Anything to be included before the example :type include: Dictionary where keys are parameter names and values are the shapes of the parameter names. :param include: The parameter shapes to include in the documentation. :type exclude: List of the names of the parameters to exclude. :param exclude: The names of the parameters to exclude from documentation. """ history = [] section.style.new_line() section.style.start_codeblock() if prefix is not None: section.write(prefix) self.traverse_and_document_shape( section=section, shape=shape, history=history, include=include, exclude=exclude) def document_recursive_shape(self, section, shape, **kwargs): section.write('{\'... recursive ...\'}') def document_shape_default(self, section, shape, history, include=None, exclude=None, **kwargs): py_type = self._get_special_py_default(shape) if py_type is None: py_type = py_default(shape.type_name) if self._context.get('streaming_shape') == shape: py_type = 'StreamingBody()' section.write(py_type) def document_shape_type_string(self, section, shape, history, include=None, exclude=None, **kwargs): if 'enum' in shape.metadata: for i, enum in enumerate(shape.metadata['enum']): section.write('\'%s\'' % enum) if i < len(shape.metadata['enum']) - 1: section.write('|') else: self.document_shape_default(section, shape, history) def document_shape_type_list(self, section, shape, history, include=None, exclude=None, **kwargs): param_shape = shape.member list_section = section.add_new_section('list-value') self._start_nested_param(list_section, '[') param_section = list_section.add_new_section( 'member', context={'shape': param_shape.name}) self.traverse_and_document_shape( section=param_section, shape=param_shape, history=history) ending_comma_section = list_section.add_new_section('ending-comma') ending_comma_section.write(',') ending_bracket_section = list_section.add_new_section( 'ending-bracket') self._end_nested_param(ending_bracket_section, ']') def document_shape_type_structure(self, section, shape, history, include=None, exclude=None, **kwargs): section = section.add_new_section('structure-value') self._start_nested_param(section, '{') input_members = self._add_members_to_shape(shape.members, include) for i, param in enumerate(input_members): if exclude and param in exclude: continue param_section = section.add_new_section(param) param_section.write('\'%s\': ' % param) param_shape = input_members[param] param_value_section = param_section.add_new_section( 'member-value', context={'shape': param_shape.name}) self.traverse_and_document_shape( section=param_value_section, shape=param_shape, history=history, name=param) if i < len(input_members) - 1: ending_comma_section = param_section.add_new_section( 'ending-comma') ending_comma_section.write(',') ending_comma_section.style.new_line() self._end_structure(section, '{', '}') def document_shape_type_map(self, section, shape, history, include=None, exclude=None, **kwargs): map_section = section.add_new_section('map-value') self._start_nested_param(map_section, '{') value_shape = shape.value key_section = map_section.add_new_section( 'key', context={'shape': shape.key.name}) key_section.write('\'string\': ') value_section = map_section.add_new_section( 'value', context={'shape': value_shape.name}) self.traverse_and_document_shape( section=value_section, shape=value_shape, history=history) end_bracket_section = map_section.add_new_section('ending-bracket') self._end_nested_param(end_bracket_section, '}') def _add_members_to_shape(self, members, include): if include: members = members.copy() for param in include: members[param.name] = param return members def _start_nested_param(self, section, start=None): if start is not None: section.write(start) section.style.indent() section.style.indent() section.style.new_line() def _end_nested_param(self, section, end=None): section.style.dedent() section.style.dedent() section.style.new_line() if end is not None: section.write(end) def _end_structure(self, section, start, end): # If there are no members in the strucuture, then make sure the # start and the end bracket are on the same line, by removing all # previous text and writing the start and end. if not section.available_sections: section.clear_text() section.write(start + end) self._end_nested_param(section) else: end_bracket_section = section.add_new_section('ending-bracket') self._end_nested_param(end_bracket_section, end) class ResponseExampleDocumenter(BaseExampleDocumenter): EVENT_NAME = 'response-example' class RequestExampleDocumenter(BaseExampleDocumenter): EVENT_NAME = 'request-example' def document_shape_type_structure(self, section, shape, history, include=None, exclude=None, **kwargs): param_format = '\'%s\'' operator = ': ' start = '{' end = '}' if len(history) <= 1: operator = '=' start = '(' end = ')' param_format = '%s' section = section.add_new_section('structure-value') self._start_nested_param(section, start) input_members = self._add_members_to_shape(shape.members, include) for i, param in enumerate(input_members): if exclude and param in exclude: continue param_section = section.add_new_section(param) param_section.write(param_format % param) param_section.write(operator) param_shape = input_members[param] param_value_section = param_section.add_new_section( 'member-value', context={'shape': param_shape.name}) self.traverse_and_document_shape( section=param_value_section, shape=param_shape, history=history, name=param) if i < len(input_members) - 1: ending_comma_section = param_section.add_new_section( 'ending-comma') ending_comma_section.write(',') ending_comma_section.style.new_line() self._end_structure(section, start, end)