Ejemplo n.º 1
0
def test_docs_generated():
    """Verify we can generate the appropriate docs for all services"""
    botocore_session = botocore.session.get_session()
    session = boto3.Session()
    for service_name in session.get_available_services():
        generated_docs = ServiceDocumenter(service_name).document_service()
        generated_docs = generated_docs.decode('utf-8')
        client = boto3.client(service_name, 'us-east-1')

        # Check that all services have the client documented.
        yield (_assert_has_client_documentation, generated_docs, service_name,
               client)

        # If the client can paginate, make sure the paginators are documented.
        try:
            paginator_model = botocore_session.get_paginator_model(
                service_name)
            yield (_assert_has_paginator_documentation, generated_docs,
                   service_name, client,
                   sorted(paginator_model._paginator_config))
        except DataNotFoundError:
            pass

        # If the client has waiters, make sure the waiters are documented
        if client.waiter_names:
            yield (_assert_has_waiter_documentation, generated_docs,
                   service_name, client)

        # If the service has resources, make sure the service resource
        # is at least documented.
        if service_name in session.get_available_resources():
            resource = boto3.resource(service_name, 'us-east-1')
            yield (_assert_has_resource_documentation, generated_docs,
                   service_name, resource)
Ejemplo n.º 2
0
def test_docs_generated():
    """Verify we can generate the appropriate docs for all services"""
    botocore_session = botocore.session.get_session()
    session = boto3.Session()
    for service_name in session.get_available_services():
        generated_docs = ServiceDocumenter(service_name).document_service()
        generated_docs = generated_docs.decode('utf-8')
        client = boto3.client(service_name, 'us-east-1')

        # Check that all services have the client documented.
        yield (_assert_has_client_documentation, generated_docs, service_name,
               client)

        # If the client can paginate, make sure the paginators are documented.
        try:
            paginator_model = botocore_session.get_paginator_model(
                service_name)
            yield (_assert_has_paginator_documentation, generated_docs,
                   service_name, client,
                   sorted(paginator_model._paginator_config))
        except DataNotFoundError:
            pass

        # If the client has waiters, make sure the waiters are documented
        if client.waiter_names:
            yield (_assert_has_waiter_documentation, generated_docs,
                   service_name, client)

        # If the service has resources, make sure the service resource
        # is at least documented.
        if service_name in session.get_available_resources():
            resource = boto3.resource(service_name, 'us-east-1')
            yield (_assert_has_resource_documentation, generated_docs,
                   service_name, resource)
Ejemplo n.º 3
0
def test_documentation(boto3_session, botocore_session, available_resources,
                       service_name):
    generated_docs = ServiceDocumenter(
        service_name, session=boto3_session).document_service()
    generated_docs = generated_docs.decode('utf-8')
    client = boto3.client(service_name, 'us-east-1')

    # Check that all of the services have the appropriate title
    _assert_has_title(generated_docs, client)

    # Check that all services have the client documented.
    _assert_has_client_documentation(generated_docs, service_name, client)

    # If the service has resources, make sure the service resource
    # is at least documented.
    if service_name in available_resources:

        resource = boto3.resource(service_name, 'us-east-1')
        _assert_has_resource_documentation(generated_docs, service_name,
                                           resource)

    # If the client can paginate, make sure the paginators are documented.
    try:
        paginator_model = botocore_session.get_paginator_model(service_name)
        _assert_has_paginator_documentation(
            generated_docs, service_name, client,
            sorted(paginator_model._paginator_config))
    except DataNotFoundError:
        pass

    # If the client has waiters, make sure the waiters are documented.
    if client.waiter_names:
        waiter_model = botocore_session.get_waiter_model(service_name)
        _assert_has_waiter_documentation(generated_docs, service_name, client,
                                         waiter_model)
Ejemplo n.º 4
0
 def test_document_service_no_waiter(self):
     # Delete the resource model so that the resource is not documented
     # as it may try to look at the waiter model during documentation.
     os.remove(self.resource_model_file)
     os.remove(self.waiter_model_file)
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     assert 'Waiters' not in contents
Ejemplo n.º 5
0
 def test_injects_examples_when_found(self):
     examples_path = os.sep.join(
         [os.path.dirname(__file__), '..', 'data', 'examples'])
     service_documenter = ServiceDocumenter('myservice', self.session)
     service_documenter.EXAMPLE_PATH = examples_path
     contents = service_documenter.document_service().decode('utf-8')
     assert 'This is an example' in contents
     assert 'This is for another service' not in contents
