mirror of
https://github.com/correl/openapi-core.git
synced 2025-01-01 11:03:19 +00:00
Merge pull request #3 from p1c2u/feature/schemas-registry
Schemas registry
This commit is contained in:
commit
52b64b462b
8 changed files with 79 additions and 62 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
from functools import lru_cache
|
||||||
|
|
||||||
from openapi_core.schemas import SchemasGenerator
|
from openapi_core.schemas import SchemasGenerator
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,8 +17,9 @@ class Components(object):
|
||||||
|
|
||||||
class ComponentsFactory(object):
|
class ComponentsFactory(object):
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def create(self, components_spec):
|
def create(self, components_spec):
|
||||||
components_deref = self.dereferencer.dereference(components_spec)
|
components_deref = self.dereferencer.dereference(components_spec)
|
||||||
|
@ -26,7 +29,7 @@ class ComponentsFactory(object):
|
||||||
parameters_spec = components_deref.get('parameters', [])
|
parameters_spec = components_deref.get('parameters', [])
|
||||||
request_bodies_spec = components_deref.get('request_bodies', [])
|
request_bodies_spec = components_deref.get('request_bodies', [])
|
||||||
|
|
||||||
schemas = self._generate_schemas(schemas_spec)
|
schemas = self.schemas_generator.generate(schemas_spec)
|
||||||
responses = self._generate_response(responses_spec)
|
responses = self._generate_response(responses_spec)
|
||||||
parameters = self._generate_parameters(parameters_spec)
|
parameters = self._generate_parameters(parameters_spec)
|
||||||
request_bodies = self._generate_request_bodies(request_bodies_spec)
|
request_bodies = self._generate_request_bodies(request_bodies_spec)
|
||||||
|
@ -35,8 +38,10 @@ class ComponentsFactory(object):
|
||||||
request_bodies=request_bodies,
|
request_bodies=request_bodies,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _generate_schemas(self, schemas_spec):
|
@property
|
||||||
return SchemasGenerator(self.dereferencer).generate(schemas_spec)
|
@lru_cache()
|
||||||
|
def schemas_generator(self):
|
||||||
|
return SchemasGenerator(self.dereferencer, self.schemas_registry)
|
||||||
|
|
||||||
def _generate_response(self, responses_spec):
|
def _generate_response(self, responses_spec):
|
||||||
return responses_spec
|
return responses_spec
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
"""OpenAPI core mediaTypes module"""
|
"""OpenAPI core mediaTypes module"""
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
|
||||||
from openapi_core.schemas import SchemaRegistry
|
|
||||||
|
|
||||||
|
|
||||||
class MediaType(object):
|
class MediaType(object):
|
||||||
"""Represents an OpenAPI MediaType."""
|
"""Represents an OpenAPI MediaType."""
|
||||||
|
@ -20,8 +18,9 @@ class MediaType(object):
|
||||||
|
|
||||||
class MediaTypeGenerator(object):
|
class MediaTypeGenerator(object):
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def generate(self, content):
|
def generate(self, content):
|
||||||
for content_type, media_type in iteritems(content):
|
for content_type, media_type in iteritems(content):
|
||||||
|
@ -29,11 +28,6 @@ class MediaTypeGenerator(object):
|
||||||
|
|
||||||
schema = None
|
schema = None
|
||||||
if schema_spec:
|
if schema_spec:
|
||||||
schema = self._create_schema(schema_spec)
|
schema, _ = self.schemas_registry.get_or_create(schema_spec)
|
||||||
|
|
||||||
yield content_type, MediaType(content_type, schema)
|
yield content_type, MediaType(content_type, schema)
|
||||||
|
|
||||||
def _create_schema(self, schema_spec):
|
|
||||||
schema, _ = SchemaRegistry(self.dereferencer).get_or_create(
|
|
||||||
schema_spec)
|
|
||||||
return schema
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""OpenAPI core operations module"""
|
"""OpenAPI core operations module"""
|
||||||
import logging
|
import logging
|
||||||
|
from functools import lru_cache
|
||||||
|
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
|
||||||
|
@ -30,8 +31,9 @@ class Operation(object):
|
||||||
class OperationsGenerator(object):
|
class OperationsGenerator(object):
|
||||||
"""Represents an OpenAPI Operation in a service."""
|
"""Represents an OpenAPI Operation in a service."""
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def generate(self, path_name, path):
|
def generate(self, path_name, path):
|
||||||
path_deref = self.dereferencer.dereference(path)
|
path_deref = self.dereferencer.dereference(path)
|
||||||
|
@ -42,12 +44,13 @@ class OperationsGenerator(object):
|
||||||
operation_deref = self.dereferencer.dereference(operation)
|
operation_deref = self.dereferencer.dereference(operation)
|
||||||
deprecated = operation_deref.get('deprecated', False)
|
deprecated = operation_deref.get('deprecated', False)
|
||||||
parameters_list = operation_deref.get('parameters', [])
|
parameters_list = operation_deref.get('parameters', [])
|
||||||
parameters = self._generate_parameters(parameters_list)
|
parameters = self.parameters_generator.generate(parameters_list)
|
||||||
|
|
||||||
request_body = None
|
request_body = None
|
||||||
if 'requestBody' in operation_deref:
|
if 'requestBody' in operation_deref:
|
||||||
request_body_spec = operation_deref.get('requestBody')
|
request_body_spec = operation_deref.get('requestBody')
|
||||||
request_body = self._create_request_body(request_body_spec)
|
request_body = self.request_body_factory.create(
|
||||||
|
request_body_spec)
|
||||||
|
|
||||||
yield (
|
yield (
|
||||||
http_method,
|
http_method,
|
||||||
|
@ -57,8 +60,12 @@ class OperationsGenerator(object):
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
def _generate_parameters(self, parameters):
|
@property
|
||||||
return ParametersGenerator(self.dereferencer).generate(parameters)
|
@lru_cache()
|
||||||
|
def parameters_generator(self):
|
||||||
|
return ParametersGenerator(self.dereferencer, self.schemas_registry)
|
||||||
|
|
||||||
def _create_request_body(self, request_body_spec):
|
@property
|
||||||
return RequestBodyFactory(self.dereferencer).create(request_body_spec)
|
@lru_cache()
|
||||||
|
def request_body_factory(self):
|
||||||
|
return RequestBodyFactory(self.dereferencer, self.schemas_registry)
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
"""OpenAPI core parameters module"""
|
"""OpenAPI core parameters module"""
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from openapi_core.schemas import SchemaRegistry
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,8 +30,9 @@ class Parameter(object):
|
||||||
|
|
||||||
class ParametersGenerator(object):
|
class ParametersGenerator(object):
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def generate(self, paramters):
|
def generate(self, paramters):
|
||||||
for parameter in paramters:
|
for parameter in paramters:
|
||||||
|
@ -45,7 +44,7 @@ class ParametersGenerator(object):
|
||||||
schema_spec = parameter_deref.get('schema', None)
|
schema_spec = parameter_deref.get('schema', None)
|
||||||
schema = None
|
schema = None
|
||||||
if schema_spec:
|
if schema_spec:
|
||||||
schema = self._create_schema(schema_spec)
|
schema, _ = self.schemas_registry.get_or_create(schema_spec)
|
||||||
|
|
||||||
yield (
|
yield (
|
||||||
parameter_deref['name'],
|
parameter_deref['name'],
|
||||||
|
@ -54,8 +53,3 @@ class ParametersGenerator(object):
|
||||||
schema=schema, default=default, required=required,
|
schema=schema, default=default, required=required,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
def _create_schema(self, schema_spec):
|
|
||||||
schema, _ = SchemaRegistry(self.dereferencer).get_or_create(
|
|
||||||
schema_spec)
|
|
||||||
return schema
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
"""OpenAPI core paths module"""
|
"""OpenAPI core paths module"""
|
||||||
|
from functools import lru_cache
|
||||||
|
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
|
||||||
from openapi_core.operations import OperationsGenerator
|
from openapi_core.operations import OperationsGenerator
|
||||||
|
@ -17,14 +19,17 @@ class Path(object):
|
||||||
|
|
||||||
class PathsGenerator(object):
|
class PathsGenerator(object):
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def generate(self, paths):
|
def generate(self, paths):
|
||||||
paths_deref = self.dereferencer.dereference(paths)
|
paths_deref = self.dereferencer.dereference(paths)
|
||||||
for path_name, path in iteritems(paths_deref):
|
for path_name, path in iteritems(paths_deref):
|
||||||
operations = self._generate_operations(path_name, path)
|
operations = self.operations_generator.generate(path_name, path)
|
||||||
yield path_name, Path(path_name, list(operations))
|
yield path_name, Path(path_name, list(operations))
|
||||||
|
|
||||||
def _generate_operations(self, path_name, path):
|
@property
|
||||||
return OperationsGenerator(self.dereferencer).generate(path_name, path)
|
@lru_cache()
|
||||||
|
def operations_generator(self):
|
||||||
|
return OperationsGenerator(self.dereferencer, self.schemas_registry)
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
"""OpenAPI core requestBodies module"""
|
"""OpenAPI core requestBodies module"""
|
||||||
|
from functools import lru_cache
|
||||||
|
|
||||||
from openapi_core.media_types import MediaTypeGenerator
|
from openapi_core.media_types import MediaTypeGenerator
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,16 +17,19 @@ class RequestBody(object):
|
||||||
|
|
||||||
class RequestBodyFactory(object):
|
class RequestBodyFactory(object):
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def create(self, request_body_spec):
|
def create(self, request_body_spec):
|
||||||
request_body_deref = self.dereferencer.dereference(
|
request_body_deref = self.dereferencer.dereference(
|
||||||
request_body_spec)
|
request_body_spec)
|
||||||
content = request_body_deref['content']
|
content = request_body_deref['content']
|
||||||
media_types = self._generate_media_types(content)
|
media_types = self.media_types_generator.generate(content)
|
||||||
required = request_body_deref.get('required', False)
|
required = request_body_deref.get('required', False)
|
||||||
return RequestBody(media_types, required=required)
|
return RequestBody(media_types, required=required)
|
||||||
|
|
||||||
def _generate_media_types(self, content):
|
@property
|
||||||
return MediaTypeGenerator(self.dereferencer).generate(content)
|
@lru_cache()
|
||||||
|
def media_types_generator(self):
|
||||||
|
return MediaTypeGenerator(self.dereferencer, self.schemas_registry)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
"""OpenAPI core schemas module"""
|
"""OpenAPI core schemas module"""
|
||||||
import logging
|
import logging
|
||||||
from distutils.util import strtobool
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from distutils.util import strtobool
|
||||||
|
from functools import lru_cache
|
||||||
|
|
||||||
from json import loads
|
from json import loads
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
@ -114,7 +115,7 @@ class SchemaFactory(object):
|
||||||
|
|
||||||
properties = None
|
properties = None
|
||||||
if properties_spec:
|
if properties_spec:
|
||||||
properties = self._generate_properties(properties_spec)
|
properties = self.properties_generator.generate(properties_spec)
|
||||||
|
|
||||||
items = None
|
items = None
|
||||||
if items_spec:
|
if items_spec:
|
||||||
|
@ -125,8 +126,10 @@ class SchemaFactory(object):
|
||||||
required=required,
|
required=required,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _generate_properties(self, properties_spec):
|
@property
|
||||||
return PropertiesGenerator(self.dereferencer).generate(properties_spec)
|
@lru_cache()
|
||||||
|
def properties_generator(self):
|
||||||
|
return PropertiesGenerator(self.dereferencer)
|
||||||
|
|
||||||
def _create_items(self, items_spec):
|
def _create_items(self, items_spec):
|
||||||
return self.create(items_spec)
|
return self.create(items_spec)
|
||||||
|
@ -147,24 +150,16 @@ class SchemaRegistry(SchemaFactory):
|
||||||
|
|
||||||
return self.create(schema_deref), True
|
return self.create(schema_deref), True
|
||||||
|
|
||||||
def _create_items(self, items_spec):
|
|
||||||
schema, _ = self.get_or_create(items_spec)
|
|
||||||
return schema
|
|
||||||
|
|
||||||
|
|
||||||
class SchemasGenerator(object):
|
class SchemasGenerator(object):
|
||||||
|
|
||||||
def __init__(self, dereferencer):
|
def __init__(self, dereferencer, schemas_registry):
|
||||||
self.dereferencer = dereferencer
|
self.dereferencer = dereferencer
|
||||||
|
self.schemas_registry = schemas_registry
|
||||||
|
|
||||||
def generate(self, schemas_spec):
|
def generate(self, schemas_spec):
|
||||||
schemas_deref = self.dereferencer.dereference(schemas_spec)
|
schemas_deref = self.dereferencer.dereference(schemas_spec)
|
||||||
|
|
||||||
for schema_name, schema_spec in iteritems(schemas_deref):
|
for schema_name, schema_spec in iteritems(schemas_deref):
|
||||||
schema = self._create_schema(schema_spec)
|
schema, _ = self.schemas_registry.get_or_create(schema_spec)
|
||||||
yield schema_name, schema
|
yield schema_name, schema
|
||||||
|
|
||||||
def _create_schema(self, schema_spec):
|
|
||||||
schema, _ = SchemaRegistry(self.dereferencer).get_or_create(
|
|
||||||
schema_spec)
|
|
||||||
return schema
|
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""OpenAPI core specs module"""
|
"""OpenAPI core specs module"""
|
||||||
import logging
|
import logging
|
||||||
from functools import partialmethod
|
from functools import partialmethod, lru_cache
|
||||||
|
|
||||||
from openapi_spec_validator import openapi_v3_spec_validator
|
from openapi_spec_validator import openapi_v3_spec_validator
|
||||||
|
|
||||||
from openapi_core.components import ComponentsFactory
|
from openapi_core.components import ComponentsFactory
|
||||||
from openapi_core.infos import InfoFactory
|
from openapi_core.infos import InfoFactory
|
||||||
from openapi_core.paths import PathsGenerator
|
from openapi_core.paths import PathsGenerator
|
||||||
|
from openapi_core.schemas import SchemaRegistry
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -62,17 +63,28 @@ class SpecFactory(object):
|
||||||
paths = spec_dict_deref.get('paths', [])
|
paths = spec_dict_deref.get('paths', [])
|
||||||
components_spec = spec_dict_deref.get('components', [])
|
components_spec = spec_dict_deref.get('components', [])
|
||||||
|
|
||||||
info = self._create_info(info_spec)
|
info = self.info_factory.create(info_spec)
|
||||||
paths = self._generate_paths(paths)
|
paths = self.paths_generator.generate(paths)
|
||||||
components = self._create_components(components_spec)
|
components = self.components_factory.create(components_spec)
|
||||||
spec = Spec(info, list(paths), servers=servers, components=components)
|
spec = Spec(info, list(paths), servers=servers, components=components)
|
||||||
return spec
|
return spec
|
||||||
|
|
||||||
def _create_info(self, info_spec):
|
@property
|
||||||
return InfoFactory(self.dereferencer).create(info_spec)
|
@lru_cache()
|
||||||
|
def schemas_registry(self):
|
||||||
|
return SchemaRegistry(self.dereferencer)
|
||||||
|
|
||||||
def _generate_paths(self, paths):
|
@property
|
||||||
return PathsGenerator(self.dereferencer).generate(paths)
|
@lru_cache()
|
||||||
|
def info_factory(self):
|
||||||
|
return InfoFactory(self.dereferencer)
|
||||||
|
|
||||||
def _create_components(self, components_spec):
|
@property
|
||||||
return ComponentsFactory(self.dereferencer).create(components_spec)
|
@lru_cache()
|
||||||
|
def paths_generator(self):
|
||||||
|
return PathsGenerator(self.dereferencer, self.schemas_registry)
|
||||||
|
|
||||||
|
@property
|
||||||
|
@lru_cache()
|
||||||
|
def components_factory(self):
|
||||||
|
return ComponentsFactory(self.dereferencer, self.schemas_registry)
|
||||||
|
|
Loading…
Reference in a new issue