Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions generators/python/sdk/versions.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# yaml-language-server: $schema=../../../fern-versions-yml.schema.json
# For unreleased changes, use unreleased.yml
- version: 4.34.0
changelogEntry:
- summary: Add support for disabling retries on endpoints
type: feat
createdAt: "2025-11-05"
irVersion: 61

- version: 4.33.0
changelogEntry:
- summary: Added Generation Metadata file to output
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -608,15 +608,35 @@ def write(writer: AST.NodeWriter) -> None:
)
)

# Get the request_options variable name from the last parameter if it exists
request_options_variable_name = EndpointFunctionGenerator.REQUEST_OPTIONS_VARIABLE
if named_parameters and len(named_parameters) > 0:
last_param = named_parameters[-1]
request_options_variable_name = last_param.name

if endpoint.retries is not None:
if isinstance(endpoint.retries, ir_types.RetriesDisabledSchema) and endpoint.retries.disabled:
overridden_request_options_var = "_request_options_with_retries_disabled"

def write_override_logic(writer: AST.NodeWriter) -> None:
writer.write(
f'{{**{request_options_variable_name}, "max_retries": 0}} if {request_options_variable_name} is not None else {{"max_retries": 0}}'
)

writer.write_node(
AST.VariableDeclaration(
name=overridden_request_options_var,
type_hint=AST.TypeHint.optional(
AST.TypeHint(self._context.core_utilities.get_reference_to_request_options())
),
initializer=AST.Expression(AST.CodeWriter(write_override_logic)),
)
)
request_options_variable_name = overridden_request_options_var

def get_httpx_request(
is_streaming: bool, response_code_writer: EndpointResponseCodeWriter
) -> AST.Expression:
# Get the request_options variable name from the last parameter if it exists
request_options_variable_name = EndpointFunctionGenerator.REQUEST_OPTIONS_VARIABLE
if named_parameters and len(named_parameters) > 0:
last_param = named_parameters[-1]
request_options_variable_name = last_param.name

return HttpX.make_request(
stream_response_type=(self._get_stream_func_return_type() if is_streaming else None),
is_async=is_async,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// service_retries
"/users"
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"id",
"name"
],
"additionalProperties": false,
"definitions": {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
{
"version": "1.0.0",
"types": {
"type_retries:User": {
"type": "object",
"declaration": {
"name": {
"originalName": "User",
"camelCase": {
"unsafeName": "user",
"safeName": "user"
},
"snakeCase": {
"unsafeName": "user",
"safeName": "user"
},
"screamingSnakeCase": {
"unsafeName": "USER",
"safeName": "USER"
},
"pascalCase": {
"unsafeName": "User",
"safeName": "User"
}
},
"fernFilepath": {
"allParts": [
{
"originalName": "retries",
"camelCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"snakeCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"screamingSnakeCase": {
"unsafeName": "RETRIES",
"safeName": "RETRIES"
},
"pascalCase": {
"unsafeName": "Retries",
"safeName": "Retries"
}
}
],
"packagePath": [],
"file": {
"originalName": "retries",
"camelCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"snakeCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"screamingSnakeCase": {
"unsafeName": "RETRIES",
"safeName": "RETRIES"
},
"pascalCase": {
"unsafeName": "Retries",
"safeName": "Retries"
}
}
}
},
"properties": [
{
"name": {
"name": {
"originalName": "id",
"camelCase": {
"unsafeName": "id",
"safeName": "id"
},
"snakeCase": {
"unsafeName": "id",
"safeName": "id"
},
"screamingSnakeCase": {
"unsafeName": "ID",
"safeName": "ID"
},
"pascalCase": {
"unsafeName": "ID",
"safeName": "ID"
}
},
"wireValue": "id"
},
"typeReference": {
"type": "primitive",
"value": "STRING"
},
"propertyAccess": null,
"variable": null
},
{
"name": {
"name": {
"originalName": "name",
"camelCase": {
"unsafeName": "name",
"safeName": "name"
},
"snakeCase": {
"unsafeName": "name",
"safeName": "name"
},
"screamingSnakeCase": {
"unsafeName": "NAME",
"safeName": "NAME"
},
"pascalCase": {
"unsafeName": "Name",
"safeName": "Name"
}
},
"wireValue": "name"
},
"typeReference": {
"type": "primitive",
"value": "STRING"
},
"propertyAccess": null,
"variable": null
}
],
"additionalProperties": false
}
},
"headers": [],
"endpoints": {
"endpoint_retries.getUsers": {
"auth": null,
"declaration": {
"name": {
"originalName": "getUsers",
"camelCase": {
"unsafeName": "getUsers",
"safeName": "getUsers"
},
"snakeCase": {
"unsafeName": "get_users",
"safeName": "get_users"
},
"screamingSnakeCase": {
"unsafeName": "GET_USERS",
"safeName": "GET_USERS"
},
"pascalCase": {
"unsafeName": "GetUsers",
"safeName": "GetUsers"
}
},
"fernFilepath": {
"allParts": [
{
"originalName": "retries",
"camelCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"snakeCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"screamingSnakeCase": {
"unsafeName": "RETRIES",
"safeName": "RETRIES"
},
"pascalCase": {
"unsafeName": "Retries",
"safeName": "Retries"
}
}
],
"packagePath": [],
"file": {
"originalName": "retries",
"camelCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"snakeCase": {
"unsafeName": "retries",
"safeName": "retries"
},
"screamingSnakeCase": {
"unsafeName": "RETRIES",
"safeName": "RETRIES"
},
"pascalCase": {
"unsafeName": "Retries",
"safeName": "Retries"
}
}
}
},
"location": {
"method": "GET",
"path": "/users"
},
"request": {
"type": "body",
"pathParameters": [],
"body": null
},
"response": {
"type": "json"
},
"examples": null
}
},
"pathParameters": [],
"environments": null,
"variables": null,
"generatorConfig": null
}
Loading
Loading