Ejemplo n.º 6
0
 def test_document_service_no_paginators(self):
     # Delete the resource model so that the resource is not documented
     # as it may try to look at the paginator model during documentation.
     os.remove(self.resource_model_file)
     os.remove(self.paginator_model_file)
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     self.assertNotIn('Paginators', contents)
Ejemplo n.º 7
0
 def test_document_service_no_paginators(self):
     # Delete the resource model so that the resource is not documented
     # as it may try to look at the paginator model during documentation.
     os.remove(self.resource_model_file)
     os.remove(self.paginator_model_file)
     service_documenter = ServiceDocumenter('myservice')
     contents = service_documenter.document_service().decode('utf-8')
     self.assertNotIn('Paginators', contents)
Ejemplo n.º 8
0
 def test_document_service_no_waiter(self):
     # Delete the resource model so that the resource is not documented
     # as it may try to look at the waiter model during documentation.
     os.remove(self.resource_model_file)
     os.remove(self.waiter_model_file)
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     self.assertNotIn('Waiters', contents)
Ejemplo n.º 9
0
 def test_creates_correct_path_to_examples_based_on_service_name(self):
     path = os.sep.join(
         [os.path.dirname(boto3.__file__), 'examples', 'myservice.rst'])
     path = os.path.realpath(path)
     with mock.patch('os.path.isfile') as isfile:
         isfile.return_value = False
         s = ServiceDocumenter('myservice', self.session)
         s.document_service()
         assert isfile.call_args_list[-1] == mock.call(path)
Ejemplo n.º 10
0
 def test_injects_examples_when_found(self):
     examples_path = os.sep.join([os.path.dirname(__file__), '..', 'data',
                                  'examples'])
     service_documenter = ServiceDocumenter(
         'myservice', self.session)
     service_documenter.EXAMPLE_PATH = examples_path
     contents = service_documenter.document_service().decode('utf-8')
     self.assertIn('This is an example', contents)
     self.assertNotIn('This is for another service', contents)
Ejemplo n.º 11
0
 def test_creates_correct_path_to_examples_based_on_service_name(self):
     path = os.sep.join([os.path.dirname(boto3.__file__),
                         'examples', 'myservice.rst'])
     path = os.path.realpath(path)
     with mock.patch('os.path.isfile') as isfile:
         isfile.return_value = False
         s = ServiceDocumenter('myservice', self.session)
         s.document_service()
         self.assertEqual(
             isfile.call_args_list[-1],
             mock.call(path))
Ejemplo n.º 12
0
 def test_creates_correct_path_to_examples_based_on_service_name(self):
     path = os.sep.join([
         os.path.dirname(boto3.__file__), 'boto3', 'examples',
         'myservice.rst'
     ])
     path = os.path.realpath(path)
     with mock.patch('os.path.isfile') as patch:
         ServiceDocumenter('myservice', self.session)
         patch.assert_has_call_with(path)
Ejemplo n.º 13
0
class TestS3Customizations(BaseDocsFunctionalTests):
    def setUp(self):
        self.documenter = ServiceDocumenter('s3')
        self.generated_contents = self.documenter.document_service()
        self.generated_contents = self.generated_contents.decode('utf-8')

    def test_file_transfer_methods_are_documented(self):
        self.assert_contains_lines_in_order([
            '.. py:class:: S3.Client', '  *   :py:meth:`download_file`',
            '  *   :py:meth:`upload_file`', '  .. py:method:: download_file(',
            '  .. py:method:: upload_file('
        ], self.generated_contents)
Ejemplo n.º 14
0
class TestS3Customizations(BaseDocsFunctionalTests):
    def setUp(self):
        self.documenter = ServiceDocumenter('s3')
        self.generated_contents = self.documenter.document_service()
        self.generated_contents = self.generated_contents.decode('utf-8')

    def test_file_transfer_methods_are_documented(self):
        self.assert_contains_lines_in_order([
            '.. py:class:: S3.Client',
            '  *   :py:meth:`download_file`',
            '  *   :py:meth:`upload_file`',
            '  .. py:method:: download_file(',
            '  .. py:method:: upload_file('],
            self.generated_contents
        )
