Skip to content

Commit 52b64b4

Browse files
authored
Merge pull request #3 from p1c2u/feature/schemas-registry
Schemas registry
2 parents 17915a4 + ca41300 commit 52b64b4

File tree

8 files changed

+81
-64
lines changed

8 files changed

+81
-64
lines changed

openapi_core/components.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from functools import lru_cache
2+
13
from openapi_core.schemas import SchemasGenerator
24

35

@@ -15,8 +17,9 @@ def __init__(
1517

1618
class ComponentsFactory(object):
1719

18-
def __init__(self, dereferencer):
20+
def __init__(self, dereferencer, schemas_registry):
1921
self.dereferencer = dereferencer
22+
self.schemas_registry = schemas_registry
2023

2124
def create(self, components_spec):
2225
components_deref = self.dereferencer.dereference(components_spec)
@@ -26,7 +29,7 @@ def create(self, components_spec):
2629
parameters_spec = components_deref.get('parameters', [])
2730
request_bodies_spec = components_deref.get('request_bodies', [])
2831

29-
schemas = self._generate_schemas(schemas_spec)
32+
schemas = self.schemas_generator.generate(schemas_spec)
3033
responses = self._generate_response(responses_spec)
3134
parameters = self._generate_parameters(parameters_spec)
3235
request_bodies = self._generate_request_bodies(request_bodies_spec)
@@ -35,8 +38,10 @@ def create(self, components_spec):
3538
request_bodies=request_bodies,
3639
)
3740

38-
def _generate_schemas(self, schemas_spec):
39-
return SchemasGenerator(self.dereferencer).generate(schemas_spec)
41+
@property
42+
@lru_cache()
43+
def schemas_generator(self):
44+
return SchemasGenerator(self.dereferencer, self.schemas_registry)
4045

4146
def _generate_response(self, responses_spec):
4247
return responses_spec

openapi_core/media_types.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
"""OpenAPI core mediaTypes module"""
22
from six import iteritems
33

4-
from openapi_core.schemas import SchemaRegistry
5-
64

75
class MediaType(object):
86
"""Represents an OpenAPI MediaType."""
@@ -20,20 +18,16 @@ def unmarshal(self, value):
2018

2119
class MediaTypeGenerator(object):
2220

23-
def __init__(self, dereferencer):
21+
def __init__(self, dereferencer, schemas_registry):
2422
self.dereferencer = dereferencer
23+
self.schemas_registry = schemas_registry
2524

2625
def generate(self, content):
2726
for content_type, media_type in iteritems(content):
2827
schema_spec = media_type.get('schema')
2928

3029
schema = None
3130
if schema_spec:
32-
schema = self._create_schema(schema_spec)
31+
schema, _ = self.schemas_registry.get_or_create(schema_spec)
3332

3433
yield content_type, MediaType(content_type, schema)
35-
36-
def _create_schema(self, schema_spec):
37-
schema, _ = SchemaRegistry(self.dereferencer).get_or_create(
38-
schema_spec)
39-
return schema

openapi_core/operations.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22
"""OpenAPI core operations module"""
33
import logging
4+
from functools import lru_cache
45

56
from six import iteritems
67

@@ -30,8 +31,9 @@ def __getitem__(self, name):
3031
class OperationsGenerator(object):
3132
"""Represents an OpenAPI Operation in a service."""
3233

33-
def __init__(self, dereferencer):
34+
def __init__(self, dereferencer, schemas_registry):
3435
self.dereferencer = dereferencer
36+
self.schemas_registry = schemas_registry
3537

3638
def generate(self, path_name, path):
3739
path_deref = self.dereferencer.dereference(path)
@@ -42,12 +44,13 @@ def generate(self, path_name, path):
4244
operation_deref = self.dereferencer.dereference(operation)
4345
deprecated = operation_deref.get('deprecated', False)
4446
parameters_list = operation_deref.get('parameters', [])
45-
parameters = self._generate_parameters(parameters_list)
47+
parameters = self.parameters_generator.generate(parameters_list)
4648

4749
request_body = None
4850
if 'requestBody' in operation_deref:
4951
request_body_spec = operation_deref.get('requestBody')
50-
request_body = self._create_request_body(request_body_spec)
52+
request_body = self.request_body_factory.create(
53+
request_body_spec)
5154

5255
yield (
5356
http_method,
@@ -57,8 +60,12 @@ def generate(self, path_name, path):
5760
),
5861
)
5962

60-
def _generate_parameters(self, parameters):
61-
return ParametersGenerator(self.dereferencer).generate(parameters)
63+
@property
64+
@lru_cache()
65+
def parameters_generator(self):
66+
return ParametersGenerator(self.dereferencer, self.schemas_registry)
6267

63-
def _create_request_body(self, request_body_spec):
64-
return RequestBodyFactory(self.dereferencer).create(request_body_spec)
68+
@property
69+
@lru_cache()
70+
def request_body_factory(self):
71+
return RequestBodyFactory(self.dereferencer, self.schemas_registry)

openapi_core/parameters.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
"""OpenAPI core parameters module"""
22
import logging
33

4-
from openapi_core.schemas import SchemaRegistry
5-
64
log = logging.getLogger(__name__)
75

86

@@ -32,8 +30,9 @@ def unmarshal(self, value):
3230

3331
class ParametersGenerator(object):
3432

35-
def __init__(self, dereferencer):
33+
def __init__(self, dereferencer, schemas_registry):
3634
self.dereferencer = dereferencer
35+
self.schemas_registry = schemas_registry
3736

3837
def generate(self, paramters):
3938
for parameter in paramters:
@@ -45,7 +44,7 @@ def generate(self, paramters):
4544
schema_spec = parameter_deref.get('schema', None)
4645
schema = None
4746
if schema_spec:
48-
schema = self._create_schema(schema_spec)
47+
schema, _ = self.schemas_registry.get_or_create(schema_spec)
4948

5049
yield (
5150
parameter_deref['name'],
@@ -54,8 +53,3 @@ def generate(self, paramters):
5453
schema=schema, default=default, required=required,
5554
),
5655
)
57-
58-
def _create_schema(self, schema_spec):
59-
schema, _ = SchemaRegistry(self.dereferencer).get_or_create(
60-
schema_spec)
61-
return schema

openapi_core/paths.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
"""OpenAPI core paths module"""
2+
from functools import lru_cache
3+
24
from six import iteritems
35

46
from openapi_core.operations import OperationsGenerator
@@ -17,14 +19,17 @@ def __getitem__(self, http_method):
1719

1820
class PathsGenerator(object):
1921

20-
def __init__(self, dereferencer):
22+
def __init__(self, dereferencer, schemas_registry):
2123
self.dereferencer = dereferencer
24+
self.schemas_registry = schemas_registry
2225

2326
def generate(self, paths):
2427
paths_deref = self.dereferencer.dereference(paths)
2528
for path_name, path in iteritems(paths_deref):
26-
operations = self._generate_operations(path_name, path)
29+
operations = self.operations_generator.generate(path_name, path)
2730
yield path_name, Path(path_name, list(operations))
2831

29-
def _generate_operations(self, path_name, path):
30-
return OperationsGenerator(self.dereferencer).generate(path_name, path)
32+
@property
33+
@lru_cache()
34+
def operations_generator(self):
35+
return OperationsGenerator(self.dereferencer, self.schemas_registry)

openapi_core/request_bodies.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
"""OpenAPI core requestBodies module"""
2+
from functools import lru_cache
3+
24
from openapi_core.media_types import MediaTypeGenerator
35

46

@@ -15,16 +17,19 @@ def __getitem__(self, content_type):
1517

1618
class RequestBodyFactory(object):
1719

18-
def __init__(self, dereferencer):
20+
def __init__(self, dereferencer, schemas_registry):
1921
self.dereferencer = dereferencer
22+
self.schemas_registry = schemas_registry
2023

2124
def create(self, request_body_spec):
2225
request_body_deref = self.dereferencer.dereference(
2326
request_body_spec)
2427
content = request_body_deref['content']
25-
media_types = self._generate_media_types(content)
28+
media_types = self.media_types_generator.generate(content)
2629
required = request_body_deref.get('required', False)
2730
return RequestBody(media_types, required=required)
2831

29-
def _generate_media_types(self, content):
30-
return MediaTypeGenerator(self.dereferencer).generate(content)
32+
@property
33+
@lru_cache()
34+
def media_types_generator(self):
35+
return MediaTypeGenerator(self.dereferencer, self.schemas_registry)

