Skip to content

[pull] main from fern-api:main#690

Merged
pull[bot] merged 43 commits into
code:mainfrom
fern-api:main
Apr 29, 2026
Merged

[pull] main from fern-api:main#690
pull[bot] merged 43 commits into
code:mainfrom
fern-api:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 29, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

iamnamananand996 and others added 30 commits April 29, 2026 20:04
…d modes (#15421)

* fix(rust): only retry on 408, 429, and 5xx except 500

Added HTTP status code-based retry logic to execute_with_retries.
Previously only network errors were retried. Now also retries on
408, 429, and 501-599 status codes with exponential backoff.

* fix: update Rust test snapshot for retry status codes

* fix: add 5XX hyperlink to features.yml to match TS PR pattern

* fix(rust): update changelog wording to match PR pattern

* fix(rust): drop retryable response explicitly and add is_retryable_status tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rust): remove unnecessary drop(response) — variable already used in guard

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(rust): add config-driven retryStatusCodes with legacy/recommended modes

- Add retryStatusCodes field to BaseRustConfigSchema (legacy | recommended)
- Legacy (default): 408, 429, >= 500
- Recommended: 408, 429, 502, 503, 504 (excludes 500 Internal Server Error)
- Apply string replacement in RustProject.ts when config is recommended
- Create 1.0.0 migration to auto-pin legacy for existing users
- Register Rust SDK migrations in main index
- Update features.yml documenting both modes
- Revert seed http_client.rs files to legacy behavior

* ci: retry after Docker cleanup failures

* fix: mark @boundaryml/baml as external in rust-sdk build to fix esbuild native module errors

* refactor: use template variable for retryStatusCodes instead of find/replace

* fix: update snapshot to match template variable

* fix: drop @boundaryml/baml external from build.mjs (now in shared build-utils)

* refactor(rust): use array .contains() for retry status check to match TS .includes() pattern

Replace chained equality checks with array-style contains:
- Legacy: [408, 429].contains(&status_code) || status_code >= 500
- Recommended: [408, 429, 502, 503, 504].contains(&status_code)