Ejemplo n.º 15
0
class TestInstanceDeleteTags(BaseDocsFunctionalTests):
    def setUp(self):
        self.documenter = ServiceDocumenter(
            'ec2', session=Session(region_name='us-east-1'))
        self.generated_contents = self.documenter.document_service()
        self.generated_contents = self.generated_contents.decode('utf-8')

    def test_delete_tags_method_is_documented(self):
        contents = self.get_class_document_block(
                'EC2.Instance', self.generated_contents)
        method_contents = self.get_method_document_block(
                'delete_tags', contents)
        self.assert_contains_lines_in_order([
            'response = instance.delete_tags(',
            'DryRun=True|False,',
            'Tags=[',
        ], method_contents)
Ejemplo n.º 16
0
def generate_docs(root_dir, session):
    """Generates the reference documentation for botocore

    This will go through every available AWS service and output ReSTructured
    text files documenting each service.

    :param root_dir: The directory to write the reference files to. Each
        service's reference documentation is loacated at
        root_dir/reference/services/service-name.rst

    :param session: The boto3 session
    """
    services_doc_path = os.path.join(root_dir, 'reference', 'services')
    if not os.path.exists(services_doc_path):
        os.makedirs(services_doc_path)

    for service_name in session.get_available_services():
        docs = ServiceDocumenter(service_name, session).document_service()
        service_doc_path = os.path.join(services_doc_path,
                                        service_name + '.rst')
        with open(service_doc_path, 'wb') as f:
            f.write(docs)
Ejemplo n.º 17
0
 def test_document_service(self):
     service_documenter = ServiceDocumenter("myservice", self.session)
     contents = service_documenter.document_service().decode("utf-8")
     lines = [
         "*********",
         "MyService",
         "*********",
         ".. contents:: Table of Contents",
         "   :depth: 2",
         "======",
         "Client",
         "======",
         ".. py:class:: MyService.Client",
         "  These are the available methods:",
         "  *   :py:meth:`sample_operation`",
         "==========",
         "Paginators",
         "==========",
         "The available paginators are:",
         "* :py:class:`MyService.Paginator.SampleOperation`",
         ".. py:class:: MyService.Paginator.SampleOperation",
         "  .. py:method:: paginate(**kwargs)",
         "=======",
         "Waiters",
         "=======",
         "The available waiters are:",
         "* :py:class:`MyService.Waiter.SampleOperationComplete`",
         ".. py:class:: MyService.Waiter.SampleOperationComplete",
         "  .. py:method:: wait(**kwargs)",
         "================",
         "Service Resource",
         "================",
         ".. py:class:: MyService.ServiceResource()",
         "  These are the resource's available actions:",
         "  *   :py:meth:`sample_operation()`",
         "  These are the resource's available sub-resources:",
         "  *   :py:meth:`Sample()`",
         "  These are the resource's available collections:",
         "  *   :py:attr:`samples`",
         "  .. py:method:: sample_operation(**kwargs)",
         "  .. py:method:: Sample(name)",
         "  .. py:attribute:: samples",
         "    .. py:method:: all()",
         "    .. py:method:: filter(**kwargs)",
         "    .. py:method:: limit(**kwargs)",
         "    .. py:method:: page_size(**kwargs)",
         "======",
         "Sample",
         "======",
         ".. py:class:: MyService.Sample(name)",
         "  These are the resource's available identifiers:",
         "  *   :py:attr:`name`",
         "  These are the resource's available attributes:",
         "  *   :py:attr:`bar`",
         "  *   :py:attr:`foo`",
         "  These are the resource's available actions:",
         "  *   :py:meth:`load()`",
         "  *   :py:meth:`operate()`",
         "  *   :py:meth:`reload()`",
         "  These are the resource's available waiters:",
         "  *   :py:meth:`wait_until_complete()`",
         "  .. py:attribute:: name",
         "  .. py:attribute:: bar",
         "  .. py:attribute:: foo",
         "  .. py:method:: load()",
         "  .. py:method:: operate(**kwargs)",
         "  .. py:method:: reload()",
         "  .. py:method:: wait_until_complete(**kwargs)",
     ]
     self.assert_contains_lines_in_order(lines, contents)
