Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit ffe148a

Browse files
authored
Fixes issue 54, additionalProperties referenced in composed schema when it doesn't exist (#55)
* Sample spec updated * Adds fix for issue * Adds verification test * Fixes test
1 parent a4f38b7 commit ffe148a

File tree

10 files changed

+365
-1
lines changed

10 files changed

+365
-1
lines changed

modules/openapi-json-schema-generator/src/main/resources/python/model_templates/schema_composed_or_anytype.handlebars

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,8 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}
6868

6969
{{> model_templates/property_type_hints }}
7070

71+
{{#if additionalProperties}}
7172
{{> model_templates/new }}
73+
{{else}}
74+
{{> model_templates/new addPropsUnset=true }}
75+
{{/if}}

modules/openapi-json-schema-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2991,4 +2991,18 @@ components:
29912991
required: [ test ]
29922992
properties:
29932993
name:
2994-
type: string
2994+
type: string
2995+
AbstractStepMessage:
2996+
required:
2997+
- description
2998+
- discriminator
2999+
- sequenceNumber
3000+
type: object
3001+
properties:
3002+
discriminator:
3003+
type: string
3004+
description: Abstract Step
3005+
discriminator:
3006+
propertyName: discriminator
3007+
anyOf:
3008+
- $ref: '#/components/schemas/AbstractStepMessage'

samples/openapi3/client/petstore/python/.openapi-generator/FILES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ docs/apis/tags/FakeClassnameTags123Api.md
99
docs/apis/tags/PetApi.md
1010
docs/apis/tags/StoreApi.md
1111
docs/apis/tags/UserApi.md
12+
docs/models/AbstractStepMessage.md
1213
docs/models/AdditionalPropertiesClass.md
1314
docs/models/AdditionalPropertiesValidator.md
1415
docs/models/AdditionalPropertiesWithArrayOfEnums.md
@@ -144,6 +145,8 @@ petstore_api/apis/tags/user_api.py
144145
petstore_api/configuration.py
145146
petstore_api/exceptions.py
146147
petstore_api/model/__init__.py
148+
petstore_api/model/abstract_step_message.py
149+
petstore_api/model/abstract_step_message.pyi
147150
petstore_api/model/additional_properties_class.py
148151
petstore_api/model/additional_properties_class.pyi
149152
petstore_api/model/additional_properties_validator.py

samples/openapi3/client/petstore/python/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ Class | Method | HTTP request | Description
231231

232232
## Documentation For Models
233233

234+
- [AbstractStepMessage](docs/models/AbstractStepMessage.md)
234235
- [AdditionalPropertiesClass](docs/models/AdditionalPropertiesClass.md)
235236
- [AdditionalPropertiesValidator](docs/models/AdditionalPropertiesValidator.md)
236237
- [AdditionalPropertiesWithArrayOfEnums](docs/models/AdditionalPropertiesWithArrayOfEnums.md)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# petstore_api.model.abstract_step_message.AbstractStepMessage
2+
3+
Abstract Step
4+
5+
## Model Type Info
6+
Input Type | Accessed Type | Description | Notes
7+
------------ | ------------- | ------------- | -------------
8+
dict, frozendict.frozendict, | frozendict.frozendict, | Abstract Step |
9+
10+
### Dictionary Keys
11+
Key | Input Type | Accessed Type | Description | Notes
12+
------------ | ------------- | ------------- | ------------- | -------------
13+
**sequenceNumber** | dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, | frozendict.frozendict, str, decimal.Decimal, BoolClass, NoneClass, tuple, bytes, FileIO | |
14+
**description** | dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, | frozendict.frozendict, str, decimal.Decimal, BoolClass, NoneClass, tuple, bytes, FileIO | |
15+
**discriminator** | str, | str, | |
16+
**any_string_name** | dict, frozendict.frozendict, str, date, datetime, int, float, bool, decimal.Decimal, None, list, tuple, bytes, io.FileIO, io.BufferedReader | frozendict.frozendict, str, BoolClass, decimal.Decimal, NoneClass, tuple, bytes, FileIO | any string name can be used but the value must be the correct type | [optional]
17+
18+
### Composed Schemas (allOf/anyOf/oneOf/not)
19+
#### anyOf
20+
Class Name | Input Type | Accessed Type | Description | Notes
21+
------------- | ------------- | ------------- | ------------- | -------------
22+
[AbstractStepMessage](AbstractStepMessage.md) | [**AbstractStepMessage**](AbstractStepMessage.md) | [**AbstractStepMessage**](AbstractStepMessage.md) | |
23+
24+
[[Back to Model list]](../../README.md#documentation-for-models) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to README]](../../README.md)
25+
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# coding: utf-8
2+
3+
"""
4+
OpenAPI Petstore
5+
6+
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Generated by: https://openapi-generator.tech
10+
"""
11+
12+
from datetime import date, datetime # noqa: F401
13+
import decimal # noqa: F401
14+
import functools # noqa: F401
15+
import io # noqa: F401
16+
import re # noqa: F401
17+
import typing # noqa: F401
18+
import typing_extensions # noqa: F401
19+
import uuid # noqa: F401
20+
21+
import frozendict # noqa: F401
22+
23+
from petstore_api import schemas # noqa: F401
24+
25+
26+
class AbstractStepMessage(
27+
schemas.ComposedBase,
28+
schemas.DictSchema
29+
):
30+
"""NOTE: This class is auto generated by OpenAPI Generator.
31+
Ref: https://openapi-generator.tech
32+
33+
Do not edit the class manually.
34+
35+
Abstract Step
36+
"""
37+
38+
39+
class MetaOapg:
40+
required = {
41+
"sequenceNumber",
42+
"description",
43+
"discriminator",
44+
}
45+
46+
@staticmethod
47+
def discriminator():
48+
return {
49+
'discriminator': {
50+
'AbstractStepMessage': AbstractStepMessage,
51+
}
52+
}
53+
54+
class properties:
55+
discriminator = schemas.StrSchema
56+
__annotations__ = {
57+
"discriminator": discriminator,
58+
}
59+
60+
@classmethod
61+
@functools.lru_cache()
62+
def any_of(cls):
63+
# we need this here to make our import statements work
64+
# we must store _composed_schemas in here so the code is only run
65+
# when we invoke this method. If we kept this at the class
66+
# level we would get an error because the class level
67+
# code would be run when this module is imported, and these composed
68+
# classes don't exist yet because their module has not finished
69+
# loading
70+
return [
71+
AbstractStepMessage,
72+
]
73+
74+
75+
sequenceNumber: schemas.AnyTypeSchema
76+
description: schemas.AnyTypeSchema
77+
discriminator: MetaOapg.properties.discriminator
78+
79+
@typing.overload
80+
def __getitem__(self, name: typing_extensions.Literal["discriminator"]) -> MetaOapg.properties.discriminator: ...
81+
82+
@typing.overload
83+
def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
84+
85+
def __getitem__(self, name: typing.Union[typing_extensions.Literal["discriminator", ], str]):
86+
# dict_instance[name] accessor
87+
return super().__getitem__(name)
88+
89+
90+
@typing.overload
91+
def get_item_oapg(self, name: typing_extensions.Literal["discriminator"]) -> MetaOapg.properties.discriminator: ...
92+
93+
@typing.overload
94+
def get_item_oapg(self, name: str) -> typing.Union[schemas.UnsetAnyTypeSchema, schemas.Unset]: ...
95+
96+
def get_item_oapg(self, name: typing.Union[typing_extensions.Literal["discriminator", ], str]):
97+
return super().get_item_oapg(name)
98+
99+
100+
def __new__(
101+
cls,
102+
*args: typing.Union[dict, frozendict.frozendict, ],
103+
sequenceNumber: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, ],
104+
description: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, ],
105+
discriminator: typing.Union[MetaOapg.properties.discriminator, str, ],
106+
_configuration: typing.Optional[schemas.Configuration] = None,
107+
**kwargs: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, None, list, tuple, bytes],
108+
) -> 'AbstractStepMessage':
109+
return super().__new__(
110+
cls,
111+
*args,
112+
sequenceNumber=sequenceNumber,
113+
description=description,
114+
discriminator=discriminator,
115+
_configuration=_configuration,
116+
**kwargs,
117+
)
118+
119+
from petstore_api.model.abstract_step_message import AbstractStepMessage
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# coding: utf-8
2+
3+
"""
4+
OpenAPI Petstore
5+
6+
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Generated by: https://openapi-generator.tech
10+
"""
11+
12+
from datetime import date, datetime # noqa: F401
13+
import decimal # noqa: F401
14+
import functools # noqa: F401
15+
import io # noqa: F401
16+
import re # noqa: F401
17+
import typing # noqa: F401
18+
import typing_extensions # noqa: F401
19+
import uuid # noqa: F401
20+
21+
import frozendict # noqa: F401
22+
23+
from petstore_api import schemas # noqa: F401
24+
25+
26+
class AbstractStepMessage(
27+
schemas.ComposedBase,
28+
schemas.DictSchema
29+
):
30+
"""NOTE: This class is auto generated by OpenAPI Generator.
31+
Ref: https://openapi-generator.tech
32+
33+
Do not edit the class manually.
34+
35+
Abstract Step
36+
"""
37+
38+
39+
class MetaOapg:
40+
required = {
41+
"sequenceNumber",
42+
"description",
43+
"discriminator",
44+
}
45+
46+
@staticmethod
47+
def discriminator():
48+
return {
49+
'discriminator': {
50+
'AbstractStepMessage': AbstractStepMessage,
51+
}
52+
}
53+
54+
class properties:
55+
discriminator = schemas.StrSchema
56+
__annotations__ = {
57+
"discriminator": discriminator,
58+
}
59+
60+
@classmethod
61+
@functools.lru_cache()
62+
def any_of(cls):
63+
# we need this here to make our import statements work
64+
# we must store _composed_schemas in here so the code is only run
65+
# when we invoke this method. If we kept this at the class
66+
# level we would get an error because the class level
67+
# code would be run when this module is imported, and these composed
68+
# classes don't exist yet because their module has not finished
69+
# loading
70+
return [
71+
AbstractStepMessage,
72+
]
73+
74+
75+
sequenceNumber: schemas.AnyTypeSchema
76+
description: schemas.AnyTypeSchema
77+
discriminator: MetaOapg.properties.discriminator
78+
79+
@typing.overload
80+
def __getitem__(self, name: typing_extensions.Literal["discriminator"]) -> MetaOapg.properties.discriminator: ...
81+
82+
@typing.overload
83+
def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
84+
85+
def __getitem__(self, name: typing.Union[typing_extensions.Literal["discriminator", ], str]):
86+
# dict_instance[name] accessor
87+
return super().__getitem__(name)
88+
89+
90+
@typing.overload
91+
def get_item_oapg(self, name: typing_extensions.Literal["discriminator"]) -> MetaOapg.properties.discriminator: ...
92+
93+
@typing.overload
94+
def get_item_oapg(self, name: str) -> typing.Union[schemas.UnsetAnyTypeSchema, schemas.Unset]: ...
95+
96+
def get_item_oapg(self, name: typing.Union[typing_extensions.Literal["discriminator", ], str]):
97+
return super().get_item_oapg(name)
98+
99+
100+
def __new__(
101+
cls,
102+
*args: typing.Union[dict, frozendict.frozendict, ],
103+
sequenceNumber: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, ],
104+
description: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader, ],
105+
discriminator: typing.Union[MetaOapg.properties.discriminator, str, ],
106+
_configuration: typing.Optional[schemas.Configuration] = None,
107+
**kwargs: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, None, list, tuple, bytes],
108+
) -> 'AbstractStepMessage':
109+
return super().__new__(
110+
cls,
111+
*args,
112+
sequenceNumber=sequenceNumber,
113+
description=description,
114+
discriminator=discriminator,
115+
_configuration=_configuration,
116+
**kwargs,
117+
)
118+
119+
from petstore_api.model.abstract_step_message import AbstractStepMessage

samples/openapi3/client/petstore/python/petstore_api/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# import sys
1212
# sys.setrecursionlimit(n)
1313

14+
from petstore_api.model.abstract_step_message import AbstractStepMessage
1415
from petstore_api.model.additional_properties_class import AdditionalPropertiesClass
1516
from petstore_api.model.additional_properties_validator import AdditionalPropertiesValidator
1617
from petstore_api.model.additional_properties_with_array_of_enums import AdditionalPropertiesWithArrayOfEnums
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# coding: utf-8
2+
3+
"""
4+
OpenAPI Petstore
5+
6+
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Generated by: https://openapi-generator.tech
10+
"""
11+
12+
import unittest
13+
14+
import petstore_api
15+
from petstore_api.model.abstract_step_message import AbstractStepMessage
16+
from petstore_api import configuration
17+
18+
19+
class TestAbstractStepMessage(unittest.TestCase):
20+
"""AbstractStepMessage unit test stubs"""
21+
_configuration = configuration.Configuration()
22+
23+
24+
if __name__ == '__main__':
25+
unittest.main()

0 commit comments

Comments
 (0)