123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- # 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)
|