| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | from botocore.docs.bcdoc.restdoc import DocumentStructure |
| | from botocore.docs.method import document_model_driven_method |
| | from botocore.docs.paginator import document_paginate_method |
| | from botocore.docs.waiter import document_wait_method |
| |
|
| |
|
| | class LazyLoadedDocstring(str): |
| | """Used for lazily loading docstrings |
| | |
| | You can instantiate this class and assign it to a __doc__ value. |
| | The docstring will not be generated till accessed via __doc__ or |
| | help(). Note that all docstring classes **must** subclass from |
| | this class. It cannot be used directly as a docstring. |
| | """ |
| |
|
| | def __init__(self, *args, **kwargs): |
| | """ |
| | The args and kwargs are the same as the underlying document |
| | generation function. These just get proxied to the underlying |
| | function. |
| | """ |
| | super().__init__() |
| | self._gen_args = args |
| | self._gen_kwargs = kwargs |
| | self._docstring = None |
| |
|
| | def __new__(cls, *args, **kwargs): |
| | |
| | return super().__new__(cls) |
| |
|
| | def _write_docstring(self, *args, **kwargs): |
| | raise NotImplementedError( |
| | '_write_docstring is not implemented. Please subclass from ' |
| | 'this class and provide your own _write_docstring method' |
| | ) |
| |
|
| | def expandtabs(self, tabsize=8): |
| | """Expands tabs to spaces |
| | |
| | So this is a big hack in order to get lazy loaded docstring work |
| | for the ``help()``. In the ``help()`` function, ``pydoc`` and |
| | ``inspect`` are used. At some point the ``inspect.cleandoc`` |
| | method is called. To clean the docs ``expandtabs`` is called |
| | and that is where we override the method to generate and return the |
| | docstrings. |
| | """ |
| | if self._docstring is None: |
| | self._generate() |
| | return self._docstring.expandtabs(tabsize) |
| |
|
| | def __str__(self): |
| | return self._generate() |
| |
|
| | |
| | __repr__ = __str__ |
| |
|
| | def _generate(self): |
| | |
| | if self._docstring is None: |
| | self._docstring = self._create_docstring() |
| | return self._docstring |
| |
|
| | def _create_docstring(self): |
| | docstring_structure = DocumentStructure('docstring', target='html') |
| | |
| | |
| | self._write_docstring( |
| | docstring_structure, *self._gen_args, **self._gen_kwargs |
| | ) |
| | return docstring_structure.flush_structure().decode('utf-8') |
| |
|
| |
|
| | class ClientMethodDocstring(LazyLoadedDocstring): |
| | def _write_docstring(self, *args, **kwargs): |
| | document_model_driven_method(*args, **kwargs) |
| |
|
| |
|
| | class WaiterDocstring(LazyLoadedDocstring): |
| | def _write_docstring(self, *args, **kwargs): |
| | document_wait_method(*args, **kwargs) |
| |
|
| |
|
| | class PaginatorDocstring(LazyLoadedDocstring): |
| | def _write_docstring(self, *args, **kwargs): |
| | document_paginate_method(*args, **kwargs) |
| |
|