Skip to content

Commit 8daad27

Browse files
committed
Finder exception
1 parent f678e24 commit 8daad27

File tree

7 files changed

+63
-15
lines changed

7 files changed

+63
-15
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import attr
2+
3+
from openapi_core.exceptions import OpenAPIError
4+
5+
6+
@attr.s(hash=True)
7+
class PathNotFound(OpenAPIError):
8+
"""Find path error"""
9+
path_pattern = attr.ib()
10+
11+
def __str__(self):
12+
return "Path not found for {0}".format(self.path_pattern)

openapi_core/templating/paths/finders.py

+16-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from parse import parse
22
from six.moves.urllib.parse import urljoin
33

4+
from openapi_core.schema.operations.exceptions import InvalidOperation
5+
from openapi_core.schema.paths.exceptions import InvalidPath
6+
from openapi_core.schema.servers.exceptions import InvalidServer
47
from openapi_core.templating.paths.exceptions import PathNotFound
58
from openapi_core.templating.paths.util import get_operation_pattern
69

@@ -11,16 +14,19 @@ def __init__(self, spec):
1114
self.spec = spec
1215

1316
def find(self, request):
14-
operation_pattern = self._get_operation_pattern(request)
15-
16-
path = self.spec[operation_pattern]
17-
path_variables = {}
18-
operation = self.spec.get_operation(operation_pattern, request.method)
19-
servers = path.servers or operation.servers or self.spec.servers
20-
server = servers[0]
21-
server_variables = {}
22-
23-
return path, operation, server, path_variables, server_variables
17+
try:
18+
operation_pattern = self._get_operation_pattern(request)
19+
20+
path = self.spec[operation_pattern]
21+
path_variables = {}
22+
operation = self.spec.get_operation(operation_pattern, request.method)
23+
servers = path.servers or operation.servers or self.spec.servers
24+
server = servers[0]
25+
server_variables = {}
26+
except (InvalidServer, InvalidPath, InvalidOperation):
27+
raise PathNotFound(request.path_pattern)
28+
else:
29+
return path, operation, server, path_variables, server_variables
2430

2531
def _get_operation_pattern(self, request):
2632
server = self.spec.get_server(request.full_url_pattern)
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from parse import parse
2+
from six.moves.urllib.parse import urljoin
3+
4+
from openapi_core.templating.paths.exceptions import PathNotFound
5+
6+
7+
class PathFinder(object):
8+
9+
def __init__(self, spec):
10+
self.spec = spec
11+
12+
def find(self, request):
13+
for path in self.spec.paths:
14+
if request.method not in path.operations:
15+
continue
16+
operation = path.operations[request.method]
17+
servers = path.servers or operations.servers or self.spec.servers
18+
for server in servers:
19+
path_pattern = urljoin(server.url, path.name)
20+
if request.path_pattern == path_pattern:
21+
return path, operation, server, {}
22+
parsed = parse(path_pattern, request.path_pattern)
23+
if parsed:
24+
return path, operation, server, parsed.named
25+
26+
raise PathNotFound(request.path_pattern)

openapi_core/validation/request/validators.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from openapi_core.schema.request_bodies.exceptions import MissingRequestBody
1414
from openapi_core.schema.servers.exceptions import InvalidServer
1515
from openapi_core.security.exceptions import SecurityError
16+
from openapi_core.templating.paths.exceptions import PathNotFound
1617
from openapi_core.unmarshalling.schemas.enums import UnmarshalContext
1718
from openapi_core.unmarshalling.schemas.exceptions import (
1819
UnmarshalError, ValidateError,
@@ -30,7 +31,7 @@ def validate(self, request):
3031
try:
3132
path, operation, _, _, _ = self._find_path(request)
3233
# don't process if operation errors
33-
except (InvalidServer, InvalidPath, InvalidOperation) as exc:
34+
except PathNotFound as exc:
3435
return RequestValidationResult([exc, ], None, None, None)
3536

3637
try:
@@ -53,7 +54,7 @@ def validate(self, request):
5354
def _validate_parameters(self, request):
5455
try:
5556
path, operation, _, _, _ = self._find_path(request)
56-
except (InvalidServer, InvalidPath, InvalidOperation) as exc:
57+
except PathNotFound as exc:
5758
return RequestValidationResult([exc, ], None, None)
5859

5960
params, params_errors = self._get_parameters(
@@ -67,7 +68,7 @@ def _validate_parameters(self, request):
6768
def _validate_body(self, request):
6869
try:
6970
_, operation, _, _, _ = self._find_path(request)
70-
except (InvalidServer, InvalidOperation) as exc:
71+
except PathNotFound as exc:
7172
return RequestValidationResult([exc, ], None, None)
7273

7374
body, body_errors = self._get_body(request, operation)

openapi_core/validation/response/validators.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
InvalidResponse, MissingResponseContent,
99
)
1010
from openapi_core.schema.servers.exceptions import InvalidServer
11+
from openapi_core.templating.paths.exceptions import PathNotFound
1112
from openapi_core.unmarshalling.schemas.enums import UnmarshalContext
1213
from openapi_core.unmarshalling.schemas.exceptions import (
1314
UnmarshalError, ValidateError,
@@ -22,7 +23,7 @@ def validate(self, request, response):
2223
try:
2324
_, operation, _, _, _ = self._find_path(request)
2425
# don't process if operation errors
25-
except (InvalidServer, InvalidPath, InvalidOperation) as exc:
26+
except PathNotFound as exc:
2627
return ResponseValidationResult([exc, ], None, None)
2728

2829
try:
@@ -47,7 +48,7 @@ def _validate_data(self, request, response):
4748
try:
4849
_, operation, _, _, _ = self._find_path(request)
4950
# don't process if operation errors
50-
except (InvalidServer, InvalidPath, InvalidOperation) as exc:
51+
except PathNotFound as exc:
5152
return ResponseValidationResult([exc, ], None, None)
5253

5354
try:

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ lazy-object-proxy
44
strict_rfc3339
55
isodate
66
attrs
7+
parse==1.14.0

setup.cfg

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ install_requires =
2929
strict_rfc3339
3030
isodate
3131
attrs
32+
parse
3233
backports.functools-lru-cache; python_version<"3.0"
3334
backports.functools-partialmethod; python_version<"3.0"
3435
tests_require =

0 commit comments

Comments
 (0)