From 34b001292a68ff17aa5bc85a754522a175308ec1 Mon Sep 17 00:00:00 2001 From: kmak Date: Sun, 4 May 2025 04:59:29 -0400 Subject: [PATCH] fix: support path level parameters for open_api_spec_parser --- .../openapi_spec_parser.py | 6 +++ .../test_openapi_spec_parser.py | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py index 9535953d..563b0e9f 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py @@ -108,6 +108,12 @@ class OpenApiSpecParser: operation_dict = path_item.get(method) if operation_dict is None: continue + + # Append path-level parameters + operation_dict['parameters'] = ( + operation_dict.get("parameters", []) + + path_item.get("parameters", []) + ) # If operation ID is missing, assign an operation id based on path # and method diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py index de3156e5..1236aea1 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py @@ -626,3 +626,51 @@ def test_parse_spec_with_duplicate_parameter_names(openapi_spec_generator): assert body_param is not None assert body_param.original_name == "name" assert body_param.py_name == "name_0" + + +def test_parse_spec_with_path_level_parameters(openapi_spec_generator): + """Test that operation parameters are correctly combined with path-level parameters.""" + openapi_spec = { + "openapi": "3.1.0", + "info": {"title": "Combine Parameters API", "version": "1.0.0"}, + "paths": { + "/test": { + "parameters": [ + {"name": "global_param", "in": "query", "schema": {"type": "string"}} + ], + "get": { + "parameters": [ + {"name": "local_param", "in": "header", "schema": {"type": "integer"}} + ], + "operationId": "testGet", + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {"schema": {"type": "string"}} + }, + } + }, + }, + } + }, + } + + parsed_operations = openapi_spec_generator.parse(openapi_spec) + assert len(parsed_operations) == 1 + + operation = parsed_operations[0] + assert len(operation.parameters) == 2 + + # Verify the combined parameters + global_param = next((p for p in operation.parameters if p.original_name == "global_param"), None) + local_param = next((p for p in operation.parameters if p.original_name == "local_param"), None) + + assert global_param is not None + assert global_param.param_location == "query" + assert global_param.type_value is str + + assert local_param is not None + assert local_param.param_location == "header" + assert local_param.type_value is int + \ No newline at end of file