Merge pull request #3 from p1c2u/feature/schemas-registry

Schemas registry
This commit is contained in:
A 2017-09-22 10:00:17 +01:00 committed by GitHub
commit 52b64b462b
8 changed files with 79 additions and 62 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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)