1.12.11
(fix): Dynamic snippets now render path-parameter arguments in IR (URL / SDK signature) order
rather than in the order they happen to appear in the input request, so generated
examples line up with the actual SDK method signature even when the spec lists path
parameters in a different order.
1.12.10
(chore): Bump addressable from 2.8.10 to 2.9.0 in the ruby-v2 SDK generator
container to clear CVE-2026-35611 (ReDoS in URI template expansion).
Switch the post-install cleanup to gem cleanup so older 2.8.x copies
dragged in by rubocop’s dependency graph are dropped from the final
image. rexml stays pinned at 3.4.4 (past the 3.3.6 CVE-2024-49761
fix). Also strip the vendored Gemfile.lock files inside cached
gems (lint_roller, rbs, typeprof, unicode-emoji) so grype stops
reading their pinned rexml / rdoc / addressable versions as
installed packages.
1.12.9
(fix): Stop launching WireMock with --global-response-templating in generated
wire-test docker-compose.test.yml. Response examples containing literal
{{...}} are now served verbatim instead of being passed through
WireMock’s Handlebars transformer, which would fail to resolve them as
helpers and return 500.
1.12.8
(fix): Fix Layout/EmptyComment RuboCop offense emitted for types with no
description. The AST Comment node now skips writing when docs is
empty or whitespace-only, so undocumented model classes no longer
produce a bare # line above their class definition.
1.12.7
(fix): Fix Layout/EmptyComment RuboCop offense emitted for types with no
description. The AST Comment node now skips writing when docs is
empty or whitespace-only, so undocumented model classes no longer
produce a bare # line above their class definition.
1.12.6
(chore): Patch Ruby SDK generator container CVEs flagged in the AWS ECR / grype
scan. Remove the unused erb-4.0.3, net-imap-0.4.21, addressable-2.8.5,
rexml-3.2.5, and rexml-3.2.6 gem directories (in addition to the
gemspec stubs) and install patched addressable-2.8.10 + rexml-3.4.4,
so grype no longer reports the vulnerable versions vendored alongside
Ruby 3.3’s default gems and the rubocop dependency graph.
1.12.5
(chore): Bump ruby-v2 model container Ruby base image to ruby:3.3-alpine3.23 (matching
the ruby-v2 SDK container) and apply latest Alpine package security updates at
build time.
1.12.4
(chore): Remediate container vulnerabilities flagged by the May 2026 Grype scan of the
fernapi/fern-ruby-sdk image. Bumps the base image from ruby:3.3-alpine3.20
(EOL) to ruby:3.3-alpine3.23, picking up updated openssl, musl, busybox,
zlib, curl, git, c-ares, ada-libs, sqlite-libs, and a Ruby 3.3.11 with newer
default gems (resolv, zlib, rexml, uri). Also patches erb and net-imap
over the base image (with stale gemspec cleanup so SBOM scanners see the
fixed versions), upgrades npm’s bundled vulnerable packages (tar, minimatch,
ip-address, picomatch, brace-expansion, @isaacs/brace-expansion, diff), and
drops build-base from the runtime image (added as a virtual install-time
package and removed after gem install) so binutils CVEs no longer ship in
the final image. Reduces grype findings from 78 to 15 (all remaining are
upstream Alpine packages with no fix available yet).
1.12.3
(fix): Apply canonical “all user-specified examples, else first autogenerated” selection
in the Ruby v2 SDK snippet output path. Aligns the generator’s snippet.json /
README example selection with TS-v1 / Python-v1 behavior so dynamic-IR-driven
snippets are deterministic across runs.
1.12.2
(fix): Fix circular require in generated barrel file by excluding test/wire files from the main lib require list.
1.12.1
(fix): Fix duplicate root client generation that caused a lint error.
1.12.0
(feat): Generate CONTRIBUTING.md for Ruby SDKs.
1.11.1
(fix): Strip trailing whitespace from generated comment lines so spec-controlled docstrings
no longer trip Layout/TrailingWhitespace after the rubocop -A autocorrect pass
was removed in #15202. Caught on the Square nightly baseline benchmark.
1.11.0
(feat): Add retryStatusCodes configuration option ("legacy" | "recommended").
Legacy (default) preserves existing behavior (408, 429, 500, 502, 503, 504, 521, 522, 524).
Recommended retries only transient codes (408, 429, 502, 503, 504), excluding
500 Internal Server Error to avoid retrying non-idempotent failures.
1.10.0
(fix): Fix Ruby string interpolation injection vulnerability in TypeLiteral string emitter.
Untrusted API spec default values containing #{} are now properly escaped in generated
double-quoted Ruby strings.
(feat): Generate fully rubocop-compliant code at emitter level, eliminating all remaining
rubocop offenses in generated output so rubocop -A is no longer needed at
generation time. Covers Style/IfUnlessModifier (modifier-form detection added to
ruby.IfElse AST), Style/RedundantInterpolation (bare .to_s for single-interpolation
URL paths and header values), Lint/DuplicateHashKey (dedupe by key in TypeLiteral
hash emit and by name in dynamic-snippet keyword arguments), and
Layout/FirstHashElementIndentation / Layout/FirstArgumentIndentation (EnforcedStyle:
consistent + correct wire-test pagination continuation indent). Rubocop runs as a
CI regression gate (check-only, no -A).
1.9.0
(feat): Support x-fern-default as fallback value for parameters in generated Ruby SDKs.
When a header, query parameter, or path parameter has a clientDefault value in the IR,
the generated Ruby SDK makes that parameter optional with the default value automatically applied.
1.8.0
(feat): Use auth scheme placeholder values in README snippets when configured via
placeholder field on auth schemes.