From c376ffbb955ee33e9ba183d8d1961ce198c41d9e Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Mon, 16 Oct 2017 16:30:39 -0700 Subject: [PATCH 1/3] decode field formats --- openapi_codec/decode.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 From 00b0b0e47ad61c144fa249d7952dfa2c6aa4851d Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Tue, 17 Oct 2017 13:45:12 -0700 Subject: [PATCH 2/3] encode and test format --- openapi_codec/encode.py | 11 +++++++++++ tests/test_encode.py | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/openapi_codec/encode.py b/openapi_codec/encode.py index 13b3ef4..35fc129 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 field.schema.format + + 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..57deb9d 100644 --- a/tests/test_encode.py +++ b/tests/test_encode.py @@ -106,3 +106,26 @@ 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) From 9e11a718183b217edee6c5cf3b35516f3cef7a81 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Thu, 2 Nov 2017 18:42:07 -0700 Subject: [PATCH 3/3] add test for encoding an integer field; catches format regression --- openapi_codec/encode.py | 2 +- tests/test_encode.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/openapi_codec/encode.py b/openapi_codec/encode.py index 35fc129..0e2d58e 100644 --- a/openapi_codec/encode.py +++ b/openapi_codec/encode.py @@ -129,7 +129,7 @@ def _get_field_type(field): def _get_field_format(field): - return field.schema and field.schema.format + return field.schema and getattr(field.schema, 'format', None) def _get_parameters(link, encoding): diff --git a/tests/test_encode.py b/tests/test_encode.py index 57deb9d..e344700 100644 --- a/tests/test_encode.py +++ b/tests/test_encode.py @@ -129,3 +129,25 @@ def test_expected_fields(self): '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)