Ejemplo n.º 18
0
 def test_document_service_no_resource(self):
     os.remove(self.resource_model_file)
     service_documenter = ServiceDocumenter("myservice", self.session)
     contents = service_documenter.document_service().decode("utf-8")
     self.assertNotIn("Service Resource", contents)
Ejemplo n.º 19
0
 def setUp(self):
     self.documenter = ServiceDocumenter('dynamodb')
     self.generated_contents = self.documenter.document_service()
     self.generated_contents = self.generated_contents.decode('utf-8')
Ejemplo n.º 20
0
 def setUp(self):
     self.documenter = ServiceDocumenter(
         'dynamodb', session=Session(region_name='us-east-1'))
     self.generated_contents = self.documenter.document_service()
     self.generated_contents = self.generated_contents.decode('utf-8')
Ejemplo n.º 21
0
class TestDynamoDBCustomizations(BaseDocsFunctionalTests):
    def setUp(self):
        self.documenter = ServiceDocumenter(
            'dynamodb', session=Session(region_name='us-east-1'))
        self.generated_contents = self.documenter.document_service()
        self.generated_contents = self.generated_contents.decode('utf-8')

    def test_batch_writer_is_documented(self):
        self.assert_contains_lines_in_order([
            '.. py:class:: DynamoDB.Table(name)',
            '  *   :py:meth:`batch_writer()`',
            '  .. py:method:: batch_writer()'
        ], self.generated_contents)

    def test_document_interface_is_documented(self):
        contents = self.get_class_document_block('DynamoDB.Table',
                                                 self.generated_contents)

        # Take an arbitrary method that uses the customization.
        method_contents = self.get_method_document_block('put_item', contents)

        # Make sure the request syntax is as expected.
        request_syntax_contents = self.get_request_syntax_document_block(
            method_contents)
        self.assert_contains_lines_in_order([
            'response = table.put_item(', 'Item={',
            ('\'string\': \'string\'|123|Binary(b\'bytes\')'
             '|True|None|set([\'string\'])|set([123])|'
             'set([Binary(b\'bytes\')])|[]|{}'), '},', 'Expected={',
            '\'string\': {',
            ('\'Value\': \'string\'|123'
             '|Binary(b\'bytes\')|True|None|set([\'string\'])'
             '|set([123])|set([Binary(b\'bytes\')])|[]|{},'),
            '\'AttributeValueList\': [',
            ('\'string\'|123|Binary(b\'bytes\')'
             '|True|None|set([\'string\'])|set([123])|'
             'set([Binary(b\'bytes\')])|[]|{},')
        ], request_syntax_contents)

        # Make sure the response syntax is as expected.
        response_syntax_contents = self.get_response_syntax_document_block(
            method_contents)
        self.assert_contains_lines_in_order([
            '{', '\'Attributes\': {',
            ('\'string\': \'string\'|123|'
             'Binary(b\'bytes\')|True|None|set([\'string\'])|'
             'set([123])|set([Binary(b\'bytes\')])|[]|{}'), '},'
        ], response_syntax_contents)

        # Make sure the request parameter is documented correctly.
        request_param_contents = self.get_request_parameter_document_block(
            'Item', method_contents)
        self.assert_contains_lines_in_order([
            ':type Item: dict', ':param Item: **[REQUIRED]**',
            '- *(string) --*',
            ('- *(valid DynamoDB type) --* - The value of the '
             'attribute. The valid value types are listed in the '
             ':ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`.')
        ], request_param_contents)

        # Make sure the response parameter is documented correctly.
        response_param_contents = self.get_response_parameter_document_block(
            'Attributes', method_contents)
        self.assert_contains_lines_in_order([
            '- **Attributes** *(dict) --*', '- *(string) --*',
            ('- *(valid DynamoDB type) --* - The value of '
             'the attribute. The valid value types are listed in the '
             ':ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`.')
        ], response_param_contents)

    def test_conditions_is_documented(self):
        contents = self.get_class_document_block('DynamoDB.Table',
                                                 self.generated_contents)

        # Take an arbitrary method that uses the customization.
        method_contents = self.get_method_document_block('query', contents)

        # Make sure the request syntax is as expected.
        request_syntax_contents = self.get_request_syntax_document_block(
            method_contents)
        self.assert_contains_lines_in_order([
            'response = table.query(',
            ('FilterExpression=Attr(\'myattribute\').'
             'eq(\'myvalue\'),'),
            ('KeyConditionExpression=Key(\'mykey\')'
             '.eq(\'myvalue\'),')
        ], request_syntax_contents)

        # Make sure the request parameter is documented correctly.
        self.assert_contains_lines_in_order(
            [(':type FilterExpression: condition from '
              ':py:class:`boto3.dynamodb.conditions.Attr` method'),
             (':param FilterExpression: The condition(s) an '
              'attribute(s) must meet. Valid conditions are listed in '
              'the :ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`.'),
             (':type KeyConditionExpression: condition from '
              ':py:class:`boto3.dynamodb.conditions.Key` method'),
             (':param KeyConditionExpression: The condition(s) a '
              'key(s) must meet. Valid conditions are listed in the '
              ':ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`.')],
            method_contents)
