Skip to content
Merged
47 changes: 38 additions & 9 deletions generators/ruby-v2/sdk/src/root-client/RootClientGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,8 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
});
parameters.push(baseUrlParameter);

const authenticationParameter = this.getAuthenticationParameter();
if (authenticationParameter != null) {
parameters.push(authenticationParameter);
}
const authenticationParameters = this.getAuthenticationParameters();
parameters.push(...authenticationParameters);

const method = ruby.method({
name: "initialize",
Expand Down Expand Up @@ -92,11 +90,13 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
return method;
}

private getAuthenticationParameter(): ruby.KeywordParameter | undefined {
private getAuthenticationParameters(): ruby.KeywordParameter[] {
const parameters: ruby.KeywordParameter[] = [];

for (const scheme of this.context.ir.auth.schemes) {
switch (scheme.type) {
case "bearer":
return ruby.parameters.keyword({
case "bearer": {
const param = ruby.parameters.keyword({
name: TOKEN_PARAMETER_NAME,
type: ruby.Type.string(),
initializer:
Expand All @@ -107,12 +107,30 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
: undefined,
docs: undefined
});
parameters.push(param);
break;
}
case "header": {
const param = ruby.parameters.keyword({
name: scheme.name.name.snakeCase.safeName,
type: ruby.Type.string(),
initializer:
scheme.headerEnvVar != null
? ruby.codeblock((writer) => {
writer.write(`ENV.fetch("${scheme.headerEnvVar}", nil)`);
})
: undefined,
docs: undefined
});
parameters.push(param);
break;
}
default:
return undefined;
break;
}
}

return undefined;
return parameters;
}

private getRawClientHeaders(): ruby.TypeLiteral {
Expand All @@ -138,6 +156,17 @@ export class RootClientGenerator extends FileGenerator<RubyFile, SdkCustomConfig
value: ruby.TypeLiteral.string(`Bearer #{${TOKEN_PARAMETER_NAME}}`)
});
break;
case "header": {
const headerParamName = header.name.name.snakeCase.safeName;
const headerName = header.name.wireValue;
const headerValue =
header.prefix != null ? `${header.prefix} #{${headerParamName}}` : `#{${headerParamName}}`;
headers.push({
key: ruby.TypeLiteral.string(headerName),
value: ruby.TypeLiteral.string(headerValue)
});
break;
}
default:
break;
}
Expand Down
9 changes: 9 additions & 0 deletions generators/ruby-v2/sdk/versions.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# yaml-language-server: $schema=../../../fern-versions-yml.schema.json

- version: 1.0.0-rc29
createdAt: "2025-10-21"
changelogEntry:
- type: feat
summary: |
Add support for API key (header-based) authentication in Ruby SDK generator.
Supports multiple authentication schemes in the same API.
irVersion: 59

- version: 1.0.0-rc28
createdAt: "2025-10-01"
changelogEntry:
Expand Down
5 changes: 3 additions & 2 deletions seed/ruby-sdk-v2/any-auth/lib/seed/client.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions seed/ruby-sdk-v2/custom-auth/lib/seed/client.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading