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

openapi_core/schema/components/factories.py

Lines changed: 9 additions & 0 deletions
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

openapi_core/schema/components/models.py

Lines changed: 3 additions & 1 deletion
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 {}

openapi_core/schema/contacts/factories.py

Lines changed: 11 additions & 1 deletion
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)

openapi_core/schema/contacts/models.py

Lines changed: 3 additions & 1 deletion
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 {}

openapi_core/schema/external_docs/factories.py

Lines changed: 13 additions & 1 deletion
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)

openapi_core/schema/external_docs/models.py

Lines changed: 3 additions & 1 deletion
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 {}

openapi_core/schema/infos/factories.py

Lines changed: 9 additions & 1 deletion
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)

openapi_core/schema/infos/models.py

Lines changed: 3 additions & 1 deletion
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 {}

openapi_core/schema/licenses/factories.py

Lines changed: 11 additions & 1 deletion
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)

openapi_core/schema/licenses/models.py

Lines changed: 3 additions & 1 deletion
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 {}

0 commit comments

Comments
 (0)