| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| from botocore.docs.shape import ShapeDocumenter |
| from botocore.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, |
| ) |
| final_blank_line_section = section.add_new_section('final-blank-line') |
| final_blank_line_section.style.new_line() |
|
|
| 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 |
| ): |
| if not shape.members: |
| section.write('{}') |
| return |
|
|
| 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 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' |
|
|
| def document_shape_type_event_stream( |
| self, section, shape, history, **kwargs |
| ): |
| section.write('EventStream(') |
| self.document_shape_type_structure(section, shape, history, **kwargs) |
| end_section = section.add_new_section('event-stream-end') |
| end_section.write(')') |
|
|
|
|
| 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) |
|
|