Ejemplo n.º 22
0
 def test_document_service(self):
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     lines = [
         '*********',
         'MyService',
         '*********',
         '.. contents:: Table of Contents',
         '   :depth: 2',
         '======',
         'Client',
         '======',
         '.. py:class:: MyService.Client',
         '  These are the available methods:',
         '  *   :py:meth:`sample_operation`',
         '==========',
         'Paginators',
         '==========',
         'The available paginators are:',
         '* :py:class:`MyService.Paginator.SampleOperation`',
         '.. py:class:: MyService.Paginator.SampleOperation',
         '  .. py:method:: paginate(**kwargs)',
         '=======',
         'Waiters',
         '=======',
         'The available waiters are:',
         '* :py:class:`MyService.Waiter.SampleOperationComplete`',
         '.. py:class:: MyService.Waiter.SampleOperationComplete',
         '  .. py:method:: wait(**kwargs)',
         '================',
         'Service Resource',
         '================',
         '.. py:class:: MyService.ServiceResource()',
         "  These are the resource's available actions:",
         '  *   :py:meth:`sample_operation()`',
         "  These are the resource's available sub-resources:",
         '  *   :py:meth:`Sample()`',
         "  These are the resource's available collections:",
         '  *   :py:attr:`samples`',
         '  .. py:method:: sample_operation(**kwargs)',
         '  .. py:method:: Sample(name)',
         '  .. py:attribute:: samples',
         '    .. py:method:: all()',
         '    .. py:method:: filter(**kwargs)',
         '    .. py:method:: limit(**kwargs)',
         '    .. py:method:: page_size(**kwargs)',
         '======',
         'Sample',
         '======',
         '.. py:class:: MyService.Sample(name)',
         "  These are the resource's available identifiers:",
         '  *   :py:attr:`name`',
         "  These are the resource's available attributes:",
         '  *   :py:attr:`bar`',
         '  *   :py:attr:`foo`',
         "  These are the resource's available actions:",
         '  *   :py:meth:`load()`',
         '  *   :py:meth:`operate()`',
         '  *   :py:meth:`reload()`',
         "  These are the resource's available waiters:",
         '  *   :py:meth:`wait_until_complete()`',
         '  .. py:attribute:: name',
         '  .. py:attribute:: bar',
         '  .. py:attribute:: foo',
         '  .. py:method:: load()',
         '  .. py:method:: operate(**kwargs)',
         '  .. py:method:: reload()',
         '  .. py:method:: wait_until_complete(**kwargs)',
     ]
     self.assert_contains_lines_in_order(lines, contents)
Ejemplo n.º 23
0
 def test_document_service_no_resource(self):
     os.remove(self.resource_model_file)
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     self.assertNotIn('Service Resource', contents)
Ejemplo n.º 24
0
 def setUp(self):
     self.documenter = ServiceDocumenter('dynamodb')
     self.generated_contents = self.documenter.document_service()
     self.generated_contents = self.generated_contents.decode('utf-8')
Ejemplo n.º 25
0
class TestDynamoDBCustomizations(BaseDocsFunctionalTests):
    def setUp(self):
        self.documenter = ServiceDocumenter('dynamodb')
        self.generated_contents = self.documenter.document_service()
        self.generated_contents = self.generated_contents.decode('utf-8')

    def test_batch_writer_is_documented(self):
        self.assert_contains_lines_in_order([
            '.. py:class:: DynamoDB.Table(name)',
            '  *   :py:meth:`batch_writer()`',
            '  .. py:method:: batch_writer()'],
            self.generated_contents
        )

    def test_document_interface_is_documented(self):
        contents = self.get_class_document_block(
            'DynamoDB.Table', self.generated_contents)

        # Take an arbitrary method that uses the customization.
        method_contents = self.get_method_document_block('put_item', contents)

        # Make sure the request syntax is as expected.
        request_syntax_contents = self.get_request_syntax_document_block(
            method_contents)
        self.assert_contains_lines_in_order([
            '        response = table.put_item(',
            '            Item={',
            ('                \'string\': \'string\'|123|Binary(b\'bytes\')'
             '|True|None|set([\'string\'])|set([123])|'
             'set([Binary(b\'bytes\')])|[]|{}'),
            '            },',
            '            Expected={',
            '                \'string\': {',
            ('                    \'Value\': \'string\'|123'
             '|Binary(b\'bytes\')|True|None|set([\'string\'])'
             '|set([123])|set([Binary(b\'bytes\')])|[]|{},'),
            '                    \'AttributeValueList\': [',
            ('                        \'string\'|123|Binary(b\'bytes\')'
             '|True|None|set([\'string\'])|set([123])|'
             'set([Binary(b\'bytes\')])|[]|{},')],
            request_syntax_contents)

        # Make sure the response syntax is as expected.
        response_syntax_contents = self.get_response_syntax_document_block(
            method_contents)
        self.assert_contains_lines_in_order([
            '          {',
            '              \'Attributes\': {',
            ('                  \'string\': \'string\'|123|'
             'Binary(b\'bytes\')|True|None|set([\'string\'])|'
             'set([123])|set([Binary(b\'bytes\')])|[]|{}'),
            '              },'],
            response_syntax_contents)

        # Make sure the request parameter is documented correctly.
        request_param_contents = self.get_request_parameter_document_block(
            'Item', method_contents)
        self.assert_contains_lines_in_order([
            '    :type Item: dict',
            '    :param Item: **[REQUIRED]**',
            '        - *(string) --*',
            ('          - *(valid DynamoDB type) --* - The value of the '
             'attribute. The valid value types are listed in the '
             ':ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`.')],
            request_param_contents
        )

        # Make sure the response parameter is documented correctly.
        response_param_contents = self.get_response_parameter_document_block(
            'Attributes', method_contents)
        self.assert_contains_lines_in_order([
            '          - **Attributes** *(dict) --*',
            '            - *(string) --*',
            ('              - *(valid DynamoDB type) --* - The value of '
             'the attribute. The valid value types are listed in the '
             ':ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`.')],
            response_param_contents)

    def test_conditions_is_documented(self):
        contents = self.get_class_document_block(
            'DynamoDB.Table', self.generated_contents)

        # Take an arbitrary method that uses the customization.
        method_contents = self.get_method_document_block('query', contents)

        # Make sure the request syntax is as expected.
        request_syntax_contents = self.get_request_syntax_document_block(
            method_contents)
        self.assert_contains_lines_in_order([
            '        response = table.query(',
            ('            FilterExpression=Attr(\'myattribute\').'
             'eq(\'myvalue\'),'),
            ('            KeyConditionExpression=Key(\'mykey\')'
             '.eq(\'myvalue\'),')],
            request_syntax_contents)

        # Make sure the request parameter is documented correctly.
        self.assert_contains_lines_in_order([
            ('      :type FilterExpression: condition from '
             ':py:class:`boto3.dynamodb.conditions.Attr` method'),
            ('      :param FilterExpression: The condition(s) an '
             'attribute(s) must meet. Valid conditions are listed in '
             'the :ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`.'),
            ('      :type KeyConditionExpression: condition from '
             ':py:class:`boto3.dynamodb.conditions.Key` method'),
            ('      :param KeyConditionExpression: The condition(s) a '
             'key(s) must meet. Valid conditions are listed in the '
             ':ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`.')],
            method_contents)
