Пример #1
0
    def get(self, request, *args, **kwargs):
        path = request.path
        path = path[:request.path.find('/api-docs')]
        apis = self.get_apis(path)
        generator = DocumentationGenerator(for_user=request.user)

        info = copy.deepcopy(rfs.SWAGGER_SETTINGS.get('info', {
            'contact': {},
            'description': '',
            'license': {'name': ''},
            'termsOfService': '',
            'title': '',
            'version': '',
        }))

        if 'version' not in info or info['version'] == '':
            matches = version_re.search(path)
            if matches is not None:
                info['version'] = matches.groups()[0]

        return Response({
            'swagger': '2.0',
            'basePath': path,
            'paths': generator.generate(apis),
            'definitions': generator.get_models(apis),
            'info': info,
            'tags': rfs.SWAGGER_SETTINGS.get('tags', [])
        })
Пример #2
0
    def test_get_allowed_methods(self):
        """
        Tests a ModelViewSet's allowed methods. If the path includes something like {pk},
        consider it an object view, otherwise, a list view
        """
        from django.contrib.auth.models import User

        class MyViewSet(ModelViewSet):
            serializer_class = CommentSerializer
            model = User

        docgen = DocumentationGenerator()

        # Test a list endpoint
        allowed_methods = docgen.__get_allowed_methods__(
            MyViewSet, '/api/endpoint')
        self.assertEqual(2, len(allowed_methods))
        self.assertIn('POST', allowed_methods)
        self.assertIn('GET', allowed_methods)

        # Test an object endpoint
        allowed_methods = docgen.__get_allowed_methods__(
            MyViewSet, '/api/endpoint/{pk}')
        self.assertEqual(4, len(allowed_methods))
        self.assertIn('POST', allowed_methods)
        self.assertIn('PATCH', allowed_methods)
        self.assertIn('DELETE', allowed_methods)
        self.assertIn('GET', allowed_methods)
Пример #3
0
    def test_get_allowed_methods(self):
        """
        Tests a ModelViewSet's allowed methods. If the path includes something like {pk},
        consider it an object view, otherwise, a list view
        """
        from django.contrib.auth.models import User

        class MyViewSet(ModelViewSet):
            serializer_class = CommentSerializer
            model = User

        docgen = DocumentationGenerator()

        # Test a list endpoint
        allowed_methods = docgen.__get_allowed_methods__(MyViewSet, '/api/endpoint')
        self.assertEqual(2, len(allowed_methods))
        self.assertIn('POST', allowed_methods)
        self.assertIn('GET', allowed_methods)

        # Test an object endpoint
        allowed_methods = docgen.__get_allowed_methods__(MyViewSet, '/api/endpoint/{pk}')
        self.assertEqual(4, len(allowed_methods))
        self.assertIn('POST', allowed_methods)
        self.assertIn('PATCH', allowed_methods)
        self.assertIn('DELETE', allowed_methods)
        self.assertIn('GET', allowed_methods)
Пример #4
0
    def test_build_body_parameters(self):
        class SerializedAPI(ListCreateAPIView):
            serializer_class = CommentSerializer

        docgen = DocumentationGenerator()
        params = docgen.__build_body_parameters__(SerializedAPI)

        self.assertEqual('CommentSerializer', params['name'])
Пример #5
0
    def test_build_form_parameters(self):
        class SerializedAPI(ListCreateAPIView):
            serializer_class = CommentSerializer

        docgen = DocumentationGenerator()
        params = docgen.__build_form_parameters__(SerializedAPI, 'POST')

        self.assertEqual(len(CommentSerializer().get_fields()), len(params))
Пример #6
0
    def test_build_body_parameters(self):
        class SerializedAPI(ListCreateAPIView):
            serializer_class = CommentSerializer

        docgen = DocumentationGenerator()
        params = docgen.__build_body_parameters__(SerializedAPI)

        self.assertEqual('CommentSerializer', params['name'])
Пример #7
0
    def test_build_form_parameters(self):
        class SerializedAPI(ListCreateAPIView):
            serializer_class = CommentSerializer

        docgen = DocumentationGenerator()
        params = docgen.__build_form_parameters__(SerializedAPI, 'POST')

        self.assertEqual(len(CommentSerializer().get_fields()), len(params))
