def get_paginator(self, operation_name):
        """Create a paginator for an operation.

        :type operation_name: string
        :param operation_name: The operation name.  This is the same name
            as the method name on the client.  For example, if the
            method name is ``create_foo``, and you'd normally invoke the
            operation as ``client.create_foo(**kwargs)``, if the
            ``create_foo`` operation can be paginated, you can use the
            call ``client.get_paginator("create_foo")``.

        :raise OperationNotPageableError: Raised if the operation is not
            pageable.  You can use the ``client.can_paginate`` method to
            check if an operation is pageable.

        :rtype: L{botocore.paginate.Paginator}
        :return: A paginator object.

        """
        if not self.can_paginate(operation_name):
            raise OperationNotPageableError(operation_name=operation_name)
        else:
            actual_operation_name = self._PY_TO_OP_NAME[operation_name]

            # Create a new paginate method that will serve as a proxy to
            # the underlying Paginator.paginate method. This is needed to
            # attach a docstring to the method.
            def paginate(self, **kwargs):
                return Paginator.paginate(self, **kwargs)

            paginator_config = self._cache['page_config'][
                actual_operation_name]
            # Add the docstring for the paginate method.
            paginate.__doc__ = PaginatorDocstring(
                paginator_name=actual_operation_name,
                event_emitter=self.meta.events,
                service_model=self.meta.service_model,
                paginator_config=paginator_config,
                include_signature=False)

            # Rename the paginator class based on the type of paginator.
            paginator_class_name = str(
                '%s.Paginator.%s' % (get_service_module_name(
                    self.meta.service_model), actual_operation_name))

            # Create the new paginator class
            documented_paginator_cls = type(paginator_class_name,
                                            (Paginator, ),
                                            {'paginate': paginate})

            operation_model = self._service_model.operation_model(
                actual_operation_name)
            paginator = documented_paginator_cls(getattr(self, operation_name),
                                                 paginator_config,
                                                 operation_model)
            return paginator
Beispiel #2
0
 def test_use_correct_docstring_writer(self):
     with mock.patch('botocore.docs.docstring'
                     '.document_paginate_method') as mock_writer:
         docstring = PaginatorDocstring()
         str(docstring)
         self.assertTrue(mock_writer.called)