openapi_core/schemas.py

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"""OpenAPI core schemas module"""
22
import logging
3-
from distutils.util import strtobool
43
from collections import defaultdict
4+
from distutils.util import strtobool
5+
from functools import lru_cache
56

67
from json import loads
78
from six import iteritems
@@ -114,7 +115,7 @@ def create(self, schema_spec):
114115

115116
properties = None
116117
if properties_spec:
117-
properties = self._generate_properties(properties_spec)
118+
properties = self.properties_generator.generate(properties_spec)
118119

119120
items = None
120121
if items_spec:
@@ -125,8 +126,10 @@ def create(self, schema_spec):
125126
required=required,
126127
)
127128

128-
def _generate_properties(self, properties_spec):
129-
return PropertiesGenerator(self.dereferencer).generate(properties_spec)
129+
@property
130+
@lru_cache()
131+
def properties_generator(self):
132+
return PropertiesGenerator(self.dereferencer)
130133

131134
def _create_items(self, items_spec):
132135
return self.create(items_spec)
@@ -147,24 +150,16 @@ def get_or_create(self, schema_spec):
147150

148151
return self.create(schema_deref), True
149152

150-
def _create_items(self, items_spec):
151-
schema, _ = self.get_or_create(items_spec)
152-
return schema
153-
154153

155154
class SchemasGenerator(object):
156155

157-
def __init__(self, dereferencer):
156+
def __init__(self, dereferencer, schemas_registry):
158157
self.dereferencer = dereferencer
158+
self.schemas_registry = schemas_registry
159159

160160
def generate(self, schemas_spec):
161161
schemas_deref = self.dereferencer.dereference(schemas_spec)
162162

163163
for schema_name, schema_spec in iteritems(schemas_deref):
164-
schema = self._create_schema(schema_spec)
164+
schema, _ = self.schemas_registry.get_or_create(schema_spec)
165165
yield schema_name, schema
166-
167-
def _create_schema(self, schema_spec):
168-
schema, _ = SchemaRegistry(self.dereferencer).get_or_create(
169-
schema_spec)
170-
return schema

openapi_core/specs.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# -*- coding: utf-8 -*-
22
"""OpenAPI core specs module"""
33
import logging
4-
from functools import partialmethod
4+
from functools import partialmethod, lru_cache
55

66
from openapi_spec_validator import openapi_v3_spec_validator
77

88
from openapi_core.components import ComponentsFactory
99
from openapi_core.infos import InfoFactory
1010
from openapi_core.paths import PathsGenerator
11+
from openapi_core.schemas import SchemaRegistry
1112

1213

1314
log = logging.getLogger(__name__)
@@ -62,17 +63,28 @@ def create(self, spec_dict, spec_url=''):
6263
paths = spec_dict_deref.get('paths', [])
6364
components_spec = spec_dict_deref.get('components', [])
6465

65-
info = self._create_info(info_spec)
66-
paths = self._generate_paths(paths)
67-
components = self._create_components(components_spec)
66+
info = self.info_factory.create(info_spec)
67+
paths = self.paths_generator.generate(paths)
68+
components = self.components_factory.create(components_spec)
6869
spec = Spec(info, list(paths), servers=servers, components=components)
6970
return spec
7071

71-
def _create_info(self, info_spec):
72-
return InfoFactory(self.dereferencer).create(info_spec)
73-
74-
def _generate_paths(self, paths):
75-
return PathsGenerator(self.dereferencer).generate(paths)
76-
77-
def _create_components(self, components_spec):
78-
return ComponentsFactory(self.dereferencer).create(components_spec)
72+
@property
73+
@lru_cache()
74+
def schemas_registry(self):
75+
return SchemaRegistry(self.dereferencer)
76+
77+
@property
78+
@lru_cache()
79+
def info_factory(self):
80+
return InfoFactory(self.dereferencer)
81+
82+
@property
83+
@lru_cache()
84+
def paths_generator(self):
85+
return PathsGenerator(self.dereferencer, self.schemas_registry)
86+
87+
@property
88+
@lru_cache()
89+
def components_factory(self):
90+
return ComponentsFactory(self.dereferencer, self.schemas_registry)

0 commit comments

Comments
 (0)