diff --git a/openapi_codec/decode.py b/openapi_codec/decode.py index 679ddb8..c300b24 100644 --- a/openapi_codec/decode.py +++ b/openapi_codec/decode.py @@ -44,9 +44,9 @@ def _parse_document(data, base_url=None): name=field_name, location='form', required=is_required, - schema=coreschema.String(description=field_description) + schema=coreschema.String(description=field_description, format=field_format) ) - for field_name, is_required, field_description in expanded + for field_name, is_required, field_description, field_format in expanded if not any([field.name == field_name for field in fields]) ] fields += expanded_fields @@ -188,7 +188,7 @@ def _expand_schema(schema): schema_required = _get_list(schema, 'required') if ((schema_type == ['object']) or (schema_type == 'object')) and schema_properties: return [ - (key, key in schema_required, schema_properties[key].get('description')) + (key, key in schema_required, schema_properties[key].get('description'), schema_properties[key].get('format')) for key in schema_properties.keys() ] return None diff --git a/openapi_codec/encode.py b/openapi_codec/encode.py index 13b3ef4..0e2d58e 100644 --- a/openapi_codec/encode.py +++ b/openapi_codec/encode.py @@ -128,6 +128,10 @@ def _get_field_type(field): }.get(field.schema.__class__, 'string') +def _get_field_format(field): + return field.schema and getattr(field.schema, 'format', None) + + def _get_parameters(link, encoding): """ Generates Swagger Parameter Item object. @@ -140,6 +144,7 @@ def _get_parameters(link, encoding): location = get_location(link, field) field_description = _get_field_description(field) field_type = _get_field_type(field) + field_format = _get_field_format(field) if location == 'form': if encoding in ('multipart/form-data', 'application/x-www-form-urlencoded'): # 'formData' in swagger MUST be one of these media types. @@ -152,6 +157,8 @@ def _get_parameters(link, encoding): } if field_type == 'array': parameter['items'] = {'type': 'string'} + if field_format: + parameter['format'] = field_format parameters.append(parameter) else: # Expand coreapi fields with location='form' into a single swagger @@ -179,6 +186,8 @@ def _get_parameters(link, encoding): 'description': field_description, 'schema': schema } + if field_format: + parameter['format'] = field_format parameters.append(parameter) else: parameter = { @@ -190,6 +199,8 @@ def _get_parameters(link, encoding): } if field_type == 'array': parameter['items'] = {'type': 'string'} + if field_format: + parameter['format'] = field_format parameters.append(parameter) if properties: diff --git a/tests/test_encode.py b/tests/test_encode.py index 429a9f0..e344700 100644 --- a/tests/test_encode.py +++ b/tests/test_encode.py @@ -106,3 +106,48 @@ def test_expected_fields(self): 'type': 'string' # Everything is a string for now. } self.assertEquals(self.swagger[0], expected) + + +class TestFormat(TestCase): + def setUp(self): + self.field = coreapi.Field( + name='published_before', + required=True, + location='query', + schema=coreschema.String(description='Filter by published date.', format='date') + ) + self.swagger = _get_parameters(coreapi.Link(fields=[self.field]), encoding='') + + def test_expected_fields(self): + self.assertEquals(len(self.swagger), 1) + expected = { + 'name': self.field.name, + 'required': self.field.required, + 'in': 'query', + 'description': self.field.schema.description, + 'type': 'string', + 'format': 'date' + } + self.assertEquals(self.swagger[0], expected) + + +class TestIntegerField(TestCase): + def setUp(self): + self.field = coreapi.Field( + name='page', + required=True, + location='query', + schema=coreschema.Integer(description='A page number.') + ) + self.swagger = _get_parameters(coreapi.Link(fields=[self.field]), encoding='') + + def test_expected_fields(self): + self.assertEquals(len(self.swagger), 1) + expected = { + 'name': self.field.name, + 'required': self.field.required, + 'in': 'query', + 'description': self.field.schema.description, + 'type': 'integer' + } + self.assertEquals(self.swagger[0], expected)
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: