Add type annotation to schema generation

This commit is contained in:
Tom Christie 2016-10-06 15:04:55 +01:00
parent 1084dca22b
commit 7edee804aa
3 changed files with 37 additions and 10 deletions

View File

@ -276,6 +276,10 @@ class HTMLFormRenderer(BaseRenderer):
'base_template': 'input.html', 'base_template': 'input.html',
'input_type': 'number' 'input_type': 'number'
}, },
serializers.FloatField: {
'base_template': 'input.html',
'input_type': 'number'
},
serializers.DateTimeField: { serializers.DateTimeField: {
'base_template': 'input.html', 'base_template': 'input.html',
'input_type': 'datetime-local' 'input_type': 'datetime-local'

View File

@ -15,10 +15,25 @@ from rest_framework.request import clone_request
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from rest_framework.utils import formatting from rest_framework.utils import formatting
from rest_framework.utils.field_mapping import ClassLookupDict
from rest_framework.views import APIView from rest_framework.views import APIView
header_regex = re.compile('^[a-zA-Z][0-9A-Za-z_]*:') header_regex = re.compile('^[a-zA-Z][0-9A-Za-z_]*:')
types_lookup = ClassLookupDict({
serializers.Field: 'string',
serializers.IntegerField: 'integer',
serializers.FloatField: 'number',
serializers.DecimalField: 'number',
serializers.BooleanField: 'boolean',
serializers.FileField: 'file',
serializers.MultipleChoiceField: 'array',
serializers.ManyRelatedField: 'array',
serializers.Serializer: 'object',
serializers.ListSerializer: 'array'
})
def as_query_fields(items): def as_query_fields(items):
""" """
@ -372,7 +387,14 @@ class SchemaGenerator(object):
serializer = view.get_serializer() serializer = view.get_serializer()
if isinstance(serializer, serializers.ListSerializer): if isinstance(serializer, serializers.ListSerializer):
return [coreapi.Field(name='data', location='body', required=True)] return [
coreapi.Field(
name='data',
location='body',
required=True,
type='array'
)
]
if not isinstance(serializer, serializers.Serializer): if not isinstance(serializer, serializers.Serializer):
return [] return []
@ -388,7 +410,8 @@ class SchemaGenerator(object):
name=field.source, name=field.source,
location='form', location='form',
required=required, required=required,
description=description description=description,
type=types_lookup[field]
) )
fields.append(field) fields.append(field)

View File

@ -137,8 +137,8 @@ class TestRouterGeneratedSchema(TestCase):
action='post', action='post',
encoding='application/json', encoding='application/json',
fields=[ fields=[
coreapi.Field('a', required=True, location='form', description='A field description'), coreapi.Field('a', required=True, location='form', type='string', description='A field description'),
coreapi.Field('b', required=False, location='form') coreapi.Field('b', required=False, location='form', type='string')
] ]
), ),
'retrieve': coreapi.Link( 'retrieve': coreapi.Link(
@ -155,8 +155,8 @@ class TestRouterGeneratedSchema(TestCase):
description='A description of custom action.', description='A description of custom action.',
fields=[ fields=[
coreapi.Field('pk', required=True, location='path'), coreapi.Field('pk', required=True, location='path'),
coreapi.Field('c', required=True, location='form'), coreapi.Field('c', required=True, location='form', type='string'),
coreapi.Field('d', required=False, location='form'), coreapi.Field('d', required=False, location='form', type='string'),
] ]
), ),
'custom_list_action': coreapi.Link( 'custom_list_action': coreapi.Link(
@ -179,8 +179,8 @@ class TestRouterGeneratedSchema(TestCase):
encoding='application/json', encoding='application/json',
fields=[ fields=[
coreapi.Field('pk', required=True, location='path'), coreapi.Field('pk', required=True, location='path'),
coreapi.Field('a', required=True, location='form', description='A field description'), coreapi.Field('a', required=True, location='form', type='string', description='A field description'),
coreapi.Field('b', required=False, location='form') coreapi.Field('b', required=False, location='form', type='string')
] ]
), ),
'partial_update': coreapi.Link( 'partial_update': coreapi.Link(
@ -189,8 +189,8 @@ class TestRouterGeneratedSchema(TestCase):
encoding='application/json', encoding='application/json',
fields=[ fields=[
coreapi.Field('pk', required=True, location='path'), coreapi.Field('pk', required=True, location='path'),
coreapi.Field('a', required=False, location='form', description='A field description'), coreapi.Field('a', required=False, location='form', type='string', description='A field description'),
coreapi.Field('b', required=False, location='form') coreapi.Field('b', required=False, location='form', type='string')
] ]
), ),
'destroy': coreapi.Link( 'destroy': coreapi.Link(