Skip to content

Commit 9d25233

Browse files
authored
Merge pull request #273 from grinspins/fix/prioritize-concrete-branches
Fix/prioritize concrete branches
2 parents ed901ee + 0e93b49 commit 9d25233

File tree

2 files changed

+94
-2
lines changed

2 files changed

+94
-2
lines changed

openapi_core/templating/paths/finders.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ def find(self, request):
3939
raise ServerNotFound(request.full_url_pattern)
4040

4141
def _get_paths_iter(self, full_url_pattern):
42+
template_paths = []
4243
for path_pattern, path in iteritems(self.spec.paths):
43-
# simple path
44+
# simple path. Return right away since it is always the most concrete
4445
if full_url_pattern.endswith(path_pattern):
4546
path_result = TemplateResult(path_pattern, {})
4647
yield (path, path_result)
@@ -49,7 +50,11 @@ def _get_paths_iter(self, full_url_pattern):
4950
result = search(path_pattern, full_url_pattern)
5051
if result:
5152
path_result = TemplateResult(path_pattern, result.named)
52-
yield (path, path_result)
53+
template_paths.append((path, path_result))
54+
55+
# Fewer variables -> more concrete path
56+
for path in sorted(template_paths, key=lambda p: len(p[1].variables)):
57+
yield path
5358

5459
def _get_operations_iter(self, request_method, paths_iter):
5560
for path, path_result in paths_iter:

tests/unit/templating/test_paths_finders.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,3 +435,90 @@ def test_valid(self, finder, path_2, operation_2, server):
435435
assert result == (
436436
path_2, operation_2, server, path_result, server_result,
437437
)
438+
439+
440+
class TestConcretePaths(
441+
BaseTestSpecServer, BaseTestSimpleServer):
442+
443+
path_name = '/keys/{id}/tokens'
444+
445+
@pytest.fixture
446+
def operation_2(self):
447+
return Operation('get', '/keys/master/tokens', {}, {})
448+
449+
@pytest.fixture
450+
def operations_2(self, operation_2):
451+
return {
452+
'get': operation_2,
453+
}
454+
455+
@pytest.fixture
456+
def path(self, operations):
457+
return Path('/keys/{id}/tokens', operations)
458+
459+
@pytest.fixture
460+
def path_2(self, operations_2):
461+
return Path('/keys/master/tokens', operations_2)
462+
463+
@pytest.fixture
464+
def paths(self, path, path_2):
465+
return {
466+
path.name: path,
467+
path_2.name: path_2,
468+
}
469+
470+
def test_valid(self, finder, path_2, operation_2, server):
471+
request_uri = '/keys/master/tokens'
472+
request = MockRequest(
473+
'http://petstore.swagger.io', 'get', request_uri)
474+
result = finder.find(request)
475+
476+
path_result = TemplateResult(path_2.name, {})
477+
server_result = TemplateResult(self.server_url, {})
478+
assert result == (
479+
path_2, operation_2, server, path_result, server_result,
480+
)
481+
482+
483+
class TestTemplateConcretePaths(
484+
BaseTestSpecServer, BaseTestSimpleServer):
485+
486+
path_name = '/keys/{id}/tokens/{id2}'
487+
488+
@pytest.fixture
489+
def operation_2(self):
490+
return Operation('get', '/keys/{id}/tokens/master', {}, {})
491+
492+
@pytest.fixture
493+
def operations_2(self, operation_2):
494+
return {
495+
'get': operation_2,
496+
}
497+
498+
@pytest.fixture
499+
def path(self, operations):
500+
return Path('/keys/{id}/tokens/{id2}', operations)
501+
502+
@pytest.fixture
503+
def path_2(self, operations_2):
504+
return Path('/keys/{id}/tokens/master', operations_2)
505+
506+
@pytest.fixture
507+
def paths(self, path, path_2):
508+
return {
509+
path.name: path,
510+
path_2.name: path_2,
511+
}
512+
513+
def test_valid(self, finder, path_2, operation_2, server):
514+
token_id = '123'
515+
request_uri = '/keys/{0}/tokens/master'.format(token_id)
516+
request = MockRequest(
517+
'http://petstore.swagger.io', 'get', request_uri)
518+
result = finder.find(request)
519+
520+
path_result = TemplateResult(path_2.name, {'id': '123'})
521+
server_result = TemplateResult(self.server_url, {})
522+
assert result == (
523+
path_2, operation_2, server, path_result, server_result,
524+
)

0 commit comments

Comments
 (0)