Пример #8
0
 def get(self, request, version=None, swagger_config_name=None):
     self.check_permission(request, swagger_config_name)
     paths = self.get_paths()
     generator = DocumentationGenerator(
         for_user=request.user,
         config=self.config,
         request=request
     )
     return Response(generator.get_root(paths))
Пример #9
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return Response({
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
            'basePath': self.api_full_uri.rstrip('/'),
        })
Пример #10
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return Response({
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
            'basePath': self.api_full_uri,
        })
Пример #11
0
    def test_get_method_generic_api_view(self):
        class MyListView(ListCreateAPIView):
            """
            My comment
            """
            pass

        generator = DocumentationGenerator()
        method_docs = generator.__get_method_docs__(MyListView(), 'POST')

        self.assertEqual("My comment", method_docs)
Пример #12
0
 def get(self, request, path, *args, **kwargs):
     apis = self.get_apis_for_resource(path)
     generator = DocumentationGenerator(for_user=request.user)
     return Response({
         'apiVersion': rfs.SWAGGER_SETTINGS.get('api_version', ''),
         'swaggerVersion': '1.2',
         'basePath': self.api_full_uri.rstrip('/'),
         'resourcePath': '/' + path,
         'apis': generator.generate(apis),
         'models': generator.get_models(apis),
     })
Пример #13
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return Response({
            'apiVersion': SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            'basePath': get_full_base_path(request),
            'resourcePath': path,
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
        })
Пример #14
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return Response({
            'apiVersion': SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            "resourcePath": "/{}".format(path),
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
            'basePath': self.api_full_uri.rstrip('/'),
        })
Пример #15
0
    def test_get_serializer_set(self):
        class SerializedAPI(ListCreateAPIView):
            serializer_class = CommentSerializer

        urlparser = UrlParser()
        url_patterns = patterns('', url(r'my-api/', SerializedAPI.as_view()))
        apis = urlparser.get_apis(url_patterns)

        docgen = DocumentationGenerator()
        serializers = docgen.__get_serializer_set__(apis)

        self.assertIn(CommentSerializer, serializers)
Пример #16
0
    def test_get_method_generic_api_view(self):

        class MyListView(ListCreateAPIView):
            """
            My comment
            """
            pass

        generator = DocumentationGenerator()
        method_docs = generator.__get_method_docs__(MyListView(), 'POST')

        self.assertEqual("My comment", method_docs)
Пример #17
0
    def test_get_serializer_set(self):
        class SerializedAPI(ListCreateAPIView):
            serializer_class = CommentSerializer

        urlparser = UrlParser()
        url_patterns = patterns('', url(r'my-api/', SerializedAPI.as_view()))
        apis = urlparser.get_apis(url_patterns)

        docgen = DocumentationGenerator()
        serializers = docgen.__get_serializer_set__(apis)

        self.assertIn(CommentSerializer, serializers)
Пример #18
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return Response({
            'apiVersion': SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            "resourcePath": "/{}".format(path),
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
            'basePath': self.api_full_uri.rstrip('/'),
        })
Пример #19
0
    def test_get_operations_with_no_methods(self):
        class AnAPIView(APIView):
            pass

        api = {
            'path': 'a-path/',
            'callback': AnAPIView,
            'pattern': patterns('')
        }
        docgen = DocumentationGenerator()
        operations = docgen.__get_operations__(api)

        self.assertEqual([], operations)
Пример #20
0
    def test_get_method_docs(self):

        class TestApiView(APIView):
            def get(self, *args):
                """
                Here are my comments
                """
            pass

        generator = DocumentationGenerator()
        docs_get = generator.__get_method_docs__(TestApiView(), 'GET')

        self.assertEqual("Here are my comments", docs_get)
Пример #21
0
    def test_get_method_docs(self):
        class TestApiView(APIView):
            def get(self, *args):
                """
                Here are my comments
                """

            pass

        generator = DocumentationGenerator()
        docs_get = generator.__get_method_docs__(TestApiView(), 'GET')

        self.assertEqual("Here are my comments", docs_get)
Пример #22
0
    def test_strip_params_from_docstring(self):
        class AnAPIView(APIView):
            """
            My comments are here

            param -- my param
            """
            pass

        docgen = DocumentationGenerator()
        docstring = docgen.__strip_params_from_docstring__(trim_docstring(AnAPIView.__doc__))

        self.assertEqual("My comments are here<br/><br/>", docstring)
Пример #23
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return Response({
            'apiVersion': rfs.SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            'basePath': self.api_full_uri.rstrip('/'),
            'resourcePath': '/' + path,
            'apiCustomHeaders': rfs.SWAGGER_SETTINGS.get('custom_headers', {}),
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
        })
Пример #24
0
 def get(self, request, path, *args, **kwargs):
     apis = self.get_apis_for_resource(path)
     generator = DocumentationGenerator(for_user=request.user)
     return Response(
         {
             "apiVersion": rfs.SWAGGER_SETTINGS.get("api_version", ""),
             "swaggerVersion": "1.2",
             "basePath": self.api_full_uri.rstrip("/"),
             "resourcePath": "/" + path,
             "apis": generator.generate(apis),
             "models": generator.get_models(apis),
         }
     )
Пример #25
0
    def test_strip_params_from_docstring(self):
        class AnAPIView(APIView):
            """
            My comments are here

            param -- my param
            """
            pass

        docgen = DocumentationGenerator()
        docstring = docgen.__strip_params_from_docstring__(trim_docstring(AnAPIView.__doc__))

        self.assertEqual("My comments are here<br/>", docstring)
    def get_api_declaration(self, path):
        api_full_uri = SWAGGER_SETTINGS.get('api_full_uri')

        apis = self.get_api_for_resource(path)
        generator = DocumentationGenerator()

        return {
            'apiVersion': SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            'basePath': api_full_uri.rstrip('/'),
            'resourcePath': '/' + path,
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
        }
Пример #27
0
    def test_get_operations_with_no_methods(self):

        class AnAPIView(APIView):
            pass

        api = {
            'path': 'a-path/',
            'callback': AnAPIView,
            'pattern': patterns('')
        }
        docgen = DocumentationGenerator()
        operations = docgen.__get_operations__(api)

        self.assertEqual([], operations)
Пример #28
0
    def get_api_declaration(self, path, urlconf):
        api_full_uri = SWAGGER_SETTINGS.get('api_full_uri')

        apis = self.get_api_for_resource(path, urlconf=urlconf)
        generator = DocumentationGenerator()

        return {
            'apiVersion': SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            'basePath': api_full_uri.rstrip('/'),
            'resourcePath': '/' + path,
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
        }
Пример #29
0
    def test_get_operations(self):
        class AnAPIView(APIView):
            def post(self, *args, **kwargs):
                pass

        api = {
            'path': 'a-path/',
            'callback': AnAPIView,
            'pattern': patterns('')
        }
        docgen = DocumentationGenerator()
        operations = docgen.__get_operations__(api)

        self.assertEqual('POST', operations[0]['httpMethod'])
Пример #30
0
    def test_get_operations(self):

        class AnAPIView(APIView):
            def post(self, *args, **kwargs):
                pass

        api = {
            'path': 'a-path/',
            'callback': AnAPIView,
            'pattern': patterns('')
        }
        docgen = DocumentationGenerator()
        operations = docgen.__get_operations__(api)

        self.assertEqual('POST', operations[0]['httpMethod'])
Пример #31
0
    def get(self, request, path):
        apis = self.get_api_for_resource(path)

        apis = [api for api in apis
                if self.handle_resource_access(request, api['pattern'])]

        generator = DocumentationGenerator()

        return Response({
            'apiVersion': rfs.SWAGGER_SETTINGS.get('api_version', ''),
            'swaggerVersion': '1.2',
            'basePath': self.api_full_uri.rstrip('/'),
            'resourcePath': '/' + path,
            'apis': generator.generate(apis),
            'models': generator.get_models(apis),
        })
Пример #32
0
    def test_build_form_parameters_allowable_values(self):

        class MySerializer(serializers.Serializer):
            content = serializers.CharField(max_length=200, min_length=10, default="Vandalay Industries")
            a_read_only_field = serializers.BooleanField(read_only=True)

        class MyAPIView(ListCreateAPIView):
            serializer_class = MySerializer

        docgen = DocumentationGenerator()
        params = docgen.__build_form_parameters__(MyAPIView, 'POST')

        self.assertEqual(1, len(params))  # Read only field is ignored
        param = params[0]

        self.assertEqual('content', param['name'])
        self.assertEqual('form', param['paramType'])
        self.assertEqual(True, param['required'])
        self.assertEqual(200, param['allowableValues']['max'])
        self.assertEqual(10, param['allowableValues']['min'])
        self.assertEqual('Vandalay Industries', param['defaultValue'])
Пример #33
0
    def test_build_form_parameters_allowable_values(self):

        class MySerializer(serializers.Serializer):
            content = serializers.CharField(max_length=200, min_length=10, default="Vandalay Industries")
            a_read_only_field = serializers.BooleanField(read_only=True)

        class MyAPIView(ListCreateAPIView):
            serializer_class = MySerializer

        docgen = DocumentationGenerator()
        params = docgen.__build_form_parameters__(MyAPIView, 'POST')

        self.assertEqual(1, len(params))  # Read only field is ignored
        param = params[0]

        self.assertEqual('content', param['name'])
        self.assertEqual('form', param['paramType'])
        self.assertEqual(True, param['required'])
        self.assertEqual(200, param['allowableValues']['max'])
        self.assertEqual(10, param['allowableValues']['min'])
        self.assertEqual('Vandalay Industries', param['defaultValue'])
Пример #34
0
    def test_strip_params_from_docstring_multiline(self):
        class TestView(APIView):
            """
            Creates a new user.
            Returns: token - auth token

            email -- e-mail address
            password -- password, optional
            city -- city, optional
            street -- street, optional
            number -- house number, optional
            zip_code -- zip code 10 chars, optional
            phone -- phone number in US format (XXX-XXX-XXXX), optional
            """
            pass

        docgen = DocumentationGenerator()
        docstring = docgen.__strip_params_from_docstring__(TestView.__doc__)
        expected = 'Creates a new user.<br/>Returns: token - auth token<br/>'

        self.assertEqual(expected, docstring)
Пример #35
0
    def test_strip_params_from_docstring_multiline(self):
        class TestView(APIView):
            """
            Creates a new user.
            Returns: token - auth token

            email -- e-mail address
            password -- password, optional
            city -- city, optional
            street -- street, optional
            number -- house number, optional
            zip_code -- zip code 10 chars, optional
            phone -- phone number in US format (XXX-XXX-XXXX), optional
            """
            pass

        docgen = DocumentationGenerator()
        docstring = docgen.__strip_params_from_docstring__(TestView.__doc__)
        expected = 'Creates a new user.<br/>Returns: token - auth token<br/>'

        self.assertEqual(expected, docstring)
Пример #36
0
    def get(self, request, *args, **kwargs):
        apis = []
        resources = self.get_resources()

        for path in resources:
            apis.append(
                self.get_api_for_resource(path)
            )

        generator = DocumentationGenerator()

        #parameters = generator.get_models(apis)

        tags = {}
        paths = {}
        # TODO: reformat the contents that come from generator, don't
        # post-process it here.
        for path in generator.generate(apis):
            mypath = {}

            try:
                tag = path['path'].split('/')[2]
            except IndexError:
                tag = None

            for operation in path.get('operations', []):

                # {
                #     'parameters': [
                #         {'name': 'cigar', 'paramType': 'form', 'required': True, 'type': 'string', 'description': ''},
                #         {'name': 'jambalaya', 'paramType': 'form', 'required': True, 'type': 'string', 'description': ''}
                #     ],
                #     'nickname': u'Drop_Cigar_In_Jambalaya_POST',
                #     'notes': u'<p>Make a cigar jambalaya</p>',
                #     'summary': u'Make a cigar jambalaya',
                #     'type': 'CigarJambalayaSerializer',
                #     'method': 'POST'
                # }",
                responses = {}

                response_messages = operation.get('responseMessages', [])
                if len(response_messages) == 0:
                    responses['default'] = {'description': 'Unknown'}

                for response in response_messages:
                    responses[response['code']] = {
                        'description': response['message']
                    }

                    # TODO : this is almost certainly wrong
                    if response['responseModel']:
                        response[response['code']]['schema'] = {
                            "$ref": response['responseModel']
                        }


                method = operation['method'].lower()
                mypath[method] = {
                    #'debug': operation,
                    'description': operation['notes'],
                    'summary': operation['summary'],
                    'operationId': operation['nickname'],
                    'produces': [
                        'application/json'
                    ],
                    'parameters': operation.get('parameters', []),
                    'responses': responses
                }

                if tag:
                    mypath[method]["tags"] = [tag]

            if tag and tag not in tags:
                tags[tag] = {
                    'name': tag,
                    'description': tag
                }

            paths[path['path']] = mypath

        tag_list = []
        for tag in tags:
            tag_list.append(tag)

        definitions = {}
        securityDefinitions = {}
        security = []
        externalDocs = {}

        full_uri = self.api_full_uri.rstrip('/').split('/')
        scheme = full_uri[0].rstrip(':')
        host = '/'.join(full_uri[2:3])
        basePath = "/" + '/'.join(full_uri[3:])

        return Response({
            'swagger': '2.0',
            'info': rfs.SWAGGER_SETTINGS['info'],
            'host': host,
            'basePath': basePath,
            'schemes': [scheme],
            'consumes': ['application/json'],
            'produces': ['application/json'],

            'paths': paths,
            'definitions': definitions,
            #'parameters': parameters,
            'responses': {},
            'securityDefinitions': securityDefinitions,
            'security': security
        })
