From 3c5995b0e73ec8a64dfbf9375d16b9420a9f5b49 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 24 Sep 2026 16:20:38 +0900 Subject: [PATCH] Resolve OpenAPI 2 parameter references --- lib/committee/drivers/open_api_2/driver.rb | 15 +++++++++++++++ test/drivers/open_api_2/driver_test.rb | 13 +++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/committee/drivers/open_api_2/driver.rb b/lib/committee/drivers/open_api_2/driver.rb index 24053c07..b6af843d 100644 --- a/lib/committee/drivers/open_api_2/driver.rb +++ b/lib/committee/drivers/open_api_2/driver.rb @@ -127,6 +127,20 @@ def parse_definitions!(data) [schema, store] end + def resolve_parameter_references(link_data, data) + return link_data unless link_data["parameters"] + + parameters = link_data["parameters"].map do |parameter| + ref = parameter["$ref"] + next parameter unless ref + + name = ref.delete_prefix("#/parameters/").gsub("~1", "/").gsub("~0", "~") + data.fetch("parameters").fetch(name) + end + + link_data.merge("parameters" => parameters) + end + def parse_routes!(data, schema, store) routes = {} @@ -152,6 +166,7 @@ def parse_routes!(data, schema, store) link.href = href link.media_type = schema.produces link.method = method + link_data = resolve_parameter_references(link_data, data) # Convert the spec's parameter pseudo-schemas into JSON schemas that # we can use for some basic request validation. diff --git a/test/drivers/open_api_2/driver_test.rb b/test/drivers/open_api_2/driver_test.rb index a8b00bb6..c9b1f084 100644 --- a/test/drivers/open_api_2/driver_test.rb +++ b/test/drivers/open_api_2/driver_test.rb @@ -44,6 +44,19 @@ end end + it "resolves references to reusable parameters" do + schema_data = schema_data_with_responses({ '200' => { 'description' => 'ok' } }) + schema_data['parameters'] = { 'limit' => { 'name' => 'limit', 'in' => 'query', 'type' => 'integer' }, 'authorization' => { 'name' => 'Authorization', 'in' => 'header', 'type' => 'string' }, } + schema_data['paths']['/foos']['get']['parameters'] = [{ '$ref' => '#/parameters/limit' }, { '$ref' => '#/parameters/authorization' },] + + schema = @driver.parse(schema_data) + + link = schema.routes['GET'][0][1] + assert_equal ['limit'], link.schema.properties.keys + assert_equal ['integer'], link.schema.properties['limit'].type + assert_equal ['Authorization'], link.header_schema.properties.keys + end + it "names capture groups into href regexes" do schema = @driver.parse(open_api_2_data) assert_equal %r{^\/api\/pets\/(?[^\/]+)$}.inspect, schema.routes["DELETE"][0][0].inspect