Skip to content

Commit b6fdd64

Browse files
authored
Merge pull request #197 from p1c2u/refactor/openapi-request-datatype-refactor
OpenAPI request datatype refactor
2 parents 281aab8 + e0d61c8 commit b6fdd64

File tree

6 files changed

+33
-45
lines changed

6 files changed

+33
-45
lines changed

openapi_core/contrib/django/requests.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""OpenAPI core contrib django requests module"""
22
import re
33

4+
from six.moves.urllib.parse import urljoin
5+
46
from openapi_core.validation.request.datatypes import (
57
RequestParameters, OpenAPIRequest,
68
)
@@ -40,11 +42,11 @@ def create(cls, request):
4042
header=request.headers,
4143
cookie=request.COOKIES,
4244
)
45+
full_url_pattern = urljoin(
46+
request._current_scheme_host, path_pattern)
4347
return OpenAPIRequest(
44-
host_url=request._current_scheme_host,
45-
path=request.path,
48+
full_url_pattern=full_url_pattern,
4649
method=method,
47-
path_pattern=path_pattern,
4850
parameters=parameters,
4951
body=request.body,
5052
mimetype=request.content_type,

openapi_core/contrib/flask/requests.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""OpenAPI core contrib flask requests module"""
22
import re
33

4+
from six.moves.urllib.parse import urljoin
5+
46
from openapi_core.validation.request.datatypes import (
57
RequestParameters, OpenAPIRequest,
68
)
@@ -28,10 +30,9 @@ def create(cls, request):
2830
header=request.headers,
2931
cookie=request.cookies,
3032
)
33+
full_url_pattern = urljoin(request.host_url, path_pattern)
3134
return OpenAPIRequest(
32-
host_url=request.host_url,
33-
path=request.path,
34-
path_pattern=path_pattern,
35+
full_url_pattern=full_url_pattern,
3536
method=method,
3637
parameters=parameters,
3738
body=request.data,

openapi_core/testing/requests.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""OpenAPI core testing requests module"""
2+
from six.moves.urllib.parse import urljoin
23
from werkzeug.datastructures import ImmutableMultiDict
34

45
from openapi_core.validation.request.datatypes import (
@@ -22,10 +23,9 @@ def create(
2223
path_pattern = path_pattern or path
2324
method = method.lower()
2425
body = data or ''
26+
full_url_pattern = urljoin(host_url, path_pattern)
2527
return OpenAPIRequest(
26-
host_url=host_url,
27-
path=path,
28-
path_pattern=path_pattern,
28+
full_url_pattern=full_url_pattern,
2929
method=method,
3030
parameters=parameters,
3131
body=body,

openapi_core/validation/request/datatypes.py

+8-17
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
from openapi_core.validation.datatypes import BaseValidationResult
66

77

8-
from six.moves.urllib.parse import urljoin
9-
10-
118
@attr.s
129
class RequestParameters(object):
1310
"""OpenAPI request parameters dataclass.
@@ -36,10 +33,13 @@ class OpenAPIRequest(object):
3633
"""OpenAPI request dataclass.
3734
3835
Attributes:
39-
path
40-
Requested path as string.
41-
path_pattern
42-
The matched url pattern.
36+
full_url_pattern
37+
The matched url with scheme, host and path pattern.
38+
For example:
39+
https://localhost:8000/api/v1/pets
40+
https://localhost:8000/api/v1/pets/{pet_id}
41+
method
42+
The request method, as lowercase string.
4343
parameters
4444
A RequestParameters object.
4545
body
@@ -51,21 +51,12 @@ class OpenAPIRequest(object):
5151
the mimetype would be "text/html".
5252
"""
5353

54-
host_url = attr.ib()
55-
path = attr.ib()
56-
path_pattern = attr.ib()
54+
full_url_pattern = attr.ib()
5755
method = attr.ib()
58-
5956
body = attr.ib()
60-
6157
mimetype = attr.ib()
62-
6358
parameters = attr.ib(factory=RequestParameters)
6459

65-
@property
66-
def full_url_pattern(self):
67-
return urljoin(self.host_url, self.path_pattern)
68-
6960

7061
@attr.s
7162
class RequestValidationResult(BaseValidationResult):

tests/integration/contrib/flask/test_flask_requests.py

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from six.moves.urllib.parse import urljoin
12
from werkzeug.datastructures import EnvironHeaders, ImmutableMultiDict
23

34
from openapi_core.contrib.flask import FlaskOpenAPIRequest
@@ -21,10 +22,9 @@ def test_simple(self, request_factory, request):
2122
header=headers,
2223
cookie=cookies,
2324
)
24-
assert openapi_request.host_url == request.host_url
25-
assert openapi_request.path == request.path
2625
assert openapi_request.method == request.method.lower()
27-
assert openapi_request.path_pattern == request.path
26+
assert openapi_request.full_url_pattern == \
27+
urljoin(request.host_url, request.path)
2828
assert openapi_request.body == request.data
2929
assert openapi_request.mimetype == request.mimetype
3030

@@ -46,10 +46,9 @@ def test_multiple_values(self, request_factory, request):
4646
header=headers,
4747
cookie=cookies,
4848
)
49-
assert openapi_request.host_url == request.host_url
50-
assert openapi_request.path == request.path
5149
assert openapi_request.method == request.method.lower()
52-
assert openapi_request.path_pattern == request.path
50+
assert openapi_request.full_url_pattern == \
51+
urljoin(request.host_url, request.path)
5352
assert openapi_request.body == request.data
5453
assert openapi_request.mimetype == request.mimetype
5554

@@ -68,9 +67,8 @@ def test_url_rule(self, request_factory, request):
6867
header=headers,
6968
cookie=cookies,
7069
)
71-
assert openapi_request.host_url == request.host_url
72-
assert openapi_request.path == request.path
7370
assert openapi_request.method == request.method.lower()
74-
assert openapi_request.path_pattern == '/browse/{id}/'
71+
assert openapi_request.full_url_pattern == \
72+
urljoin(request.host_url, '/browse/{id}/')
7573
assert openapi_request.body == request.data
7674
assert openapi_request.mimetype == request.mimetype

tests/integration/contrib/test_django.py

+6-10
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,9 @@ def test_no_resolver(self, request_factory):
8181
header=headers,
8282
cookie=cookies,
8383
)
84-
assert openapi_request.host_url == request._current_scheme_host
85-
assert openapi_request.path == request.path
8684
assert openapi_request.method == request.method.lower()
87-
assert openapi_request.path_pattern == request.path
85+
assert openapi_request.full_url_pattern == \
86+
request._current_scheme_host + request.path
8887
assert openapi_request.body == request.body
8988
assert openapi_request.mimetype == request.content_type
9089

@@ -107,10 +106,9 @@ def test_simple(self, request_factory):
107106
header=headers,
108107
cookie=cookies,
109108
)
110-
assert openapi_request.host_url == request._current_scheme_host
111-
assert openapi_request.path == request.path
112109
assert openapi_request.method == request.method.lower()
113-
assert openapi_request.path_pattern == request.path
110+
assert openapi_request.full_url_pattern == \
111+
request._current_scheme_host + request.path
114112
assert openapi_request.body == request.body
115113
assert openapi_request.mimetype == request.content_type
116114

@@ -135,11 +133,9 @@ def test_url_rule(self, request_factory):
135133
header=headers,
136134
cookie=cookies,
137135
)
138-
assert openapi_request.host_url == request._current_scheme_host
139-
assert openapi_request.path == request.path
140136
assert openapi_request.method == request.method.lower()
141-
assert openapi_request.path_pattern == \
142-
"/admin/auth/group/{object_id}/"
137+
assert openapi_request.full_url_pattern == \
138+
request._current_scheme_host + "/admin/auth/group/{object_id}/"
143139
assert openapi_request.body == request.body
144140
assert openapi_request.mimetype == request.content_type
145141

0 commit comments

Comments
 (0)