Пример #37
0
    def test_get_serializer_fields_api_with_no_serializer(self):
        docgen = DocumentationGenerator()
        fields = docgen.__get_serializer_fields__(None)

        self.assertIsNone(fields)
Пример #38
0
    def test_get_serializer_fields(self):
        docgen = DocumentationGenerator()
        fields = docgen.__get_serializer_fields__(CommentSerializer)

        self.assertEqual(3, len(fields))
Пример #39
0
    def test_get_description(self):
        generator = DocumentationGenerator()
        description = generator.__get_description__(MockApiView())

        self.assertEqual('A Test View', description)
Пример #40
0
    def test_get_serializer_fields(self):
        docgen = DocumentationGenerator()
        fields = docgen.__get_serializer_fields__(CommentSerializer)

        self.assertEqual(3, len(fields))
Пример #41
0
    def test_get_description(self):
        generator = DocumentationGenerator()
        description = generator.__get_description__(MockApiView())

        self.assertEqual('A Test View', description)
Пример #42
0
    def test_get_serializer_fields_api_with_no_serializer(self):
        docgen = DocumentationGenerator()
        fields = docgen.__get_serializer_fields__(None)

        self.assertIsNone(fields)
Пример #43
0
    def get(self, request, *args, **kwargs):
        apis = []
        resources = self.get_resources()

        for path in resources:
            apis.append(
                self.get_api_for_resource(path)
            )

        generator = DocumentationGenerator()

        tags = {}

        paths = {}
        # TODO: reformat the contents that come from generator, don't
        # post-process it here.
        for path in generator.generate(apis):
            mypath = {}

            try:
                tag = path['path'].split('/')[2]
            except IndexError:
                tag = None

            for operation in path.get('operations', []):
                method = operation['method'].lower()
                mypath[method] = {
                    'description': operation['notes'],
                    'summary': operation['summary'],
                    'produces': [
                        'application/json'
                    ],
                    'responses': {
                        'default': {
                            'description': 'Unknown',
                            # 'schema': {
                            #     '$ref': "#/definitions/ErrorModel"
                            # }
                        },
                        200: {
                            'description': 'Success'
                        }
                    }
                }

                if tag:
                    mypath[method]["tags"] = [tag]

            if tag and tag not in tags:
                tags[tag] = {
                    'name': tag,
                    'description': tag
                }

            paths[path['path']] = mypath

        tag_list = []
        for tag in tags:
            tag_list.append(tag)

        definitions = {}
        parameters = {}
        responses = {}
        securityDefinitions = {}
        security = []
        tags = []
        externalDocs = {}

        full_uri = self.api_full_uri.rstrip('/').split('/')
        scheme = full_uri[0].rstrip(':')
        host = '/'.join(full_uri[2:3])
        basePath = "/" + '/'.join(full_uri[3:])

        return Response({
            'swagger': '2.0',
            'info': rfs.SWAGGER_SETTINGS['info'],
            'host': host,
            'basePath': basePath,
            'schemes': [scheme],
            'consumes': ['application/json'],
            'produces': ['application/json'],

            'paths': paths,
            'definitions': definitions,
            'parameters': parameters,
            'responses': responses,
            'securityDefinitions': securityDefinitions,
            'security': security,
            'tags': tag_list,
            'externalDocs': externalDocs

            # 'apiVersion': rfs.SWAGGER_SETTINGS.get('api_version', ''),
            # 'swaggerVersion': '2.0',

            # 'apis': generator.generate(apis),
            # 'models': generator.get_models(apis),
        })