Skip to content

Commit 6d7adfb

Browse files
authored
Merge pull request #179 from p1c2u/refactor/shortcuts-cleanup
Shortcuts cleanup
2 parents 6f9200e + da3b6ee commit 6d7adfb

File tree

12 files changed

+396
-330
lines changed

12 files changed

+396
-330
lines changed

openapi_core/schema/shortcuts.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"""OpenAPI core schema shortcuts module"""
2+
from jsonschema.validators import RefResolver
3+
from openapi_spec_validator import default_handlers
4+
5+
from openapi_core.schema.specs.factories import SpecFactory
6+
7+
8+
def create_spec(spec_dict, spec_url='', handlers=default_handlers):
9+
spec_resolver = RefResolver(
10+
spec_url, spec_dict, handlers=handlers)
11+
spec_factory = SpecFactory(spec_resolver)
12+
return spec_factory.create(spec_dict, spec_url=spec_url)

openapi_core/shortcuts.py

Lines changed: 11 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,14 @@
11
"""OpenAPI core shortcuts module"""
2-
from jsonschema.validators import RefResolver
3-
from openapi_spec_validator import default_handlers
4-
5-
from openapi_core.schema.media_types.exceptions import OpenAPIMediaTypeError
6-
from openapi_core.schema.parameters.exceptions import OpenAPIParameterError
7-
from openapi_core.schema.request_bodies.exceptions import (
8-
OpenAPIRequestBodyError,
2+
# backward compatibility
3+
from openapi_core.schema.shortcuts import create_spec
4+
from openapi_core.validation.request.shortcuts import (
5+
spec_validate_body as validate_body,
6+
spec_validate_parameters as validate_parameters,
7+
)
8+
from openapi_core.validation.response.shortcuts import (
9+
spec_validate_data as validate_data
910
)
10-
from openapi_core.schema.schemas.exceptions import OpenAPISchemaError
11-
from openapi_core.schema.specs.factories import SpecFactory
12-
from openapi_core.validation.request.validators import RequestValidator
13-
from openapi_core.validation.response.validators import ResponseValidator
14-
15-
16-
def create_spec(spec_dict, spec_url=''):
17-
spec_resolver = RefResolver(
18-
spec_url, spec_dict, handlers=default_handlers)
19-
spec_factory = SpecFactory(spec_resolver)
20-
return spec_factory.create(spec_dict, spec_url=spec_url)
21-
22-
23-
def validate_parameters(spec, request, request_factory=None):
24-
if request_factory is not None:
25-
request = request_factory(request)
26-
27-
validator = RequestValidator(spec)
28-
result = validator.validate(request)
29-
30-
try:
31-
result.raise_for_errors()
32-
except (
33-
OpenAPIRequestBodyError, OpenAPIMediaTypeError,
34-
OpenAPISchemaError,
35-
):
36-
return result.parameters
37-
else:
38-
return result.parameters
39-
40-
41-
def validate_body(spec, request, request_factory=None):
42-
if request_factory is not None:
43-
request = request_factory(request)
44-
45-
validator = RequestValidator(spec)
46-
result = validator.validate(request)
47-
48-
try:
49-
result.raise_for_errors()
50-
except OpenAPIParameterError:
51-
return result.body
52-
else:
53-
return result.body
54-
55-
56-
def validate_data(
57-
spec, request, response,
58-
request_factory=None,
59-
response_factory=None):
60-
if request_factory is not None:
61-
request = request_factory(request)
62-
63-
if response_factory is not None:
64-
response = response_factory(response)
65-
66-
validator = ResponseValidator(spec)
67-
result = validator.validate(request, response)
68-
69-
result.raise_for_errors()
7011

71-
return result.data
12+
__all__ = [
13+
'create_spec', 'validate_body', 'validate_parameters', 'validate_data',
14+
]

openapi_core/testing/datatypes.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class ResultMock(object):
2+
3+
def __init__(
4+
self, body=None, parameters=None, data=None, error_to_raise=None):
5+
self.body = body
6+
self.parameters = parameters
7+
self.data = data
8+
self.error_to_raise = error_to_raise
9+
10+
def raise_for_errors(self):
11+
if self.error_to_raise is not None:
12+
raise self.error_to_raise
13+
14+
if self.parameters is not None:
15+
return self.parameters
16+
17+
if self.data is not None:
18+
return self.data

openapi_core/testing/factories.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class FactoryClassMock(object):
2+
3+
_instances = {}
4+
5+
def __new__(cls, obj):
6+
if obj not in cls._instances:
7+
cls._instances[obj] = object.__new__(cls)
8+
return cls._instances[obj]
9+
10+
def __init__(self, obj):
11+
self.obj = obj

openapi_core/testing/mock.py

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,6 @@
11
"""OpenAPI core testing mock module"""
2-
from werkzeug.datastructures import ImmutableMultiDict
2+
# backward compatibility
3+
from openapi_core.testing.requests import MockRequestFactory
4+
from openapi_core.testing.responses import MockResponseFactory
35

4-
from openapi_core.validation.request.datatypes import (
5-
RequestParameters, OpenAPIRequest,
6-
)
7-
from openapi_core.validation.response.datatypes import OpenAPIResponse
8-
9-
10-
class MockRequestFactory(object):
11-
12-
@classmethod
13-
def create(
14-
cls, host_url, method, path, path_pattern=None, args=None,
15-
view_args=None, headers=None, cookies=None, data=None,
16-
mimetype='application/json'):
17-
parameters = RequestParameters(
18-
path=view_args or {},
19-
query=ImmutableMultiDict(args or []),
20-
header=headers or {},
21-
cookie=cookies or {},
22-
)
23-
path_pattern = path_pattern or path
24-
method = method.lower()
25-
body = data or ''
26-
return OpenAPIRequest(
27-
host_url=host_url,
28-
path=path,
29-
path_pattern=path_pattern,
30-
method=method,
31-
parameters=parameters,
32-
body=body,
33-
mimetype=mimetype,
34-
)
35-
36-
37-
class MockResponseFactory(object):
38-
39-
@classmethod
40-
def create(cls, data, status_code=200, mimetype='application/json'):
41-
return OpenAPIResponse(
42-
data=data,
43-
status_code=status_code,
44-
mimetype=mimetype,
45-
)
6+
__all__ = ['MockRequestFactory', 'MockResponseFactory']

openapi_core/testing/requests.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""OpenAPI core testing requests module"""
2+
from werkzeug.datastructures import ImmutableMultiDict
3+
4+
from openapi_core.validation.request.datatypes import (
5+
RequestParameters, OpenAPIRequest,
6+
)
7+
8+
9+
class MockRequestFactory(object):
10+
11+
@classmethod
12+
def create(
13+
cls, host_url, method, path, path_pattern=None, args=None,
14+
view_args=None, headers=None, cookies=None, data=None,
15+
mimetype='application/json'):
16+
parameters = RequestParameters(
17+
path=view_args or {},
18+
query=ImmutableMultiDict(args or []),
19+
header=headers or {},
20+
cookie=cookies or {},
21+
)
22+
path_pattern = path_pattern or path
23+
method = method.lower()
24+
body = data or ''
25+
return OpenAPIRequest(
26+
host_url=host_url,
27+
path=path,
28+
path_pattern=path_pattern,
29+
method=method,
30+
parameters=parameters,
31+
body=body,
32+
mimetype=mimetype,
33+
)

openapi_core/testing/responses.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""OpenAPI core testing responses module"""
2+
from openapi_core.validation.response.datatypes import OpenAPIResponse
3+
4+
5+
class MockResponseFactory(object):
6+
7+
@classmethod
8+
def create(cls, data, status_code=200, mimetype='application/json'):
9+
return OpenAPIResponse(
10+
data=data,
11+
status_code=status_code,
12+
mimetype=mimetype,
13+
)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"""OpenAPI core validation request shortcuts module"""
2+
from functools import partial
3+
4+
from openapi_core.schema.media_types.exceptions import OpenAPIMediaTypeError
5+
from openapi_core.schema.parameters.exceptions import OpenAPIParameterError
6+
from openapi_core.schema.request_bodies.exceptions import (
7+
OpenAPIRequestBodyError,
8+
)
9+
from openapi_core.schema.schemas.exceptions import OpenAPISchemaError
10+
from openapi_core.validation.request.validators import RequestValidator
11+
12+
ERRORS_BODY = (
13+
OpenAPIRequestBodyError, OpenAPIMediaTypeError, OpenAPISchemaError,
14+
)
15+
ERRORS_PARAMETERS = (
16+
OpenAPIParameterError,
17+
)
18+
19+
20+
def validate_request(validator, request, failsafe=None):
21+
if failsafe is None:
22+
failsafe = ()
23+
result = validator.validate(request)
24+
try:
25+
result.raise_for_errors()
26+
except failsafe:
27+
pass
28+
return result
29+
30+
31+
validate_parameters = partial(validate_request, failsafe=ERRORS_BODY)
32+
validate_body = partial(validate_request, failsafe=ERRORS_PARAMETERS)
33+
34+
35+
def spec_validate_parameters(spec, request, request_factory=None):
36+
if request_factory is not None:
37+
request = request_factory(request)
38+
39+
validator = RequestValidator(spec)
40+
result = validate_parameters(validator, request)
41+
42+
return result.parameters
43+
44+
45+
def spec_validate_body(spec, request, request_factory=None):
46+
if request_factory is not None:
47+
request = request_factory(request)
48+
49+
validator = RequestValidator(spec)
50+
result = validate_body(validator, request)
51+
52+
return result.body
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""OpenAPI core validation response shortcuts module"""
2+
from openapi_core.validation.response.validators import ResponseValidator
3+
4+
5+
def validate_response(validator, request, response):
6+
result = validator.validate(request, response)
7+
result.raise_for_errors()
8+
return result
9+
10+
11+
def spec_validate_data(
12+
spec, request, response,
13+
request_factory=None,
14+
response_factory=None):
15+
if request_factory is not None:
16+
request = request_factory(request)
17+
if response_factory is not None:
18+
response = response_factory(response)
19+
20+
validator = ResponseValidator(spec)
21+
result = validate_response(validator, request, response)
22+
23+
return result.data

0 commit comments

Comments
 (0)