Skip to content

Commit 92fe9e1

Browse files
committed
feat: added support for 'content' field in parameters
1 parent c360e47 commit 92fe9e1

29 files changed

+1218
-710
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ clean: ## Remove build files
2323
@echo "Temporary files were clear"
2424

2525
test: ## Run code tests
26-
@pipenv run python -m pytest -q
26+
@pipenv run python -m pytest -qv
2727

2828
sync: ## Sync with Pipfile packages list
2929
@pipenv sync

Pipfile

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ url = "https://pypi.org/simple"
44
verify_ssl = true
55

66
[dev-packages]
7-
twine = ">=3.3.0"
8-
wheel = ">=0.35.1"
9-
mypy = ">=0.800"
10-
pytest = ">=6.2.2"
11-
build = "*"
7+
twine = ">=4.0.2"
8+
wheel = ">=0.45.1"
9+
build = ">=1.0.3"
10+
mypy = ">=1.15.0"
11+
pytest = ">=8.3.5"
1212

1313
[packages]
14-
prance = ">=0.20.2"
15-
openapi-spec-validator = "==0.6.0"
14+
openapi-spec-validator = ">=0.7.1"
15+
prance = ">=23.6.21.0"
1616

1717
[requires]
1818
python_version = "3.9"

Pipfile.lock

+1,007-623
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
-33
Original file line numberDiff line numberDiff line change
@@ -1,33 +0,0 @@
1-
from .info import InfoBuilder
2-
from .server import ServerBuilder
3-
from .tag import TagBuilder
4-
from .external_doc import ExternalDocBuilder
5-
from .schema import SchemaFactory
6-
from .parameter import ParameterBuilder
7-
from .header import HeaderBuilder
8-
from .content import ContentBuilder
9-
from .request import RequestBuilder
10-
from .response import ResponseBuilder
11-
from .operation import OperationBuilder
12-
from .path import PathBuilder
13-
from .oauth_flow import OAuthFlowBuilder
14-
from .security import SecurityBuilder
15-
from .schemas import SchemasBuilder
16-
17-
__all__ = [
18-
"InfoBuilder",
19-
"ServerBuilder",
20-
"TagBuilder",
21-
"ExternalDocBuilder",
22-
"SchemaFactory",
23-
"ParameterBuilder",
24-
"HeaderBuilder",
25-
"ContentBuilder",
26-
"RequestBuilder",
27-
"ResponseBuilder",
28-
"OperationBuilder",
29-
"PathBuilder",
30-
"OAuthFlowBuilder",
31-
"SecurityBuilder",
32-
"SchemasBuilder",
33-
]

src/openapi_parser/builders/content.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import logging
22
from typing import Type, Union, Any
33

4-
from . import SchemaFactory
4+
from .schema import SchemaFactory
55
from ..enumeration import ContentType
6-
from ..specification import Content
76
from ..loose_types import LooseContentType
7+
from ..specification import Content
88

99
logger = logging.getLogger(__name__)
1010

src/openapi_parser/builders/header.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22

3-
from . import SchemaFactory
43
from .common import extract_typed_props, PropertyMeta, extract_extension_attributes
4+
from .schema import SchemaFactory
55
from ..specification import Header
66

77
logger = logging.getLogger(__name__)

src/openapi_parser/builders/operation.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import logging
22
from typing import Dict
33

4-
from . import ExternalDocBuilder, ParameterBuilder, RequestBuilder, ResponseBuilder
54
from .common import extract_typed_props, PropertyMeta, extract_extension_attributes
5+
from .external_doc import ExternalDocBuilder
6+
from .parameter import ParameterBuilder
7+
from .request import RequestBuilder
8+
from .response import ResponseBuilder
69
from ..enumeration import OperationMethod
710
from ..specification import Operation, Response
811

src/openapi_parser/builders/parameter.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import logging
22
from typing import List
33

4-
from . import SchemaFactory
54
from .common import extract_typed_props, PropertyMeta, extract_extension_attributes
5+
from .content import ContentBuilder
6+
from .schema import SchemaFactory
67
from ..enumeration import ParameterLocation, HeaderParameterStyle, PathParameterStyle, QueryParameterStyle, \
78
CookieParameterStyle
89
from ..specification import Parameter
@@ -26,9 +27,11 @@
2627

2728
class ParameterBuilder:
2829
schema_factory: SchemaFactory
30+
content_builder: ContentBuilder
2931

30-
def __init__(self, schema_factory: SchemaFactory) -> None:
32+
def __init__(self, schema_factory: SchemaFactory, content_builder: ContentBuilder) -> None:
3133
self.schema_factory = schema_factory
34+
self.content_builder = content_builder
3235

3336
def build_list(self, parameters: List[dict]) -> list[Parameter]:
3437
return [self.build(parameter) for parameter in parameters]
@@ -41,6 +44,7 @@ def build(self, data: dict) -> Parameter:
4144
"location": PropertyMeta(name="in", cast=ParameterLocation),
4245
"required": PropertyMeta(name="required", cast=None),
4346
"schema": PropertyMeta(name="schema", cast=self.schema_factory.create),
47+
"content": PropertyMeta(name="content", cast=self.content_builder.build_list),
4448
"description": PropertyMeta(name="description", cast=str),
4549
"deprecated": PropertyMeta(name="deprecated", cast=None),
4650
"explode": PropertyMeta(name="explode", cast=None),

src/openapi_parser/builders/path.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import logging
22
from typing import Dict
33

4-
from . import OperationBuilder, ParameterBuilder
54
from .common import extract_typed_props, PropertyMeta, extract_extension_attributes
5+
from .operation import OperationBuilder
6+
from .parameter import ParameterBuilder
67
from ..enumeration import OperationMethod
78
from ..specification import Path
89

src/openapi_parser/builders/request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22

3-
from . import ContentBuilder
43
from .common import extract_typed_props, PropertyMeta
4+
from .content import ContentBuilder
55
from ..specification import RequestBody
66

77
logger = logging.getLogger(__name__)

src/openapi_parser/builders/response.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import logging
22
from typing import Union
33

4-
from . import ContentBuilder, HeaderBuilder
54
from .common import extract_typed_props, PropertyMeta
5+
from .content import ContentBuilder
6+
from .header import HeaderBuilder
67
from ..specification import Response
78

89
logger = logging.getLogger(__name__)
+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import logging
22

3+
from .schema import SchemaFactory
34
from ..specification import Schema
4-
from . import SchemaFactory
5-
65

76
logger = logging.getLogger(__name__)
87

8+
99
class SchemasBuilder:
1010
schema_factory: SchemaFactory
1111

@@ -16,6 +16,6 @@ def build_collection(self, schemas: dict) -> dict[str, Schema]:
1616
logger.debug(f"Schemas parsing: {schemas.keys()}")
1717

1818
return {
19-
key : self.schema_factory.create(value)
19+
key: self.schema_factory.create(value)
2020
for key, value in schemas.items()
2121
}

src/openapi_parser/parser.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
11
import logging
2-
from typing import Optional
2+
from typing import Optional # noqa: F401
33

4-
from .builders import *
54
from .builders.common import extract_typed_props, PropertyMeta
5+
from .builders.content import ContentBuilder
6+
from .builders.external_doc import ExternalDocBuilder
7+
from .builders.header import HeaderBuilder
8+
from .builders.info import InfoBuilder
9+
from .builders.oauth_flow import OAuthFlowBuilder
10+
from .builders.operation import OperationBuilder
11+
from .builders.parameter import ParameterBuilder
12+
from .builders.path import PathBuilder
13+
from .builders.request import RequestBuilder
14+
from .builders.response import ResponseBuilder
15+
from .builders.schema import SchemaFactory
16+
from .builders.schemas import SchemasBuilder
17+
from .builders.security import SecurityBuilder
18+
from .builders.server import ServerBuilder
19+
from .builders.tag import TagBuilder
620
from .errors import ParserError
721
from .resolver import OpenAPIResolver
822
from .specification import *
@@ -89,7 +103,7 @@ def _create_parser(strict_enum: bool = True) -> Parser:
89103
schema_factory = SchemaFactory(strict_enum=strict_enum)
90104
content_builder = ContentBuilder(schema_factory, strict_enum=strict_enum)
91105
header_builder = HeaderBuilder(schema_factory)
92-
parameter_builder = ParameterBuilder(schema_factory)
106+
parameter_builder = ParameterBuilder(schema_factory, content_builder)
93107
schemas_builder = SchemasBuilder(schema_factory)
94108
response_builder = ResponseBuilder(content_builder, header_builder)
95109
request_builder = RequestBuilder(content_builder)

src/openapi_parser/specification.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ class Object(Schema):
152152
class Parameter:
153153
name: str
154154
location: ParameterLocation
155-
schema: Schema
155+
schema: Optional[Schema] = None
156+
content: Optional[list['Content']] = None
156157
required: Optional[bool] = field(default=False)
157158
description: Optional[str] = None
158159
# example: Optional[Any] # TODO

tests/builders/test_content_builder.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import pytest
44

5-
from openapi_parser.builders import ContentBuilder, SchemaFactory
5+
from openapi_parser.builders.content import ContentBuilder
6+
from openapi_parser.builders.schema import SchemaFactory
67
from openapi_parser.enumeration import ContentType, DataType
78
from openapi_parser.specification import Content, Integer, Schema, String
89

tests/builders/test_external_doc_builder.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pytest
44

5-
from openapi_parser.builders import ExternalDocBuilder
5+
from openapi_parser.builders.external_doc import ExternalDocBuilder
66
from openapi_parser.specification import ExternalDoc
77

88
data_provider = (

tests/builders/test_header_builder.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import pytest
44

5-
from openapi_parser.builders import HeaderBuilder, SchemaFactory
5+
from openapi_parser.builders.header import HeaderBuilder
6+
from openapi_parser.builders.schema import SchemaFactory
67
from openapi_parser.enumeration import DataType
78
from openapi_parser.specification import Header, Integer, Schema, String
89

tests/builders/test_info_builder.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from openapi_parser.builders import InfoBuilder
3+
from openapi_parser.builders.info import InfoBuilder
44
from openapi_parser.specification import Contact, Info, License
55

66
data_provider = (

tests/builders/test_oauth_flow_builder.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pytest
44

5-
from openapi_parser.builders import OAuthFlowBuilder
5+
from openapi_parser.builders.oauth_flow import OAuthFlowBuilder
66
from openapi_parser.enumeration import OAuthFlowType
77
from openapi_parser.specification import OAuthFlow
88

tests/builders/test_operation_builder.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import pytest
44

5-
from openapi_parser.builders import ExternalDocBuilder, OperationBuilder, ParameterBuilder, RequestBuilder, \
6-
ResponseBuilder
5+
from openapi_parser.builders.external_doc import ExternalDocBuilder
6+
from openapi_parser.builders.operation import OperationBuilder
7+
from openapi_parser.builders.parameter import ParameterBuilder
8+
from openapi_parser.builders.request import RequestBuilder
9+
from openapi_parser.builders.response import ResponseBuilder
710
from openapi_parser.enumeration import DataType, ContentType, OperationMethod, ParameterLocation
811
from openapi_parser.specification import Content, ExternalDoc, Object, Operation, Parameter, Property, RequestBody, \
912
Response, String
@@ -68,7 +71,6 @@ def _get_list_builder_mock(expected):
6871
]
6972
)
7073

71-
7274
data_provider = (
7375
(
7476
{

0 commit comments

Comments
 (0)