Skip to content

validation shortcuts remove validator factories #408

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 2 additions & 12 deletions openapi_core/__init__.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
"""OpenAPI core module"""
from openapi_core.shortcuts import spec_validate_body
from openapi_core.shortcuts import spec_validate_data
from openapi_core.shortcuts import spec_validate_headers
from openapi_core.shortcuts import spec_validate_parameters
from openapi_core.shortcuts import spec_validate_security
from openapi_core.shortcuts import validate_request
from openapi_core.shortcuts import validate_response
from openapi_core.spec import OpenAPIv30Spec
from openapi_core.validation.request.shortcuts import validate_request
from openapi_core.validation.request.validators import RequestBodyValidator
from openapi_core.validation.request.validators import (
RequestParametersValidator,
)
from openapi_core.validation.request.validators import RequestSecurityValidator
from openapi_core.validation.request.validators import RequestValidator
from openapi_core.validation.response.shortcuts import validate_response
from openapi_core.validation.response.validators import ResponseDataValidator
from openapi_core.validation.response.validators import (
ResponseHeadersValidator,
Expand All @@ -31,11 +26,6 @@
"OpenAPISpec",
"validate_request",
"validate_response",
"spec_validate_body",
"spec_validate_parameters",
"spec_validate_security",
"spec_validate_data",
"spec_validate_headers",
"RequestValidator",
"ResponseValidator",
"RequestBodyValidator",
Expand Down
19 changes: 0 additions & 19 deletions openapi_core/shortcuts.py

This file was deleted.

11 changes: 0 additions & 11 deletions openapi_core/testing/factories.py

This file was deleted.

3 changes: 2 additions & 1 deletion openapi_core/util.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"""OpenAPI core util module"""
from typing import Any


def forcebool(val):
def forcebool(val: Any) -> bool:
if isinstance(val, str):
val = val.lower()
if val in ("y", "yes", "t", "true", "on", "1"):
Expand Down
62 changes: 27 additions & 35 deletions openapi_core/validation/request/shortcuts.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""OpenAPI core validation request shortcuts module"""
from functools import partial

from openapi_core.validation.request.validators import RequestBodyValidator
from openapi_core.validation.request.validators import (
RequestParametersValidator,
Expand All @@ -15,42 +13,36 @@ def validate_request(validator, request):
return result


def spec_validate_request(
spec,
request,
request_factory=None,
validator_class=RequestValidator,
result_attribute=None,
):
if request_factory is not None:
request = request_factory(request)
def spec_validate_request(spec, request, base_url=None):
validator = RequestValidator(
spec,
base_url=base_url,
)
return validate_request(validator, request)

validator = validator_class(spec)

result = validator.validate(request)
result.raise_for_errors()
def spec_validate_body(spec, request, base_url=None):
validator = RequestBodyValidator(
spec,
base_url=base_url,
)
result = validate_request(validator, request)
return result.body

if result_attribute is None:
return result
return getattr(result, result_attribute)


spec_validate_parameters = partial(
spec_validate_request,
validator_class=RequestParametersValidator,
result_attribute="parameters",
)
def spec_validate_parameters(spec, request, base_url=None):
validator = RequestParametersValidator(
spec,
base_url=base_url,
)
result = validate_request(validator, request)
return result.parameters


spec_validate_body = partial(
spec_validate_request,
validator_class=RequestBodyValidator,
result_attribute="body",
)


spec_validate_security = partial(
spec_validate_request,
validator_class=RequestSecurityValidator,
result_attribute="security",
)
def spec_validate_security(spec, request, base_url=None):
validator = RequestSecurityValidator(
spec,
base_url=base_url,
)
result = validate_request(validator, request)
return result.security
64 changes: 26 additions & 38 deletions openapi_core/validation/response/shortcuts.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""OpenAPI core validation response shortcuts module"""
from functools import partial

from openapi_core.validation.response.validators import ResponseDataValidator
from openapi_core.validation.response.validators import (
ResponseHeadersValidator,
Expand All @@ -14,39 +12,29 @@ def validate_response(validator, request, response):
return result


def spec_validate_response(
spec,
request,
response,
request_factory=None,
response_factory=None,
validator_class=ResponseValidator,
result_attribute=None,
):
if request_factory is not None:
request = request_factory(request)
if response_factory is not None:
response = response_factory(response)

validator = validator_class(spec)

result = validator.validate(request, response)
result.raise_for_errors()

if result_attribute is None:
return result
return getattr(result, result_attribute)


spec_validate_data = partial(
spec_validate_response,
validator_class=ResponseDataValidator,
result_attribute="data",
)


spec_validate_headers = partial(
spec_validate_response,
validator_class=ResponseHeadersValidator,
result_attribute="headers",
)
def spec_validate_response(spec, request, response, base_url=None):
validator = ResponseValidator(
spec,
base_url=base_url,
custom_formatters=None,
custom_media_type_deserializers=None,
)
return validate_response(validator, request, response)


def spec_validate_data(spec, request, response, base_url=None):
validator = ResponseDataValidator(
spec,
base_url=base_url,
)
result = validate_response(validator, request, response)
return result.data


def spec_validate_headers(spec, request, response, base_url=None):
validator = ResponseHeadersValidator(
spec,
base_url=base_url,
)
result = validate_response(validator, request, response)
return result.headers
10 changes: 5 additions & 5 deletions tests/integration/validation/test_petstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,19 @@
from openapi_core.exceptions import MissingRequiredHeader
from openapi_core.exceptions import MissingRequiredParameter
from openapi_core.extensions.models.models import BaseModel
from openapi_core.shortcuts import spec_validate_body
from openapi_core.shortcuts import spec_validate_data
from openapi_core.shortcuts import spec_validate_headers
from openapi_core.shortcuts import spec_validate_parameters
from openapi_core.shortcuts import spec_validate_security
from openapi_core.spec import OpenAPIv30Spec as Spec
from openapi_core.templating.media_types.exceptions import MediaTypeNotFound
from openapi_core.templating.paths.exceptions import ServerNotFound
from openapi_core.testing import MockRequest
from openapi_core.testing import MockResponse
from openapi_core.unmarshalling.schemas.exceptions import InvalidSchemaValue
from openapi_core.validation.request.datatypes import Parameters
from openapi_core.validation.request.shortcuts import spec_validate_body
from openapi_core.validation.request.shortcuts import spec_validate_parameters
from openapi_core.validation.request.shortcuts import spec_validate_security
from openapi_core.validation.request.validators import RequestValidator
from openapi_core.validation.response.shortcuts import spec_validate_data
from openapi_core.validation.response.shortcuts import spec_validate_headers
from openapi_core.validation.response.validators import ResponseValidator


Expand Down
126 changes: 11 additions & 115 deletions tests/unit/validation/test_request_shortcuts.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,138 +3,34 @@
import pytest

from openapi_core.testing.datatypes import ResultMock
from openapi_core.testing.factories import FactoryClassMock
from openapi_core.validation.request.shortcuts import spec_validate_body
from openapi_core.validation.request.shortcuts import spec_validate_parameters
from openapi_core.validation.request.shortcuts import spec_validate_request


class TestSpecValidateParameters:
class TestValidateRequest:
@mock.patch(
"openapi_core.validation.request.shortcuts.RequestParametersValidator."
"validate"
"openapi_core.validation.request.shortcuts.RequestValidator.validate"
)
def test_no_request_factory(self, mock_validate):
def test_validator_valid(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
parameters = mock.sentinel.parameters
mock_validate.return_value = ResultMock(parameters=parameters)
validation_result = ResultMock(parameters=parameters)
mock_validate.return_value = validation_result

result = spec_validate_parameters(spec, request)
result = spec_validate_request(spec, request)

assert result == parameters
assert result == validation_result
mock_validate.aasert_called_once_with(request)

@mock.patch(
"openapi_core.validation.request.shortcuts.RequestParametersValidator."
"validate"
"openapi_core.validation.request.shortcuts.RequestValidator.validate"
)
def test_no_request_factory_error(self, mock_validate):
def test_validator_error(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
mock_validate.return_value = ResultMock(error_to_raise=ValueError)

with pytest.raises(ValueError):
spec_validate_parameters(spec, request)
spec_validate_request(spec, request)

mock_validate.aasert_called_once_with(request)

@mock.patch(
"openapi_core.validation.request.shortcuts.RequestParametersValidator."
"validate"
)
def test_request_factory(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
parameters = mock.sentinel.parameters
mock_validate.return_value = ResultMock(parameters=parameters)
request_factory = FactoryClassMock

result = spec_validate_parameters(spec, request, request_factory)

assert result == parameters
mock_validate.assert_called_once_with(
FactoryClassMock(request),
)

@mock.patch(
"openapi_core.validation.request.shortcuts.RequestParametersValidator."
"validate"
)
def test_request_factory_error(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
mock_validate.return_value = ResultMock(error_to_raise=ValueError)
request_factory = FactoryClassMock

with pytest.raises(ValueError):
spec_validate_parameters(spec, request, request_factory)

mock_validate.assert_called_once_with(
FactoryClassMock(request),
)


class TestSpecValidateBody:
@mock.patch(
"openapi_core.validation.request.shortcuts.RequestBodyValidator."
"validate"
)
def test_no_request_factory(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
body = mock.sentinel.body
mock_validate.return_value = ResultMock(body=body)

result = spec_validate_body(spec, request)

assert result == body
mock_validate.aasert_called_once_with(request)

@mock.patch(
"openapi_core.validation.request.shortcuts.RequestBodyValidator."
"validate"
)
def test_no_request_factory_error(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
mock_validate.return_value = ResultMock(error_to_raise=ValueError)

with pytest.raises(ValueError):
spec_validate_body(spec, request)

mock_validate.aasert_called_once_with(request)

@mock.patch(
"openapi_core.validation.request.shortcuts.RequestBodyValidator."
"validate"
)
def test_request_factory(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
body = mock.sentinel.body
mock_validate.return_value = ResultMock(body=body)
request_factory = FactoryClassMock

result = spec_validate_body(spec, request, request_factory)

assert result == body
mock_validate.assert_called_once_with(
FactoryClassMock(request),
)

@mock.patch(
"openapi_core.validation.request.shortcuts.RequestBodyValidator."
"validate"
)
def test_request_factory_error(self, mock_validate):
spec = mock.sentinel.spec
request = mock.sentinel.request
mock_validate.return_value = ResultMock(error_to_raise=ValueError)
request_factory = FactoryClassMock

with pytest.raises(ValueError):
spec_validate_body(spec, request, request_factory)

mock_validate.assert_called_once_with(
FactoryClassMock(request),
)
Loading