diff --git a/openapi_core/schema/paths/generators.py b/openapi_core/schema/paths/generators.py index 92891243..68a236af 100644 --- a/openapi_core/schema/paths/generators.py +++ b/openapi_core/schema/paths/generators.py @@ -3,6 +3,7 @@ from openapi_core.compat import lru_cache from openapi_core.schema.operations.generators import OperationsGenerator +from openapi_core.schema.parameters.generators import ParametersGenerator from openapi_core.schema.paths.models import Path @@ -16,9 +17,17 @@ def generate(self, paths): paths_deref = self.dereferencer.dereference(paths) for path_name, path in iteritems(paths_deref): operations = self.operations_generator.generate(path_name, path) - yield path_name, Path(path_name, list(operations)) + parameters = self.parameters_generator.generate_from_list( + path.get('parameters', {}) + ) + yield path_name, Path(path_name, list(operations), parameters) @property @lru_cache() def operations_generator(self): return OperationsGenerator(self.dereferencer, self.schemas_registry) + + @property + @lru_cache() + def parameters_generator(self): + return ParametersGenerator(self.dereferencer, self.schemas_registry) diff --git a/openapi_core/schema/paths/models.py b/openapi_core/schema/paths/models.py index c4880a61..89cf2a09 100644 --- a/openapi_core/schema/paths/models.py +++ b/openapi_core/schema/paths/models.py @@ -4,9 +4,10 @@ class Path(object): """Represents an OpenAPI Path.""" - def __init__(self, name, operations): + def __init__(self, name, operations, parameters=None): self.name = name self.operations = dict(operations) + self.parameters = dict(parameters) if parameters else {} def __getitem__(self, http_method): return self.operations[http_method] diff --git a/tests/integration/data/v3.0/path_param.yaml b/tests/integration/data/v3.0/path_param.yaml new file mode 100644 index 00000000..e0b3e8df --- /dev/null +++ b/tests/integration/data/v3.0/path_param.yaml @@ -0,0 +1,17 @@ +openapi: "3.0.0" +info: + title: Minimal OpenAPI specification with path parameters + version: "0.1" +paths: + /resource/{resId}: + parameters: + - name: resId + in: path + required: true + description: the ID of the resource to retrieve + schema: + type: string + get: + responses: + default: + description: Return the resource. diff --git a/tests/integration/test_path_params.py b/tests/integration/test_path_params.py new file mode 100644 index 00000000..e2c6d544 --- /dev/null +++ b/tests/integration/test_path_params.py @@ -0,0 +1,23 @@ +import pytest + +from openapi_core.schema.parameters.enums import ParameterLocation +from openapi_core.shortcuts import create_spec + + +class TestMinimal(object): + + spec_paths = [ + "data/v3.0/path_param.yaml" + ] + + @pytest.mark.parametrize("spec_path", spec_paths) + def test_param_present(self, factory, spec_path): + spec_dict = factory.spec_from_file(spec_path) + spec = create_spec(spec_dict) + + path = spec['/resource/{resId}'] + + assert len(path.parameters) == 1 + param = path.parameters['resId'] + assert param.required + assert param.location == ParameterLocation.PATH