Ejemplo n.º 26
0
class TestDynamoDBCustomizations(BaseDocsFunctionalTests):
    def setUp(self):
        self.documenter = ServiceDocumenter("dynamodb", session=Session(region_name="us-east-1"))
        self.generated_contents = self.documenter.document_service()
        self.generated_contents = self.generated_contents.decode("utf-8")

    def test_batch_writer_is_documented(self):
        self.assert_contains_lines_in_order(
            [
                ".. py:class:: DynamoDB.Table(name)",
                "  *   :py:meth:`batch_writer()`",
                "  .. py:method:: batch_writer()",
            ],
            self.generated_contents,
        )

    def test_document_interface_is_documented(self):
        contents = self.get_class_document_block("DynamoDB.Table", self.generated_contents)

        # Take an arbitrary method that uses the customization.
        method_contents = self.get_method_document_block("put_item", contents)

        # Make sure the request syntax is as expected.
        request_syntax_contents = self.get_request_syntax_document_block(method_contents)
        self.assert_contains_lines_in_order(
            [
                "        response = table.put_item(",
                "            Item={",
                (
                    "                'string': 'string'|123|Binary(b'bytes')"
                    "|True|None|set(['string'])|set([123])|"
                    "set([Binary(b'bytes')])|[]|{}"
                ),
                "            },",
                "            Expected={",
                "                'string': {",
                (
                    "                    'Value': 'string'|123"
                    "|Binary(b'bytes')|True|None|set(['string'])"
                    "|set([123])|set([Binary(b'bytes')])|[]|{},"
                ),
                "                    'AttributeValueList': [",
                (
                    "                        'string'|123|Binary(b'bytes')"
                    "|True|None|set(['string'])|set([123])|"
                    "set([Binary(b'bytes')])|[]|{},"
                ),
            ],
            request_syntax_contents,
        )

        # Make sure the response syntax is as expected.
        response_syntax_contents = self.get_response_syntax_document_block(method_contents)
        self.assert_contains_lines_in_order(
            [
                "          {",
                "              'Attributes': {",
                (
                    "                  'string': 'string'|123|"
                    "Binary(b'bytes')|True|None|set(['string'])|"
                    "set([123])|set([Binary(b'bytes')])|[]|{}"
                ),
                "              },",
            ],
            response_syntax_contents,
        )

        # Make sure the request parameter is documented correctly.
        request_param_contents = self.get_request_parameter_document_block("Item", method_contents)
        self.assert_contains_lines_in_order(
            [
                "    :type Item: dict",
                "    :param Item: **[REQUIRED]**",
                "        - *(string) --*",
                (
                    "          - *(valid DynamoDB type) --* - The value of the "
                    "attribute. The valid value types are listed in the "
                    ":ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`."
                ),
            ],
            request_param_contents,
        )

        # Make sure the response parameter is documented correctly.
        response_param_contents = self.get_response_parameter_document_block("Attributes", method_contents)
        self.assert_contains_lines_in_order(
            [
                "          - **Attributes** *(dict) --*",
                "            - *(string) --*",
                (
                    "              - *(valid DynamoDB type) --* - The value of "
                    "the attribute. The valid value types are listed in the "
                    ":ref:`DynamoDB Reference Guide<ref_valid_dynamodb_types>`."
                ),
            ],
            response_param_contents,
        )

    def test_conditions_is_documented(self):
        contents = self.get_class_document_block("DynamoDB.Table", self.generated_contents)

        # Take an arbitrary method that uses the customization.
        method_contents = self.get_method_document_block("query", contents)

        # Make sure the request syntax is as expected.
        request_syntax_contents = self.get_request_syntax_document_block(method_contents)
        self.assert_contains_lines_in_order(
            [
                "        response = table.query(",
                ("            FilterExpression=Attr('myattribute')." "eq('myvalue'),"),
                ("            KeyConditionExpression=Key('mykey')" ".eq('myvalue'),"),
            ],
            request_syntax_contents,
        )

        # Make sure the request parameter is documented correctly.
        self.assert_contains_lines_in_order(
            [
                ("      :type FilterExpression: condition from " ":py:class:`boto3.dynamodb.conditions.Attr` method"),
                (
                    "      :param FilterExpression: The condition(s) an "
                    "attribute(s) must meet. Valid conditions are listed in "
                    "the :ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`."
                ),
                (
                    "      :type KeyConditionExpression: condition from "
                    ":py:class:`boto3.dynamodb.conditions.Key` method"
                ),
                (
                    "      :param KeyConditionExpression: The condition(s) a "
                    "key(s) must meet. Valid conditions are listed in the "
                    ":ref:`DynamoDB Reference Guide<ref_dynamodb_conditions>`."
                ),
            ],
            method_contents,
        )
Ejemplo n.º 27
0
 def test_document_service(self):
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     lines = [
         '*********',
         'MyService',
         '*********',
         '.. contents:: Table of Contents',
         '   :depth: 2',
         '======',
         'Client',
         '======',
         '.. py:class:: MyService.Client',
         '  These are the available methods:',
         '  *   :py:meth:`~MyService.Client.sample_operation`',
         '    **Examples** ',
         '    Sample Description.',
         '    ::',
         '      response = client.sample_operation(',
         '==========',
         'Paginators',
         '==========',
         'The available paginators are:',
         '* :py:class:`MyService.Paginator.SampleOperation`',
         '.. py:class:: MyService.Paginator.SampleOperation',
         '  .. py:method:: paginate(**kwargs)',
         '=======',
         'Waiters',
         '=======',
         'The available waiters are:',
         '* :py:class:`MyService.Waiter.SampleOperationComplete`',
         '.. py:class:: MyService.Waiter.SampleOperationComplete',
         '  .. py:method:: wait(**kwargs)',
         '================',
         'Service Resource',
         '================',
         '.. py:class:: MyService.ServiceResource()',
         "  These are the resource's available actions:",
         '  *   :py:meth:`sample_operation()`',
         "  These are the resource's available sub-resources:",
         '  *   :py:meth:`Sample()`',
         "  These are the resource's available collections:",
         '  *   :py:attr:`samples`',
         '  .. py:method:: sample_operation(**kwargs)',
         '  .. py:method:: Sample(name)',
         '  .. py:attribute:: samples',
         '    .. py:method:: all()',
         '    .. py:method:: filter(**kwargs)',
         '    .. py:method:: limit(**kwargs)',
         '    .. py:method:: page_size(**kwargs)',
         '======',
         'Sample',
         '======',
         '.. py:class:: MyService.Sample(name)',
         "  These are the resource's available identifiers:",
         '  *   :py:attr:`name`',
         "  These are the resource's available attributes:",
         '  *   :py:attr:`bar`',
         '  *   :py:attr:`foo`',
         "  These are the resource's available actions:",
         '  *   :py:meth:`load()`',
         '  *   :py:meth:`operate()`',
         '  *   :py:meth:`reload()`',
         "  These are the resource's available waiters:",
         '  *   :py:meth:`wait_until_complete()`',
         '  .. py:attribute:: name',
         '  .. py:attribute:: bar',
         '  .. py:attribute:: foo',
         '  .. py:method:: load()',
         '  .. py:method:: operate(**kwargs)',
         '  .. py:method:: reload()',
         '  .. py:method:: wait_until_complete(**kwargs)',
     ]
     self.assert_contains_lines_in_order(lines, contents)
Ejemplo n.º 28
0
 def setUp(self):
     self.documenter = ServiceDocumenter("dynamodb", session=Session(region_name="us-east-1"))
     self.generated_contents = self.documenter.document_service()
     self.generated_contents = self.generated_contents.decode("utf-8")
Ejemplo n.º 29
0
 def test_document_service_no_resource(self):
     os.remove(self.resource_model_file)
     service_documenter = ServiceDocumenter('myservice', self.session)
     contents = service_documenter.document_service().decode('utf-8')
     self.assertNotIn('Service Resource', contents)
Ejemplo n.º 30
0
 def setUp(self):
     self.documenter = ServiceDocumenter(
         'ec2', session=Session(region_name='us-east-1'))
     self.generated_contents = self.documenter.document_service()
     self.generated_contents = self.generated_contents.decode('utf-8')