From 742f5b68474b326c861e6d4b8348f4f17a3f6dc7 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Thu, 29 Aug 2024 15:03:32 +0200 Subject: [PATCH 01/12] Add support example/examples on content value body request --- src/openapi_parser/builders/content.py | 10 +++++++--- src/openapi_parser/specification.py | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/openapi_parser/builders/content.py b/src/openapi_parser/builders/content.py index a24bb82..4a0ee0a 100644 --- a/src/openapi_parser/builders/content.py +++ b/src/openapi_parser/builders/content.py @@ -21,15 +21,19 @@ def __init__(self, schema_factory: SchemaFactory, strict_enum: bool = True) -> N def build_list(self, data: dict) -> list[Content]: return [ - self._create_content(content_type, content_value['schema']) + self._create_content(content_type, content_value.get('schema', {}), + content_value.get('example', None), + content_value.get('examples', [])) for content_type, content_value in data.items() ] - def _create_content(self, content_type: str, content_value: dict) -> Content: + def _create_content(self, content_type: str, schema: dict, example: str, examples: list) -> Content: logger.debug(f"Content building [type={content_type}]") ContentTypeCls: ContentTypeType = ContentType if self.strict_enum else LooseContentType return Content( type=ContentTypeCls(content_type), - schema=self.schema_factory.create(content_value) + schema=self.schema_factory.create(schema), + example=example, + examples=examples ) diff --git a/src/openapi_parser/specification.py b/src/openapi_parser/specification.py index a53a6a3..5fb1d62 100644 --- a/src/openapi_parser/specification.py +++ b/src/openapi_parser/specification.py @@ -168,8 +168,8 @@ class Parameter: class Content: type: Union[ContentType, LooseContentType] schema: Schema - # example: Optional[Any] # TODO - # examples: list[Any] = field(default_factory=list) # TODO + example: Optional[str] + examples: list[str] = field(default_factory=list) # encoding: dict[str, Encoding] # TODO From 816c329430ba97777c1f7a972023515fc1aa2fa0 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Thu, 29 Aug 2024 15:29:12 +0200 Subject: [PATCH 02/12] Leave Any as Example typing --- src/openapi_parser/builders/content.py | 4 ++-- src/openapi_parser/specification.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/openapi_parser/builders/content.py b/src/openapi_parser/builders/content.py index 4a0ee0a..dd0ee2a 100644 --- a/src/openapi_parser/builders/content.py +++ b/src/openapi_parser/builders/content.py @@ -1,5 +1,5 @@ import logging -from typing import Type, Union +from typing import Type, Union, Any from . import SchemaFactory from ..enumeration import ContentType @@ -28,7 +28,7 @@ def build_list(self, data: dict) -> list[Content]: in data.items() ] - def _create_content(self, content_type: str, schema: dict, example: str, examples: list) -> Content: + def _create_content(self, content_type: str, schema: dict, example: Any, examples: list) -> Content: logger.debug(f"Content building [type={content_type}]") ContentTypeCls: ContentTypeType = ContentType if self.strict_enum else LooseContentType return Content( diff --git a/src/openapi_parser/specification.py b/src/openapi_parser/specification.py index 5fb1d62..1b201a0 100644 --- a/src/openapi_parser/specification.py +++ b/src/openapi_parser/specification.py @@ -168,8 +168,8 @@ class Parameter: class Content: type: Union[ContentType, LooseContentType] schema: Schema - example: Optional[str] - examples: list[str] = field(default_factory=list) + example: Optional[Any] + examples: list[Any] = field(default_factory=list) # encoding: dict[str, Encoding] # TODO From dac152e457e51f777b409b59c31fbc8663907658 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Fri, 30 Aug 2024 18:32:00 +0200 Subject: [PATCH 03/12] Fix tests --- tests/builders/test_operation_builder.py | 6 ++++-- tests/builders/test_path_builder.py | 3 ++- tests/builders/test_response_builder.py | 9 +++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/builders/test_operation_builder.py b/tests/builders/test_operation_builder.py index f06a466..9bdac27 100644 --- a/tests/builders/test_operation_builder.py +++ b/tests/builders/test_operation_builder.py @@ -26,7 +26,7 @@ def _get_list_builder_mock(expected): response_schema = Response( code=200, description="Pet updated.", - content=[Content(type=ContentType.JSON, schema=Object(type=DataType.OBJECT))], + content=[Content(type=ContentType.JSON, schema=Object(type=DataType.OBJECT), example="an example", examples=[])], is_default=False, ) @@ -63,7 +63,9 @@ def _get_list_builder_mock(expected): description="Updated status of the pet") ), ], - ) + ), + example="an example", + examples=[], ), ] ) diff --git a/tests/builders/test_path_builder.py b/tests/builders/test_path_builder.py index 466cab2..bb16c97 100644 --- a/tests/builders/test_path_builder.py +++ b/tests/builders/test_path_builder.py @@ -1,4 +1,5 @@ import copy +from random import sample from unittest.mock import MagicMock import pytest @@ -43,7 +44,7 @@ def _get_builder_list_mock(expected_value): Response( code=200, description="pet response", - content=[Content(type=ContentType.JSON, schema=array_schema)], + content=[Content(type=ContentType.JSON, schema=array_schema, example="an example", examples=[])], is_default=False, ) ], diff --git a/tests/builders/test_response_builder.py b/tests/builders/test_response_builder.py index 4cc0dfe..95c2f11 100644 --- a/tests/builders/test_response_builder.py +++ b/tests/builders/test_response_builder.py @@ -1,3 +1,4 @@ +from tkinter.scrolledtext import example from typing import Any, Union from unittest.mock import MagicMock @@ -24,7 +25,9 @@ def _get_builder_mock(expected_value: Any) -> Union[ContentBuilder, HeaderBuilde properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ) + ), + example="an example", + examples=[] ) ] @@ -44,7 +47,9 @@ def _get_builder_mock(expected_value: Any) -> Union[ContentBuilder, HeaderBuilde "application/json": { "schema": { "type": "string", - } + }, + "example": "an example", + "examples": ["example1", "example2"] } }, "headers": { From d1b1848bb08d2ccc929990890bdf432101f96feb Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Mon, 2 Sep 2024 11:17:46 +0200 Subject: [PATCH 04/12] Fix more tests --- tests/builders/test_content_builder.py | 4 ++-- tests/builders/test_request_builder.py | 12 +++++++++--- tests/openapi_fixture.py | 12 +++++++++--- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/tests/builders/test_content_builder.py b/tests/builders/test_content_builder.py index 58b0f46..151684c 100644 --- a/tests/builders/test_content_builder.py +++ b/tests/builders/test_content_builder.py @@ -27,7 +27,7 @@ def _get_schema_factory_mock(expected_value: Schema) -> SchemaFactory: } }, [ - Content(type=ContentType.JSON, schema=string_schema) + Content(type=ContentType.JSON, schema=string_schema, example="an example", examples=[]) ], _get_schema_factory_mock(string_schema) ), @@ -40,7 +40,7 @@ def _get_schema_factory_mock(expected_value: Schema) -> SchemaFactory: } }, [ - Content(type=ContentType.JSON_TEXT, schema=string_schema) + Content(type=ContentType.JSON_TEXT, schema=string_schema, example="an example", examples=[]) ], _get_schema_factory_mock(string_schema) ), diff --git a/tests/builders/test_request_builder.py b/tests/builders/test_request_builder.py index 95a3394..041d52b 100644 --- a/tests/builders/test_request_builder.py +++ b/tests/builders/test_request_builder.py @@ -23,7 +23,9 @@ def _get_content_builder_mock(expected_value: Any) -> ContentBuilder: properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ) + ), + example="an example", + examples=[] ) ] @@ -35,7 +37,9 @@ def _get_content_builder_mock(expected_value: Any) -> ContentBuilder: properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ) + ), + example="an example", + examples=[] ), Content( type=ContentType.FORM, @@ -44,7 +48,9 @@ def _get_content_builder_mock(expected_value: Any) -> ContentBuilder: properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ) + ), + example="an example", + examples=[] ), ] diff --git a/tests/openapi_fixture.py b/tests/openapi_fixture.py index 4ebdc6d..99f246b 100644 --- a/tests/openapi_fixture.py +++ b/tests/openapi_fixture.py @@ -69,7 +69,9 @@ content=[ Content( type=ContentType.JSON, - schema=user_list_schema + schema=user_list_schema, + example="An example", + examples=[] ), ], is_default=False, @@ -103,7 +105,9 @@ ) ), ], - ) + ), + example="an example", + examples=[] ), ], ) @@ -136,7 +140,9 @@ ) ), ], - ) + ), + example="an example", + examples=[] ), ], ) From 10a3c6f60a94e256459586ffcf469379f4459fe2 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Mon, 2 Sep 2024 13:06:39 +0200 Subject: [PATCH 05/12] Fix default parameter --- src/openapi_parser/specification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openapi_parser/specification.py b/src/openapi_parser/specification.py index 1b201a0..0b236f0 100644 --- a/src/openapi_parser/specification.py +++ b/src/openapi_parser/specification.py @@ -168,7 +168,7 @@ class Parameter: class Content: type: Union[ContentType, LooseContentType] schema: Schema - example: Optional[Any] + example: Optional[Any] = None examples: list[Any] = field(default_factory=list) # encoding: dict[str, Encoding] # TODO From c1b5a3d57ac4d6f93f77c06256d66a457ab295ce Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Mon, 2 Sep 2024 15:44:48 +0200 Subject: [PATCH 06/12] Fix Content init in tests --- src/openapi_parser/specification.py | 2 +- tests/builders/test_content_builder.py | 4 ++-- tests/openapi_fixture.py | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/openapi_parser/specification.py b/src/openapi_parser/specification.py index 0b236f0..1b201a0 100644 --- a/src/openapi_parser/specification.py +++ b/src/openapi_parser/specification.py @@ -168,7 +168,7 @@ class Parameter: class Content: type: Union[ContentType, LooseContentType] schema: Schema - example: Optional[Any] = None + example: Optional[Any] examples: list[Any] = field(default_factory=list) # encoding: dict[str, Encoding] # TODO diff --git a/tests/builders/test_content_builder.py b/tests/builders/test_content_builder.py index 151684c..66d4419 100644 --- a/tests/builders/test_content_builder.py +++ b/tests/builders/test_content_builder.py @@ -27,7 +27,7 @@ def _get_schema_factory_mock(expected_value: Schema) -> SchemaFactory: } }, [ - Content(type=ContentType.JSON, schema=string_schema, example="an example", examples=[]) + Content(type=ContentType.JSON, schema=string_schema, example=None, examples=[]) ], _get_schema_factory_mock(string_schema) ), @@ -40,7 +40,7 @@ def _get_schema_factory_mock(expected_value: Schema) -> SchemaFactory: } }, [ - Content(type=ContentType.JSON_TEXT, schema=string_schema, example="an example", examples=[]) + Content(type=ContentType.JSON_TEXT, schema=string_schema, example=None, examples=[]) ], _get_schema_factory_mock(string_schema) ), diff --git a/tests/openapi_fixture.py b/tests/openapi_fixture.py index 99f246b..a7ea8a9 100644 --- a/tests/openapi_fixture.py +++ b/tests/openapi_fixture.py @@ -345,7 +345,7 @@ def create_specification() -> Specification: request_body=RequestBody( description="New user model request", content=[ - Content(type=ContentType.JSON, schema=schema_user), + Content(type=ContentType.JSON, schema=schema_user, example=None, examples=[]) ] ), responses=[ @@ -366,6 +366,8 @@ def create_specification() -> Specification: ), ], ), + example=None, + examples=[] ), ] ), @@ -404,6 +406,8 @@ def create_specification() -> Specification: ), ], ), + example=None, + examples=[] ), ] ), From 8d7a94e27285cc15e18e2fe21cc1b0850319fc21 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Mon, 2 Sep 2024 16:11:30 +0200 Subject: [PATCH 07/12] Fix dataset on tests --- tests/openapi_fixture.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/openapi_fixture.py b/tests/openapi_fixture.py index a7ea8a9..dc7af70 100644 --- a/tests/openapi_fixture.py +++ b/tests/openapi_fixture.py @@ -70,7 +70,7 @@ Content( type=ContentType.JSON, schema=user_list_schema, - example="An example", + example=None, examples=[] ), ], @@ -106,7 +106,7 @@ ), ], ), - example="an example", + example=None, examples=[] ), ], @@ -141,7 +141,7 @@ ), ], ), - example="an example", + example=None, examples=[] ), ], From 443c06cde3b77a3e034f37473acbb0caededb82d Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Tue, 3 Sep 2024 11:19:56 +0200 Subject: [PATCH 08/12] Remove wrong imports --- tests/builders/test_path_builder.py | 1 - tests/builders/test_response_builder.py | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/builders/test_path_builder.py b/tests/builders/test_path_builder.py index bb16c97..0e5afb4 100644 --- a/tests/builders/test_path_builder.py +++ b/tests/builders/test_path_builder.py @@ -1,5 +1,4 @@ import copy -from random import sample from unittest.mock import MagicMock import pytest diff --git a/tests/builders/test_response_builder.py b/tests/builders/test_response_builder.py index 95c2f11..15ff8a5 100644 --- a/tests/builders/test_response_builder.py +++ b/tests/builders/test_response_builder.py @@ -1,4 +1,3 @@ -from tkinter.scrolledtext import example from typing import Any, Union from unittest.mock import MagicMock @@ -48,8 +47,7 @@ def _get_builder_mock(expected_value: Any) -> Union[ContentBuilder, HeaderBuilde "schema": { "type": "string", }, - "example": "an example", - "examples": ["example1", "example2"] + "example": "an example" } }, "headers": { From 13a49d9e9db408c3c6f54083a7b638296d785ca4 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Wed, 4 Sep 2024 09:29:54 +0200 Subject: [PATCH 09/12] Make example as default --- src/openapi_parser/builders/content.py | 2 +- tests/builders/test_content_builder.py | 4 ++-- tests/builders/test_operation_builder.py | 4 +--- tests/builders/test_path_builder.py | 2 +- tests/builders/test_request_builder.py | 12 +++--------- tests/builders/test_response_builder.py | 4 +--- tests/openapi_fixture.py | 14 ++------------ 7 files changed, 11 insertions(+), 31 deletions(-) diff --git a/src/openapi_parser/builders/content.py b/src/openapi_parser/builders/content.py index dd0ee2a..bfacaca 100644 --- a/src/openapi_parser/builders/content.py +++ b/src/openapi_parser/builders/content.py @@ -23,7 +23,7 @@ def build_list(self, data: dict) -> list[Content]: return [ self._create_content(content_type, content_value.get('schema', {}), content_value.get('example', None), - content_value.get('examples', [])) + content_value.get('examples', {})) for content_type, content_value in data.items() ] diff --git a/tests/builders/test_content_builder.py b/tests/builders/test_content_builder.py index 66d4419..58b0f46 100644 --- a/tests/builders/test_content_builder.py +++ b/tests/builders/test_content_builder.py @@ -27,7 +27,7 @@ def _get_schema_factory_mock(expected_value: Schema) -> SchemaFactory: } }, [ - Content(type=ContentType.JSON, schema=string_schema, example=None, examples=[]) + Content(type=ContentType.JSON, schema=string_schema) ], _get_schema_factory_mock(string_schema) ), @@ -40,7 +40,7 @@ def _get_schema_factory_mock(expected_value: Schema) -> SchemaFactory: } }, [ - Content(type=ContentType.JSON_TEXT, schema=string_schema, example=None, examples=[]) + Content(type=ContentType.JSON_TEXT, schema=string_schema) ], _get_schema_factory_mock(string_schema) ), diff --git a/tests/builders/test_operation_builder.py b/tests/builders/test_operation_builder.py index 9bdac27..7e2f6b2 100644 --- a/tests/builders/test_operation_builder.py +++ b/tests/builders/test_operation_builder.py @@ -26,7 +26,7 @@ def _get_list_builder_mock(expected): response_schema = Response( code=200, description="Pet updated.", - content=[Content(type=ContentType.JSON, schema=Object(type=DataType.OBJECT), example="an example", examples=[])], + content=[Content(type=ContentType.JSON, schema=Object(type=DataType.OBJECT))], is_default=False, ) @@ -64,8 +64,6 @@ def _get_list_builder_mock(expected): ), ], ), - example="an example", - examples=[], ), ] ) diff --git a/tests/builders/test_path_builder.py b/tests/builders/test_path_builder.py index 0e5afb4..466cab2 100644 --- a/tests/builders/test_path_builder.py +++ b/tests/builders/test_path_builder.py @@ -43,7 +43,7 @@ def _get_builder_list_mock(expected_value): Response( code=200, description="pet response", - content=[Content(type=ContentType.JSON, schema=array_schema, example="an example", examples=[])], + content=[Content(type=ContentType.JSON, schema=array_schema)], is_default=False, ) ], diff --git a/tests/builders/test_request_builder.py b/tests/builders/test_request_builder.py index 041d52b..95a3394 100644 --- a/tests/builders/test_request_builder.py +++ b/tests/builders/test_request_builder.py @@ -23,9 +23,7 @@ def _get_content_builder_mock(expected_value: Any) -> ContentBuilder: properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ), - example="an example", - examples=[] + ) ) ] @@ -37,9 +35,7 @@ def _get_content_builder_mock(expected_value: Any) -> ContentBuilder: properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ), - example="an example", - examples=[] + ) ), Content( type=ContentType.FORM, @@ -48,9 +44,7 @@ def _get_content_builder_mock(expected_value: Any) -> ContentBuilder: properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ), - example="an example", - examples=[] + ) ), ] diff --git a/tests/builders/test_response_builder.py b/tests/builders/test_response_builder.py index 15ff8a5..669b6f9 100644 --- a/tests/builders/test_response_builder.py +++ b/tests/builders/test_response_builder.py @@ -24,9 +24,7 @@ def _get_builder_mock(expected_value: Any) -> Union[ContentBuilder, HeaderBuilde properties=[ Property(name="login", schema=String(type=DataType.STRING)) ] - ), - example="an example", - examples=[] + ) ) ] diff --git a/tests/openapi_fixture.py b/tests/openapi_fixture.py index dc7af70..890aabf 100644 --- a/tests/openapi_fixture.py +++ b/tests/openapi_fixture.py @@ -69,9 +69,7 @@ content=[ Content( type=ContentType.JSON, - schema=user_list_schema, - example=None, - examples=[] + schema=user_list_schema ), ], is_default=False, @@ -106,8 +104,6 @@ ), ], ), - example=None, - examples=[] ), ], ) @@ -141,8 +137,6 @@ ), ], ), - example=None, - examples=[] ), ], ) @@ -345,7 +339,7 @@ def create_specification() -> Specification: request_body=RequestBody( description="New user model request", content=[ - Content(type=ContentType.JSON, schema=schema_user, example=None, examples=[]) + Content(type=ContentType.JSON, schema=schema_user) ] ), responses=[ @@ -366,8 +360,6 @@ def create_specification() -> Specification: ), ], ), - example=None, - examples=[] ), ] ), @@ -406,8 +398,6 @@ def create_specification() -> Specification: ), ], ), - example=None, - examples=[] ), ] ), From f0aa105e4fd06f1f902e2fb3f0f4a57355446555 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Wed, 4 Sep 2024 09:31:17 +0200 Subject: [PATCH 10/12] Using dict type for new spec examples --- src/openapi_parser/specification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openapi_parser/specification.py b/src/openapi_parser/specification.py index 1b201a0..9b2299d 100644 --- a/src/openapi_parser/specification.py +++ b/src/openapi_parser/specification.py @@ -169,7 +169,7 @@ class Content: type: Union[ContentType, LooseContentType] schema: Schema example: Optional[Any] - examples: list[Any] = field(default_factory=list) + examples: dict[str, Any] = field(default_factory=dict) # encoding: dict[str, Encoding] # TODO From cbaa102d111739f6f3a38206444386439bcdff73 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Wed, 4 Sep 2024 09:38:01 +0200 Subject: [PATCH 11/12] Remove useless changes --- src/openapi_parser/builders/content.py | 2 +- tests/openapi_fixture.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openapi_parser/builders/content.py b/src/openapi_parser/builders/content.py index bfacaca..41e8c06 100644 --- a/src/openapi_parser/builders/content.py +++ b/src/openapi_parser/builders/content.py @@ -28,7 +28,7 @@ def build_list(self, data: dict) -> list[Content]: in data.items() ] - def _create_content(self, content_type: str, schema: dict, example: Any, examples: list) -> Content: + def _create_content(self, content_type: str, schema: dict, example: Any, examples: dict) -> Content: logger.debug(f"Content building [type={content_type}]") ContentTypeCls: ContentTypeType = ContentType if self.strict_enum else LooseContentType return Content( diff --git a/tests/openapi_fixture.py b/tests/openapi_fixture.py index 890aabf..b02047c 100644 --- a/tests/openapi_fixture.py +++ b/tests/openapi_fixture.py @@ -103,7 +103,7 @@ ) ), ], - ), + ) ), ], ) @@ -136,7 +136,7 @@ ) ), ], - ), + ) ), ], ) From 2fb92eb585b3bd0b46933e6d71dab152344a8c91 Mon Sep 17 00:00:00 2001 From: Hong-Thai Nguyen Date: Wed, 4 Sep 2024 10:51:33 +0200 Subject: [PATCH 12/12] Add default example --- src/openapi_parser/specification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openapi_parser/specification.py b/src/openapi_parser/specification.py index 9b2299d..b79ca5b 100644 --- a/src/openapi_parser/specification.py +++ b/src/openapi_parser/specification.py @@ -168,7 +168,7 @@ class Parameter: class Content: type: Union[ContentType, LooseContentType] schema: Schema - example: Optional[Any] + example: Optional[Any] = None examples: dict[str, Any] = field(default_factory=dict) # encoding: dict[str, Encoding] # TODO