Skip to content

Commit c0b9916

Browse files
committed
Extensible schema models
1 parent 4815905 commit c0b9916

File tree

24 files changed

+179
-24
lines changed

24 files changed

+179
-24
lines changed

Diff for: openapi_core/schema/components/factories.py

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from openapi_core.compat import lru_cache
22
from openapi_core.schema.components.models import Components
3+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
34
from openapi_core.schema.schemas.generators import SchemasGenerator
45
from openapi_core.schema.security_schemes.generators import (
56
SecuritySchemesGenerator,
@@ -21,6 +22,8 @@ def create(self, components_spec):
2122
request_bodies_spec = components_deref.get('requestBodies', {})
2223
security_schemes_spec = components_deref.get('securitySchemes', {})
2324

25+
extensions = self.extensions_generator.generate(components_deref)
26+
2427
schemas = self.schemas_generator.generate(schemas_spec)
2528
responses = self._generate_response(responses_spec)
2629
parameters = self._generate_parameters(parameters_spec)
@@ -30,13 +33,19 @@ def create(self, components_spec):
3033
return Components(
3134
schemas=list(schemas), responses=responses, parameters=parameters,
3235
request_bodies=request_bodies, security_schemes=security_schemes,
36+
extensions=extensions,
3337
)
3438

3539
@property
3640
@lru_cache()
3741
def schemas_generator(self):
3842
return SchemasGenerator(self.dereferencer, self.schemas_registry)
3943

44+
@property
45+
@lru_cache()
46+
def extensions_generator(self):
47+
return ExtensionsGenerator(self.dereferencer)
48+
4049
def _generate_response(self, responses_spec):
4150
return responses_spec
4251

Diff for: openapi_core/schema/components/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ class Components(object):
33

44
def __init__(
55
self, schemas=None, responses=None, parameters=None,
6-
request_bodies=None, security_schemes=None):
6+
request_bodies=None, security_schemes=None, extensions=None):
77
self.schemas = schemas and dict(schemas) or {}
88
self.responses = responses and dict(responses) or {}
99
self.parameters = parameters and dict(parameters) or {}
1010
self.request_bodies = request_bodies and dict(request_bodies) or {}
1111
self.security_schemes = (
1212
security_schemes and dict(security_schemes) or {}
1313
)
14+
15+
self.extensions = extensions and dict(extensions) or {}

Diff for: openapi_core/schema/contacts/factories.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""OpenAPI core contacts factories module"""
2+
from openapi_core.compat import lru_cache
23
from openapi_core.schema.contacts.models import Contact
4+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
35

46

57
class ContactFactory(object):
@@ -12,4 +14,12 @@ def create(self, contact_spec):
1214
name = contact_deref.get('name')
1315
url = contact_deref.get('url')
1416
email = contact_deref.get('email')
15-
return Contact(name=name, url=url, email=email)
17+
18+
extensions = self.extensions_generator.generate(contact_deref)
19+
20+
return Contact(name=name, url=url, email=email, extensions=extensions)
21+
22+
@property
23+
@lru_cache()
24+
def extensions_generator(self):
25+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/contacts/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
class Contact(object):
55

6-
def __init__(self, name=None, url=None, email=None):
6+
def __init__(self, name=None, url=None, email=None, extensions=None):
77
self.name = name
88
self.url = url
99
self.email = email
10+
11+
self.extensions = extensions and dict(extensions) or {}

Diff for: openapi_core/schema/external_docs/factories.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
"""OpenAPI core external docs factories module"""
2+
from openapi_core.compat import lru_cache
3+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
24
from openapi_core.schema.external_docs.models import ExternalDocumentation
35

46

@@ -11,4 +13,14 @@ def create(self, external_doc_spec):
1113
url = external_doc_spec['url']
1214
description = external_doc_spec.get('description')
1315

14-
return ExternalDocumentation(url, description=description)
16+
extensions = self.extensions_generator.generate(external_doc_spec)
17+
18+
return ExternalDocumentation(
19+
url,
20+
description=description, extensions=extensions,
21+
)
22+
23+
@property
24+
@lru_cache()
25+
def extensions_generator(self):
26+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/external_docs/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
class ExternalDocumentation(object):
55
"""Represents an OpenAPI External Documentation."""
66

7-
def __init__(self, url, description=None):
7+
def __init__(self, url, description=None, extensions=None):
88
self.url = url
99
self.description = description
10+
11+
self.extensions = extensions and dict(extensions) or {}

Diff for: openapi_core/schema/infos/factories.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""OpenAPI core infos factories module"""
22
from openapi_core.compat import lru_cache
33
from openapi_core.schema.contacts.factories import ContactFactory
4+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
45
from openapi_core.schema.infos.models import Info
56
from openapi_core.schema.licenses.factories import LicenseFactory
67

@@ -17,6 +18,8 @@ def create(self, info_spec):
1718
description = info_deref.get('description')
1819
terms_of_service = info_deref.get('termsOfService')
1920

21+
extensions = self.extensions_generator.generate(info_deref)
22+
2023
contact = None
2124
if 'contact' in info_deref:
2225
contact_spec = info_deref.get('contact')
@@ -30,7 +33,7 @@ def create(self, info_spec):
3033
return Info(
3134
title, version,
3235
description=description, terms_of_service=terms_of_service,
33-
contact=contact, license=license,
36+
contact=contact, license=license, extensions=extensions,
3437
)
3538

3639
@property
@@ -42,3 +45,8 @@ def contact_factory(self):
4245
@lru_cache()
4346
def license_factory(self):
4447
return LicenseFactory(self.dereferencer)
48+
49+
@property
50+
@lru_cache()
51+
def extensions_generator(self):
52+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/infos/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ class Info(object):
55

66
def __init__(
77
self, title, version, description=None, terms_of_service=None,
8-
contact=None, license=None,
8+
contact=None, license=None, extensions=None,
99
):
1010
self.title = title
1111
self.version = version
1212
self.description = description
1313
self.terms_of_service = terms_of_service
1414
self.contact = contact
1515
self.license = license
16+
17+
self.extensions = extensions and dict(extensions) or {}

Diff for: openapi_core/schema/licenses/factories.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
"""OpenAPI core licenses factories module"""
2+
from openapi_core.compat import lru_cache
3+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
24
from openapi_core.schema.licenses.models import License
35

46

@@ -11,4 +13,12 @@ def create(self, license_spec):
1113
license_deref = self.dereferencer.dereference(license_spec)
1214
name = license_deref['name']
1315
url = license_deref.get('url')
14-
return License(name, url=url)
16+
17+
extensions = self.extensions_generator.generate(license_deref)
18+
19+
return License(name, url=url, extensions=extensions)
20+
21+
@property
22+
@lru_cache()
23+
def extensions_generator(self):
24+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/licenses/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
class License(object):
55

6-
def __init__(self, name, url=None):
6+
def __init__(self, name, url=None, extensions=None):
77
self.name = name
88
self.url = url
9+
10+
self.extensions = extensions and dict(extensions) or {}

Diff for: openapi_core/schema/media_types/generators.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""OpenAPI core media types generators module"""
22
from six import iteritems
33

4+
from openapi_core.compat import lru_cache
5+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
46
from openapi_core.schema.media_types.models import MediaType
57

68

@@ -21,8 +23,18 @@ def generate(self, content):
2123
else:
2224
example = example_spec
2325

26+
extensions = self.extensions_generator.generate(media_type)
27+
2428
schema = None
2529
if schema_spec:
2630
schema, _ = self.schemas_registry.get_or_create(schema_spec)
2731

28-
yield mimetype, MediaType(mimetype, schema=schema, example=example)
32+
yield mimetype, MediaType(
33+
mimetype,
34+
schema=schema, example=example, extensions=extensions,
35+
)
36+
37+
@property
38+
@lru_cache()
39+
def extensions_generator(self):
40+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/media_types/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
class MediaType(object):
55
"""Represents an OpenAPI MediaType."""
66

7-
def __init__(self, mimetype, schema=None, example=None):
7+
def __init__(self, mimetype, schema=None, example=None, extensions=None):
88
self.mimetype = mimetype
99
self.schema = schema
1010
self.example = example
11+
12+
self.extensions = extensions and dict(extensions) or {}

Diff for: openapi_core/schema/operations/generators.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from openapi_spec_validator.validators import PathItemValidator
55

66
from openapi_core.compat import lru_cache
7+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
78
from openapi_core.schema.external_docs.factories import (
89
ExternalDocumentationFactory,
910
)
@@ -47,6 +48,7 @@ def generate(self, path_name, path):
4748
servers = self.servers_generator.generate(servers_spec)
4849
security = self.security_requirements_generator.generate(
4950
security_spec)
51+
extensions = self.extensions_generator.generate(operation_deref)
5052

5153
external_docs = None
5254
if 'externalDocs' in operation_deref:
@@ -68,7 +70,7 @@ def generate(self, path_name, path):
6870
external_docs=external_docs, security=list(security),
6971
request_body=request_body, deprecated=deprecated,
7072
operation_id=operation_id, tags=list(tags_list),
71-
servers=list(servers),
73+
servers=list(servers), extensions=extensions,
7274
),
7375
)
7476

@@ -101,3 +103,8 @@ def security_requirements_generator(self):
101103
@lru_cache()
102104
def servers_generator(self):
103105
return ServersGenerator(self.dereferencer)
106+
107+
@property
108+
@lru_cache()
109+
def extensions_generator(self):
110+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/operations/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def __init__(
1010
self, http_method, path_name, responses, parameters,
1111
summary=None, description=None, external_docs=None, security=None,
1212
request_body=None, deprecated=False, operation_id=None, tags=None,
13-
servers=None):
13+
servers=None, extensions=None):
1414
self.http_method = http_method
1515
self.path_name = path_name
1616
self.responses = dict(responses)
@@ -25,6 +25,8 @@ def __init__(
2525
self.tags = tags
2626
self.servers = servers
2727

28+
self.extensions = extensions and dict(extensions) or {}
29+
2830
def __getitem__(self, name):
2931
return self.parameters[name]
3032

Diff for: openapi_core/schema/paths/generators.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from six import iteritems
33

44
from openapi_core.compat import lru_cache
5+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
56
from openapi_core.schema.operations.generators import OperationsGenerator
67
from openapi_core.schema.parameters.generators import ParametersGenerator
78
from openapi_core.schema.paths.models import Path
@@ -29,12 +30,14 @@ def generate(self, paths):
2930
servers = self.servers_generator.generate(servers_spec)
3031
parameters = self.parameters_generator.generate_from_list(
3132
parameters_list)
33+
extensions = self.extensions_generator.generate(path_deref)
34+
3235
yield (
3336
path_name,
3437
Path(
3538
path_name, list(operations), parameters=list(parameters),
3639
summary=summary, description=description,
37-
servers=list(servers),
40+
servers=list(servers), extensions=extensions,
3841
),
3942
)
4043

@@ -52,3 +55,8 @@ def servers_generator(self):
5255
@lru_cache()
5356
def parameters_generator(self):
5457
return ParametersGenerator(self.dereferencer, self.schemas_registry)
58+
59+
@property
60+
@lru_cache()
61+
def extensions_generator(self):
62+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/paths/models.py

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class Path(object):
77
def __init__(
88
self, name, operations,
99
summary=None, description=None, parameters=None, servers=None,
10+
extensions=None,
1011
):
1112
self.name = name
1213
self.operations = dict(operations)
@@ -15,5 +16,7 @@ def __init__(
1516
self.servers = servers
1617
self.parameters = dict(parameters) if parameters else {}
1718

19+
self.extensions = extensions and dict(extensions) or {}
20+
1821
def __getitem__(self, http_method):
1922
return self.operations[http_method]

Diff for: openapi_core/schema/request_bodies/factories.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""OpenAPI core request bodies factories module"""
22
from openapi_core.compat import lru_cache
3+
from openapi_core.schema.extensions.generators import ExtensionsGenerator
34
from openapi_core.schema.media_types.generators import MediaTypeGenerator
45
from openapi_core.schema.request_bodies.models import RequestBody
56

@@ -16,9 +17,20 @@ def create(self, request_body_spec):
1617
content = request_body_deref['content']
1718
media_types = self.media_types_generator.generate(content)
1819
required = request_body_deref.get('required', False)
19-
return RequestBody(media_types, required=required)
20+
21+
extensions = self.extensions_generator.generate(request_body_deref)
22+
23+
return RequestBody(
24+
media_types,
25+
required=required, extensions=extensions,
26+
)
2027

2128
@property
2229
@lru_cache()
2330
def media_types_generator(self):
2431
return MediaTypeGenerator(self.dereferencer, self.schemas_registry)
32+
33+
@property
34+
@lru_cache()
35+
def extensions_generator(self):
36+
return ExtensionsGenerator(self.dereferencer)

Diff for: openapi_core/schema/request_bodies/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
class RequestBody(object):
88
"""Represents an OpenAPI RequestBody."""
99

10-
def __init__(self, content, required=False):
10+
def __init__(self, content, required=False, extensions=None):
1111
self.content = Content(content)
1212
self.required = required
1313

14+
self.extensions = extensions and dict(extensions) or {}
15+
1416
def __getitem__(self, mimetype):
1517
try:
1618
return self.content[mimetype]

0 commit comments

Comments
 (0)