[BUG][RUBY-NEXTGEN] Object query parameters are always bracketed, ignoring style: form and explode
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 65/100
Hướng nghiên cứu
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.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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: trueshould put each entry at the top level:?createdDate:gte=2023-01-01&tld=comstyle: form, explode: falseshould 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
rubygenerator.
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
- Ngôn ngữ chính
- Java
- Star
- 26.9k
- Fork
- 7.8k
- Merge trung bình
- 2 ngày 10 giờ
- Pull request đã merge (30 ngày)
- 180
Chuẩn bị môi trường
Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của OpenAPITools/openapi-generator
-
Issue: Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
OpenAPITools/openapi-generator#25643 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
OpenAPITools/openapi-generator#25640 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[BUG][JAVA] Deprecated properties only get @Deprecated on the getter (base, feign, native, microprofile)Có thể đã có người làm @Inf1mum đã nhận 2 ngày trước. Đang mởIssue: Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
OpenAPITools/openapi-generator#25567 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[BUG][KOTLIN-SERVER] typeInfoAnnotation.mustache uses As.PROPERTY → discriminator property serialized twiceCó thể đã có người làm @Inf1mum đã nhận 9 ngày trước. Đang mởIssue: Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
OpenAPITools/openapi-generator#25524 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[REQ][JAVA][resteasy] Support for Jackson 3 / useJackson3Có thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởEnhancement: Feature
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
OpenAPITools/openapi-generator#25364 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của OpenAPITools/openapi-generator
Issue tương tự
-
bug emitter:client:csharp
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
microsoft/typespec#12572 · 1 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
GCC 15.2: -Wcast-qual warning - cast discards const qualifier from pointer target type (H5trace.c)Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 73/100
Maintainer thường phản hồi trong vòng 1 ngày
-
[Bug] RemotingHelper.connect swaps the socket send and receive buffer configurationCó thể đã có người làm @amalsaidov đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-area-label
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 2 ngày
-
area/ai area/backend component/zeebe kind/task
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày