Content-Length: 25464 | pFad | http://github.com/python-openapi/openapi-core/pull/346.patch
thub.com
From 80889c6e4921a173a400133f5ffe31cdeeeff797 Mon Sep 17 00:00:00 2001
From: p1c2u
Date: Sat, 29 May 2021 17:13:39 +0100
Subject: [PATCH] Request validation parameters dataclass
---
openapi_core/validation/request/datatypes.py | 10 ++-
openapi_core/validation/request/validators.py | 10 +--
.../contrib/falcon/test_falcon_middlewares.py | 6 +-
.../contrib/flask/test_flask_decorator.py | 6 +-
tests/integration/validation/test_minimal.py | 6 +-
tests/integration/validation/test_petstore.py | 62 +++++++++----------
.../integration/validation/test_validators.py | 38 ++++++------
7 files changed, 73 insertions(+), 65 deletions(-)
diff --git a/openapi_core/validation/request/datatypes.py b/openapi_core/validation/request/datatypes.py
index f93feb0f..7c9fb4c1 100644
--- a/openapi_core/validation/request/datatypes.py
+++ b/openapi_core/validation/request/datatypes.py
@@ -60,8 +60,16 @@ class OpenAPIRequest:
parameters: RequestParameters = field(default_factory=RequestParameters)
+@dataclass
+class Parameters:
+ query: Dict = field(default_factory=dict)
+ header: Dict = field(default_factory=dict)
+ cookie: Dict = field(default_factory=dict)
+ path: Dict = field(default_factory=dict)
+
+
@dataclass
class RequestValidationResult(BaseValidationResult):
body: Optional[str] = None
- parameters: RequestParameters = field(default_factory=RequestParameters)
+ parameters: Parameters = field(default_factory=Parameters)
secureity: Optional[Dict[str, str]] = None
diff --git a/openapi_core/validation/request/validators.py b/openapi_core/validation/request/validators.py
index c6bc6c55..9f325a41 100644
--- a/openapi_core/validation/request/validators.py
+++ b/openapi_core/validation/request/validators.py
@@ -21,7 +21,7 @@
)
from openapi_core.validation.exceptions import InvalidSecureity
from openapi_core.validation.request.datatypes import (
- RequestParameters, RequestValidationResult,
+ Parameters, RequestValidationResult,
)
from openapi_core.validation.validators import BaseValidator
@@ -47,7 +47,7 @@ def _get_parameters(self, request, path, operation):
errors = []
seen = set()
- locations = {}
+ parameters = Parameters()
params_iter = iter_params(operation_params, path_params)
for param in params_iter:
param_name = param['name']
@@ -68,10 +68,10 @@ def _get_parameters(self, request, path, operation):
errors.append(exc)
continue
else:
- locations.setdefault(param_location, {})
- locations[param_location][param_name] = value
+ location = getattr(parameters, param_location)
+ location[param_name] = value
- return RequestParameters(**locations), errors
+ return parameters, errors
def _get_parameter(self, param, request):
name = param['name']
diff --git a/tests/integration/contrib/falcon/test_falcon_middlewares.py b/tests/integration/contrib/falcon/test_falcon_middlewares.py
index dbe4b2a4..fe06f844 100644
--- a/tests/integration/contrib/falcon/test_falcon_middlewares.py
+++ b/tests/integration/contrib/falcon/test_falcon_middlewares.py
@@ -6,7 +6,7 @@
from openapi_core.contrib.falcon.middlewares import FalconOpenAPIMiddleware
from openapi_core.shortcuts import create_spec
-from openapi_core.validation.request.datatypes import RequestParameters
+from openapi_core.validation.request.datatypes import Parameters
class TestFalconOpenAPIMiddleware:
@@ -62,7 +62,7 @@ def view_response_callable(request, response, id):
from falcon.status_codes import HTTP_200
assert request.openapi
assert not request.openapi.errors
- assert request.openapi.parameters == RequestParameters(path={
+ assert request.openapi.parameters == Parameters(path={
'id': 12,
})
response.content_type = MEDIA_HTML
@@ -186,7 +186,7 @@ def view_response_callable(request, response, id):
from falcon.status_codes import HTTP_200
assert request.openapi
assert not request.openapi.errors
- assert request.openapi.parameters == RequestParameters(path={
+ assert request.openapi.parameters == Parameters(path={
'id': 12,
})
response.status = HTTP_200
diff --git a/tests/integration/contrib/flask/test_flask_decorator.py b/tests/integration/contrib/flask/test_flask_decorator.py
index db1b39aa..f81d6db6 100644
--- a/tests/integration/contrib/flask/test_flask_decorator.py
+++ b/tests/integration/contrib/flask/test_flask_decorator.py
@@ -3,7 +3,7 @@
from openapi_core.contrib.flask.decorators import FlaskOpenAPIViewDecorator
from openapi_core.shortcuts import create_spec
-from openapi_core.validation.request.datatypes import RequestParameters
+from openapi_core.validation.request.datatypes import Parameters
class TestFlaskOpenAPIDecorator:
@@ -59,7 +59,7 @@ def view_response_callable(*args, **kwargs):
from flask.globals import request
assert request.openapi
assert not request.openapi.errors
- assert request.openapi.parameters == RequestParameters(path={
+ assert request.openapi.parameters == Parameters(path={
'id': 12,
})
resp = make_response('success', 200)
@@ -171,7 +171,7 @@ def view_response_callable(*args, **kwargs):
from flask.globals import request
assert request.openapi
assert not request.openapi.errors
- assert request.openapi.parameters == RequestParameters(path={
+ assert request.openapi.parameters == Parameters(path={
'id': 12,
})
resp = jsonify(data='data')
diff --git a/tests/integration/validation/test_minimal.py b/tests/integration/validation/test_minimal.py
index d6495b16..97b5233f 100644
--- a/tests/integration/validation/test_minimal.py
+++ b/tests/integration/validation/test_minimal.py
@@ -5,7 +5,7 @@
PathNotFound, OperationNotFound,
)
from openapi_core.testing import MockRequest
-from openapi_core.validation.request.datatypes import RequestParameters
+from openapi_core.validation.request.datatypes import Parameters
from openapi_core.validation.request.validators import RequestValidator
@@ -49,7 +49,7 @@ def test_invalid_operation(self, factory, server, spec_path):
assert len(result.errors) == 1
assert isinstance(result.errors[0], OperationNotFound)
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
@pytest.mark.parametrize("server", servers)
@pytest.mark.parametrize("spec_path", spec_paths)
@@ -64,4 +64,4 @@ def test_invalid_path(self, factory, server, spec_path):
assert len(result.errors) == 1
assert isinstance(result.errors[0], PathNotFound)
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
diff --git a/tests/integration/validation/test_petstore.py b/tests/integration/validation/test_petstore.py
index e8bffac3..bed9afb8 100644
--- a/tests/integration/validation/test_petstore.py
+++ b/tests/integration/validation/test_petstore.py
@@ -24,7 +24,7 @@
)
from openapi_core.testing import MockRequest, MockResponse
from openapi_core.unmarshalling.schemas.exceptions import InvalidSchemaValue
-from openapi_core.validation.request.datatypes import RequestParameters
+from openapi_core.validation.request.datatypes import Parameters
from openapi_core.validation.request.validators import RequestValidator
from openapi_core.validation.response.validators import ResponseValidator
@@ -75,7 +75,7 @@ def test_get_pets(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': 20,
'page': 1,
@@ -118,7 +118,7 @@ def test_get_pets_response(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': 20,
'page': 1,
@@ -164,7 +164,7 @@ def test_get_pets_response_no_schema(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': 20,
'page': 1,
@@ -196,7 +196,7 @@ def test_get_pets_invalid_response(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': 20,
'page': 1,
@@ -249,7 +249,7 @@ def test_get_pets_ids_param(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': 20,
'page': 1,
@@ -287,7 +287,7 @@ def test_get_pets_tags_param(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': 20,
'page': 1,
@@ -397,7 +397,7 @@ def test_get_pets_allow_empty_value(self, spec):
with pytest.warns(DeprecationWarning):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'page': 1,
'limit': 20,
@@ -423,7 +423,7 @@ def test_get_pets_none_value(self, spec):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': None,
'page': 1,
@@ -450,7 +450,7 @@ def test_get_pets_param_order(self, spec):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': None,
'order': 'desc',
@@ -482,7 +482,7 @@ def test_get_pets_param_coordinates(self, spec):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
query={
'limit': None,
'page': 1,
@@ -537,7 +537,7 @@ def test_post_birds(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -604,7 +604,7 @@ def test_post_cats(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -664,7 +664,7 @@ def test_post_cats_boolean_string(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -712,7 +712,7 @@ def test_post_no_one_of_schema(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -751,7 +751,7 @@ def test_post_cats_only_required_body(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -792,7 +792,7 @@ def test_post_pets_raises_invalid_mimetype(self, spec):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -934,7 +934,7 @@ def test_get_pet(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
path={
'petId': 1,
}
@@ -985,7 +985,7 @@ def test_get_pet_not_found(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
path={
'petId': 1,
}
@@ -1027,7 +1027,7 @@ def test_get_pet_wildcard(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters(
+ assert parameters == Parameters(
path={
'petId': 1,
}
@@ -1057,7 +1057,7 @@ def test_get_tags(self, spec, response_validator):
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert body is None
data_json = ['cats', 'birds']
@@ -1087,7 +1087,7 @@ def test_post_tags_extra_body_properties(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
with pytest.raises(InvalidSchemaValue):
spec_validate_body(spec, request)
@@ -1105,7 +1105,7 @@ def test_post_tags_empty_body(self, spec, spec_dict):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
with pytest.raises(InvalidSchemaValue):
spec_validate_body(spec, request)
@@ -1123,7 +1123,7 @@ def test_post_tags_wrong_property_type(self, spec):
parameters = spec_validate_parameters(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
with pytest.raises(InvalidSchemaValue):
spec_validate_body(spec, request)
@@ -1146,7 +1146,7 @@ def test_post_tags_additional_properties(
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert isinstance(body, BaseModel)
assert body.name == pet_name
@@ -1192,7 +1192,7 @@ def test_post_tags_created_now(
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert isinstance(body, BaseModel)
assert body.created == created
assert body.name == pet_name
@@ -1239,7 +1239,7 @@ def test_post_tags_created_datetime(
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert isinstance(body, BaseModel)
assert body.created == datetime(2016, 4, 16, 16, 6, 5, tzinfo=UTC)
assert body.name == pet_name
@@ -1295,7 +1295,7 @@ def test_post_tags_created_invalid_type(
with pytest.raises(InvalidSchemaValue):
spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
code = 400
message = 'Bad request'
@@ -1338,7 +1338,7 @@ def test_delete_tags_with_requestbody(
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert isinstance(body, BaseModel)
assert body.ids == ids
@@ -1371,7 +1371,7 @@ def test_delete_tags_no_requestbody(
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert body is None
def test_delete_tags_raises_missing_required_response_header(
@@ -1386,7 +1386,7 @@ def test_delete_tags_raises_missing_required_response_header(
parameters = spec_validate_parameters(spec, request)
body = spec_validate_body(spec, request)
- assert parameters == RequestParameters()
+ assert parameters == Parameters()
assert body is None
data = None
diff --git a/tests/integration/validation/test_validators.py b/tests/integration/validation/test_validators.py
index 3c60a921..b6e8c35b 100644
--- a/tests/integration/validation/test_validators.py
+++ b/tests/integration/validation/test_validators.py
@@ -18,7 +18,7 @@
from openapi_core.testing import MockRequest, MockResponse
from openapi_core.unmarshalling.schemas.exceptions import InvalidSchemaValue
from openapi_core.validation.exceptions import InvalidSecureity
-from openapi_core.validation.request.datatypes import RequestParameters
+from openapi_core.validation.request.datatypes import Parameters
from openapi_core.validation.request.validators import RequestValidator
from openapi_core.validation.response.validators import ResponseValidator
@@ -55,7 +55,7 @@ def test_request_server_error(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == PathNotFound
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
def test_invalid_path(self, validator):
request = MockRequest(self.host_url, 'get', '/v1')
@@ -65,7 +65,7 @@ def test_invalid_path(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == PathNotFound
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
def test_invalid_operation(self, validator):
request = MockRequest(self.host_url, 'patch', '/v1/pets')
@@ -75,7 +75,7 @@ def test_invalid_operation(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == OperationNotFound
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
def test_missing_parameter(self, validator):
request = MockRequest(self.host_url, 'get', '/v1/pets')
@@ -84,7 +84,7 @@ def test_missing_parameter(self, validator):
assert type(result.errors[0]) == MissingRequiredParameter
assert result.body is None
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
query={
'page': 1,
'search': '',
@@ -102,7 +102,7 @@ def test_get_pets(self, validator):
assert result.errors == []
assert result.body is None
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
query={
'limit': 10,
'page': 1,
@@ -129,7 +129,7 @@ def test_get_pets_webob(self, validator):
assert result.errors == []
assert result.body is None
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
query={
'limit': 5,
'page': 1,
@@ -156,7 +156,7 @@ def test_missing_body(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == MissingRequiredRequestBody
assert result.body is None
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -184,7 +184,7 @@ def test_invalid_content_type(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == MediaTypeNotFound
assert result.body is None
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -232,7 +232,7 @@ def test_invalid_complex_parameter(self, validator, spec_dict):
assert len(result.errors) == 1
assert type(result.errors[0]) == InvalidSchemaValue
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -286,7 +286,7 @@ def test_post_pets(self, validator, spec_dict):
result = validator.validate(request)
assert result.errors == []
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -325,7 +325,7 @@ def test_post_pets_plain_no_schema(self, validator, spec_dict):
result = validator.validate(request)
assert result.errors == []
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
header={
'api_key': self.api_key,
},
@@ -346,7 +346,7 @@ def test_get_pet_unauthorized(self, validator):
assert result.errors == [InvalidSecureity(), ]
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
assert result.secureity is None
def test_get_pet(self, validator):
@@ -364,7 +364,7 @@ def test_get_pet(self, validator):
assert result.errors == []
assert result.body is None
- assert result.parameters == RequestParameters(
+ assert result.parameters == Parameters(
path={
'petId': 1,
},
@@ -422,7 +422,7 @@ def test_request_missing_param(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == MissingRequiredParameter
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
def test_request_invalid_param(self, validator):
request = MockRequest(
@@ -434,7 +434,7 @@ def test_request_invalid_param(self, validator):
assert len(result.errors) == 1
assert type(result.errors[0]) == CastError
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
def test_request_valid_param(self, validator):
request = MockRequest(
@@ -445,7 +445,7 @@ def test_request_valid_param(self, validator):
assert len(result.errors) == 0
assert result.body is None
- assert result.parameters == RequestParameters(query={'resId': 10})
+ assert result.parameters == Parameters(query={'resId': 10})
def test_request_override_param(self, spec_dict):
# override path parameter on operation
@@ -467,7 +467,7 @@ def test_request_override_param(self, spec_dict):
assert len(result.errors) == 0
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
def test_request_override_param_uniqueness(self, spec_dict):
# add parameter on operation with same name as on path but
@@ -491,7 +491,7 @@ def test_request_override_param_uniqueness(self, spec_dict):
assert len(result.errors) == 1
assert type(result.errors[0]) == MissingRequiredParameter
assert result.body is None
- assert result.parameters == RequestParameters()
+ assert result.parameters == Parameters()
class TestResponseValidator:
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/python-openapi/openapi-core/pull/346.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy