[BUG][RUBY-NEXTGEN] Object query parameters are always bracketed, ignoring style: form and explode

オープン
#24,995 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
65/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
openapi, ruby
領域
api, devtools

調査の方向性

The issue is in the Mustache template at modules/openapi-generator/src/main/resources/ruby-nextgen/api_operations.mustache. Start by understanding how query parameters are generated for the ruby-nextgen client. Look at the provided diff and test with the example spec to see the current vs expected output. The fix involves modifying the template to handle style: form with explode true/false correctly, while preserving deepObject behavior. Run the reproduction script to verify the fix.

索引モデルが issue の本文から書いたものです。

説明

Bug Report Checklist
  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
Description

ruby-nextgen sends every object (map) query parameter as name[key]=value, whatever its style/explode. api_operations.mustache puts the Hash under its parameter name (query: { 'filter' => filter }) and Connection hands it to Faraday, which brackets nested hashes. Only style: deepObject comes out right.

  • style: form, explode: true should put each entry at the top level: ?createdDate:gte=2023-01-01&tld=com
  • style: form, explode: false should be one comma-separated value: ?flatFilter=tld,com,x,y
openapi-generator version

master, 7.26.0-SNAPSHOT, 05b61f34d7fb0199330e1d6c57e6159f72427837

OpenAPI declaration file content or url
openapi: 3.0.3
info:
  title: explode
  version: 1.0.0
paths:
  /things:
    get:
      operationId: listThings
      parameters:
        - name: filter
          in: query
          style: form
          explode: true
          schema:
            type: object
            additionalProperties:
              type: string
        - name: flatFilter
          in: query
          style: form
          explode: false
          schema:
            type: object
            additionalProperties:
              type: string
        - name: deepFilter
          in: query
          style: deepObject
          explode: true
          schema:
            type: object
            additionalProperties:
              type: string
      responses:
        '200':
          description: OK
Generation Details
java -jar openapi-generator-cli.jar generate -g ruby-nextgen -i spec.yaml -o out \
  --additional-properties=gemName=petstore,moduleName=Petstore

Generated lib/petstore/api/things.rb:

          query: { 'filter' => filter, 'flatFilter' => flat_filter, 'deepFilter' => deep_filter }
Steps to reproduce
$LOAD_PATH.unshift 'out/lib'
require 'petstore'

# Answers every request with 200 and records the url it would have gone out with.
class Capture < Faraday::Middleware
  def call(env)
    $url = env.url.to_s
    env.status = 200; env.body = ''; env.response_headers = Faraday::Utils::Headers.new
    env.response = Faraday::Response.new(env)
  end
end

client = Petstore::Client.new(base_url: 'http://localhost') { |c| c.use(Capture) }
client.things.list(filter: { 'tld' => 'com', 'createdDate:gte' => '2023-01-01' })
puts URI.decode_www_form_component($url)
client.things.list(flat_filter: { 'tld' => 'com', 'x' => 'y' })
puts URI.decode_www_form_component($url)
client.things.list(deep_filter: { 'tld' => 'com' })
puts URI.decode_www_form_component($url)

Actual (ruby 3.3, faraday 2.14.4):

http://localhost/things?filter[createdDate:gte]=2023-01-01&filter[tld]=com
http://localhost/things?flatFilter[tld]=com&flatFilter[x]=y
http://localhost/things?deepFilter[tld]=com

Expected:

http://localhost/things?createdDate:gte=2023-01-01&tld=com
http://localhost/things?flatFilter=tld,com,x,y
http://localhost/things?deepFilter[tld]=com
Related issues/PRs
  • #24869 fixed the same defect in the ruby generator.
Suggest a fix

Spread form/explode maps into the query hash and join form/no-explode maps; deepObject and non-map parameters stay as they are. With this change the snippet above prints the expected output.

--- a/modules/openapi-generator/src/main/resources/ruby-nextgen/api_operations.mustache
+++ b/modules/openapi-generator/src/main/resources/ruby-nextgen/api_operations.mustache
@@ -20,7 +20,7 @@
       type: {{{vendorExtensions.x-rb-return-type}}},
       auth: [{{#authMethods}}'{{name}}'{{^-last}}, {{/-last}}{{/authMethods}}]{{#hasQueryParams}},{{/hasQueryParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{^hasHeaderParams}}{{#bodyParam}},{{/bodyParam}}{{^bodyParam}}{{#hasFormParams}},{{/hasFormParams}}{{/bodyParam}}{{/hasHeaderParams}}{{/hasQueryParams}}
 {{#hasQueryParams}}
-      query: { {{#queryParams}}'{{baseName}}' => {{paramName}}{{^-last}}, {{/-last}}{{/queryParams}} }{{#hasHeaderParams}},{{/hasHeaderParams}}{{^hasHeaderParams}}{{#bodyParam}},{{/bodyParam}}{{^bodyParam}}{{#hasFormParams}},{{/hasFormParams}}{{/bodyParam}}{{/hasHeaderParams}}
+      query: { {{#queryParams}}{{#isMap}}{{#isExplode}}{{^isDeepObject}}**({{paramName}} || {}){{/isDeepObject}}{{#isDeepObject}}'{{baseName}}' => {{paramName}}{{/isDeepObject}}{{/isExplode}}{{^isExplode}}'{{baseName}}' => {{paramName}}&.to_a&.flatten&.join(','){{/isExplode}}{{/isMap}}{{^isMap}}'{{baseName}}' => {{paramName}}{{/isMap}}{{^-last}}, {{/-last}}{{/queryParams}} }{{#hasHeaderParams}},{{/hasHeaderParams}}{{^hasHeaderParams}}{{#bodyParam}},{{/bodyParam}}{{^bodyParam}}{{#hasFormParams}},{{/hasFormParams}}{{/bodyParam}}{{/hasHeaderParams}}
 {{/hasQueryParams}}
 {{#hasHeaderParams}}
       headers: { {{#headerParams}}'{{baseName}}' => {{paramName}}{{^-last}}, {{/-last}}{{/headerParams}} }{{#bodyParam}},{{/bodyParam}}{{#hasFormParams}},{{/hasFormParams}}

Generated:

          query: { **(filter || {}), 'flatFilter' => flat_filter&.to_a&.flatten&.join(','), 'deepFilter' => deep_filter }

Generated with Claude Code

主要言語
Java
スター
26.9k
フォーク
7.8k
平均マージ
2日 10時間
マージ済み PR(30日)
180

環境構築

Codespaces で開く

このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

OpenAPITools/openapi-generator のほかの issue

OpenAPITools/openapi-generator の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。