This makes the generator code structurally identical to the TS generator,
which uses [408, 429, 502, 503, 504].includes(statusCode).

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: iamnamananand996 <31537362+iamnamananand996@users.noreply.github.com>
…d modes (#15418)

* fix(ruby): only retry on 408, 429, and 5xx except 500

Replaced fixed RETRYABLE_STATUSES list [408, 429, 500, 502, 503, 504,
521, 522, 524] with [408, 429] plus range check (>= 501 && < 600).
500 Internal Server Error is no longer retried.

* fix: add 5XX hyperlink to features.yml to match TS PR pattern

* fix(ruby): update changelog wording to match PR pattern

* fix(ruby): rename RETRYABLE_STATUSES to RETRYABLE_4XX_STATUSES and add should_retry? tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(ruby): add config-driven retryStatusCodes with legacy/recommended modes

- Add retryStatusCodes field to BaseRubyCustomConfigSchema (legacy | recommended)
- Legacy (default): [408, 429, 500, 502, 503, 504, 521, 522, 524]
- Recommended: [408, 429, 502, 503, 504] (excludes 500 Internal Server Error)
- Apply string replacement in RubyProject.ts when config is recommended
- Add TestHttpRawClient as-is file with should_retry? tests
- Create 2.0.0 migration to auto-pin legacy for existing users
- Register Ruby SDK migrations in main index
- Update features.yml documenting both modes
- Revert 125 seed raw_client.rb files to legacy behavior
- Update 125 seed test_raw_client.rb files to test legacy behavior

* fix: biome formatting for RubyProject.ts return statement

* fix: mark @boundaryml/baml as external in ruby-sdk build to fix esbuild native module errors

* refactor: use template variable for retryStatusCodes instead of find/replace

* fix: drop @boundaryml/baml external from build.mjs (now in shared build-utils)

* refactor(ruby): use {{RETRY_STATUS_CODES_ARRAY}} placeholder pattern like TS/Rust

Replace EJS retryStatusCodes ternary with {{RETRY_STATUS_CODES_ARRAY}}
placeholder resolved by RubyProject.ts after EJS rendering,
matching the identical pattern used in TS and Rust generators.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: dsinghvi <10870189+dsinghvi@users.noreply.github.com>
…modes (#15417)

* fix(go): only retry on 408, 429, and 5xx except 500

Updated shouldRetry to check > StatusInternalServerError instead of
>= StatusInternalServerError, so that 500 is no longer retried.
Added test case verifying 500 is not retried.

* fix: add 5XX hyperlink to features.yml to match TS PR pattern

* fix(go): update changelog wording and add 501/599 boundary tests

* feat(go): add retryStatusCodes config with legacy and recommended modes

Add config-driven retry behavior with 'retryStatusCodes' field:
- 'legacy' (default): retries on 408, 429, and all >= 500
- 'recommended': retries only on transient codes 408, 429, 502, 503, 504

Includes:
- BaseGoCustomConfigSchema field
- String replacement in GoProject.ts for retrier.go_
- 1.0.0 migration (first Go migration) to pin legacy for upgrading users
- Updated features.yml, changelog, tests, and seed fixtures

* fix: update migration index test - Go SDK now has migrations

* fix: mark @boundaryml/baml as external in go-v2 build to prevent esbuild native module errors

* ci: re-trigger quality checks

* refactor: use template variable for retryStatusCodes instead of find/replace

* fix: drop @boundaryml/baml external from build.mjs (now in shared build-utils)

* fix: remove unused AsIsFiles import (biome)

* refactor(go): use {{RETRY_STATUS_CHECK}} placeholder pattern like TS/Rust

Replace {{ .RetryStatusCheck }} Handlebars-style template variable with
{{RETRY_STATUS_CHECK}} placeholder resolved by GoProject.ts,
matching the identical pattern used in TS and Rust generators.
…ed modes (#15419)

* fix(swift): only retry on 408, 429, and 5xx except 500

Updated shouldRetry to use (>= 501 && < 600) instead of >= 500.
Updated retry tests: renamed testRetryOn500 to testRetryOn502BadGateway,
added testNoRetryOn500InternalServerError, and changed
testEndpointLevelMaxRetriesOverride to use 502.

* fix: add 5XX hyperlink to features.yml to match TS PR pattern

* fix(swift): update changelog wording and add 501/599 boundary tests

* feat(swift): add config-driven retryStatusCodes with legacy/recommended modes

- Add retryStatusCodes field to BaseSwiftCustomConfigSchema (legacy | recommended)
- Legacy (default): 408, 429, >= 500
- Recommended: 408, 429, 502, 503, 504 (excludes 500 Internal Server Error)
- Apply string replacement in SdkGeneratorCli.ts when config is recommended
- Create 1.0.0 migration to auto-pin legacy for existing users
- Register Swift SDK migrations in main index
- Update features.yml documenting both modes
- Revert seed HTTPClient.swift and ClientRetryTests.swift to legacy behavior

* fix: mark @boundaryml/baml as external in swift build to prevent esbuild native module errors

* refactor: use template variable for retryStatusCodes instead of find/replace

* fix: drop @boundaryml/baml external from build.mjs (now in shared build-utils)

* refactor(swift): use {{RETRY_STATUS_CHECK}} placeholder pattern like TS/Rust

Replace EJS retryStatusCheck variable with {{RETRY_STATUS_CHECK}}
placeholder resolved by SdkGeneratorCli.ts after EJS rendering,
matching the identical pattern used in TS and Rust generators.

* fix: update migration test - Swift SDK now has migrations

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: dsinghvi <10870189+dsinghvi@users.noreply.github.com>
Co-authored-by: dsinghvi <10870189+dsinghvi@users.noreply.github.com>
…wire tests (#15563)

* fix(typescript): dedupe discriminant in generated SSE protocol-union wire tests

* chore(typescript): update IR-to-JSONSchema snapshots for new SSE seed types
… modes (#15420)

* fix(php): only retry on 408, 429, and 5xx except 500

Updated shouldRetry to use (>= 501 && < 600) instead of >= 500,
so that 500 Internal Server Error is no longer retried.

* fix: add 5XX hyperlink to features.yml to match TS PR pattern

* fix(php): update changelog wording to match PR pattern

* fix(php): fix broken retry tests and add 500/600 boundary tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(php): remove invalid status 600 retry test (PSR-7 rejects status outside 1xx-5xx)

* feat(php): add config-driven retryStatusCodes with legacy/recommended modes

- Add retryStatusCodes field to BasePhpCustomConfigSchema (legacy | recommended)
- Legacy (default): 408, 429, >= 500
- Recommended: 408, 429, 502, 503, 504 (excludes 500 Internal Server Error)
- Apply string replacement in PhpProject.ts when config is recommended
- Create 3.0.0 migration to auto-pin legacy for existing users
- Register PHP SDK migrations in main index
- Update features.yml documenting both modes
- Revert seed RetryDecoratingClient.php and RawClientTest.php to legacy behavior

* fix: biome formatting in PhpProject.ts

* ci: retry after Docker cleanup failures

* fix: sort imports alphabetically for biome

* fix: mark @boundaryml/baml as external in php-sdk build to fix esbuild native module errors

* refactor: use template variable for retryStatusCodes instead of find/replace

* fix: drop @boundaryml/baml external from build.mjs (now in shared build-utils)

* refactor(php): use {{RETRY_STATUS_CHECK}} placeholder pattern like TS/Rust

Replace EJS conditionals with {{RETRY_STATUS_CHECK}} and
{{RETRY_STATUS_CODES_ARRAY}} placeholders resolved by PhpProject.ts,
matching the identical pattern used in TS and Rust generators.

* fix(php): biome format fix

* fix: update migration test - use fern-openapi as undefined generator

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…15564)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: kenny <kenny@buildwithfern.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: patrickthornton <70873350+patrickthornton@users.noreply.github.com>
Co-authored-by: dsinghvi <10870189+dsinghvi@users.noreply.github.com>
fern-support and others added 13 commits April 29, 2026 17:16
Co-authored-by: dsinghvi <10870189+dsinghvi@users.noreply.github.com>
Co-authored-by: dsinghvi <10870189+dsinghvi@users.noreply.github.com>
* fix(ruby-v2): strip trailing whitespace from comment lines

Layout/TrailingWhitespace was previously autocorrected by 'rubocop -A' at
generation time. Now that the autocorrect pass is removed, spec-controlled
docstrings with trailing whitespace surface as offenses (caught on the Square
nightly baseline benchmark).

Co-Authored-By: barry.zou <barry.zou@buildwithfern.com>

* chore(ruby-v2): add changelog for trailing-whitespace fix

Co-Authored-By: barry.zou <barry.zou@buildwithfern.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: barry.zou <barry.zou@buildwithfern.com>
…ion (#15493)

* fix(csharp-sdk): add brackets to safe query key characters

Add `[` and `]` to SafeQueryKeyChars so array-style query parameter names
like `page[size]` are sent unencoded. Previously these were percent-encoded
as `page%5Bsize%5D`, causing WireMock.Net mock server test failures when
the test setup used decoded names in WithParam().

Update all seed test outputs and add a unit test for bracket preservation.

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): add brackets to IsSafeQueryKeyChar fallback for non-NET8 targets

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): update test assertions to expect unencoded brackets in query keys

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): split comma-delimited query param values for WireMock.Net matching

WireMock.Net splits comma-separated query parameter values into arrays.
When a query param example contains commas (e.g. 'merchant,offer'), generate
separate .WithParam() calls for each value so they match correctly.

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): use single WithParam call with multiple values for comma-delimited params

WireMock.Net requires all values for the same param name in a single
WithParam() call. Multiple separate calls for the same key cause
matcher failures.

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* chore(csharp): add changelog entry for comma-delimited query param fix

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): escape quotes and backslashes in comma-split query param values

Properly escape special characters before wrapping values in C# string
literals to prevent syntax errors in generated WithParam() calls.

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): remove trim() to preserve whitespace in comma-split query values

WireMock.Net preserves whitespace when splitting comma-delimited values,
so trimming in the generator would cause a mismatch for values like
'foo, bar' where the space after the comma is significant.

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): percent-encode query param keys in WireMock test generation

Revert the SafeQueryKeyChars change that added [ and ] to safe characters.
Per RFC 3986, brackets are reserved gen-delims and must be percent-encoded.

Instead, fix the test generator (MockEndpointGenerator.ts) to percent-encode
query parameter key names using the same safe character set as the C# SDK's
QueryStringBuilder. This ensures the WireMock matcher expects the encoded key
that the spec-compliant HTTP client actually sends on the wire.

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

* fix(csharp): fix biome formatting for SAFE_QUERY_KEY_CHARS

Co-Authored-By: will.kendall@buildwithfern.com <wpk235@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: will.kendall@buildwithfern.com <wpk235@gmail.com>
@pull pull Bot locked and limited conversation to collaborators Apr 29, 2026
@pull pull Bot added the ⤵️ pull label Apr 29, 2026
@pull pull Bot merged commit 41251fe into code:main Apr 29, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants