Skip to content

Commit e8cda64

Browse files
devin-ai-integration[bot]dsinghvipgragg
authored
feat(ruby): Add API key (header-based) authentication support to Ruby SDK generator (#9882)
* Add API key (header-based) authentication support to Ruby SDK generator - Implement header authentication scheme in RootClientGenerator - Add constructor parameter for header auth schemes with environment variable support - Add header auth scheme to raw client headers with optional prefix support - Successfully tested with custom-auth fixture (X-API-KEY header) - Follows same pattern as Python generator implementation Co-Authored-By: Deep Singhvi <[email protected]> * Fix: Use header wire value for parameter naming instead of scheme name - Changed parameter name from scheme name to snake_case of header wire value - Example: X-API-KEY header now generates x_api_key parameter instead of custom_auth_scheme - Imported snakeCase from lodash-es for string conversion - Updated both parameter creation and header value references to use consistent naming Co-Authored-By: Deep Singhvi <[email protected]> * Use Fern name field for header parameter naming - Removed manual lodash snakeCase conversion - Using header.name.name.snakeCase.safeName instead of snakeCase(header.name.wireValue) - This ensures proper use of Fern's built-in name conversion Co-Authored-By: Deep Singhvi <[email protected]> * Add any-auth fixture support for API key authentication - Generated output now includes X-API-Key header alongside Bearer token - Test passes successfully with ruby-sdk-v2 generator Co-Authored-By: Deep Singhvi <[email protected]> * Fix: Support multiple authentication parameters in client constructor - Changed getAuthenticationParameter() to getAuthenticationParameters() returning an array - Now handles APIs with multiple auth schemes (e.g., any-auth with bearer + API key) - Fixes missing api_key parameter issue in any-auth fixture - Both token and api_key are now properly added to constructor with ENV defaults Co-Authored-By: Deep Singhvi <[email protected]> * chore: Add changelog entry for v1.0.0-rc29 - Added API key (header-based) authentication support - Added support for multiple authentication schemes in the same API Co-Authored-By: Deep Singhvi <[email protected]> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Deep Singhvi <[email protected]> Co-authored-by: Piper Gragg <[email protected]>
1 parent 0d359e7 commit e8cda64

File tree

4 files changed

+53
-13
lines changed

4 files changed

+53
-13
lines changed

generators/ruby-v2/sdk/src/root-client/RootClientGenerator.ts

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,8 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
5656
});
5757
parameters.push(baseUrlParameter);
5858

59-
const authenticationParameter = this.getAuthenticationParameter();
60-
if (authenticationParameter != null) {
61-
parameters.push(authenticationParameter);
62-
}
59+
const authenticationParameters = this.getAuthenticationParameters();
60+
parameters.push(...authenticationParameters);
6361

6462
const method = ruby.method({
6563
name: "initialize",
@@ -92,11 +90,13 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
9290
return method;
9391
}
9492

95-
private getAuthenticationParameter(): ruby.KeywordParameter | undefined {
93+
private getAuthenticationParameters(): ruby.KeywordParameter[] {
94+
const parameters: ruby.KeywordParameter[] = [];
95+
9696
for (const scheme of this.context.ir.auth.schemes) {
9797
switch (scheme.type) {
98-
case "bearer":
99-
return ruby.parameters.keyword({
98+
case "bearer": {
99+
const param = ruby.parameters.keyword({
100100
name: TOKEN_PARAMETER_NAME,
101101
type: ruby.Type.string(),
102102
initializer:
@@ -107,12 +107,30 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
107107
: undefined,
108108
docs: undefined
109109
});
110+
parameters.push(param);
111+
break;
112+
}
113+
case "header": {
114+
const param = ruby.parameters.keyword({
115+
name: scheme.name.name.snakeCase.safeName,
116+
type: ruby.Type.string(),
117+
initializer:
118+
scheme.headerEnvVar != null
119+
? ruby.codeblock((writer) => {
120+
writer.write(`ENV.fetch("${scheme.headerEnvVar}", nil)`);
121+
})
122+
: undefined,
123+
docs: undefined
124+
});
125+
parameters.push(param);
126+
break;
127+
}
110128
default:
111-
return undefined;
129+
break;
112130
}
113131
}
114132

115-
return undefined;
133+
return parameters;
116134
}
117135

118136
private getRawClientHeaders(): ruby.TypeLiteral {
@@ -138,6 +156,17 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
138156
value: ruby.TypeLiteral.string(`Bearer #{${TOKEN_PARAMETER_NAME}}`)
139157
});
140158
break;
159+
case "header": {
160+
const headerParamName = header.name.name.snakeCase.safeName;
161+
const headerName = header.name.wireValue;
162+
const headerValue =
163+
header.prefix != null ? `${header.prefix} #{${headerParamName}}` : `#{${headerParamName}}`;
164+
headers.push({
165+
key: ruby.TypeLiteral.string(headerName),
166+
value: ruby.TypeLiteral.string(headerValue)
167+
});
168+
break;
169+
}
141170
default:
142171
break;
143172
}

generators/ruby-v2/sdk/versions.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# yaml-language-server: $schema=../../../fern-versions-yml.schema.json
22

3+
- version: 1.0.0-rc29
4+
createdAt: "2025-10-21"
5+
changelogEntry:
6+
- type: feat
7+
summary: |
8+
Add support for API key (header-based) authentication in Ruby SDK generator.
9+
Supports multiple authentication schemes in the same API.
10+
irVersion: 59
11+
312
- version: 1.0.0-rc28
413
createdAt: "2025-10-01"
514
changelogEntry:

seed/ruby-sdk-v2/any-auth/lib/seed/client.rb

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ruby-sdk-v2/custom-auth/lib/seed/client.rb

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)