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
1 change: 1 addition & 0 deletions .changeset/.last_bumped_modules
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sdk-types
4 changes: 0 additions & 4 deletions .changeset/change-20260126-10:38:46.yml

This file was deleted.

6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: generate generate-types generate-http test format format-check typecheck install clean help changeset changeset-status changeset-version changeset-changelog build
.PHONY: generate generate-types generate-http test format format-check typecheck install clean help changeset changeset-status changeset-version changeset-changelog build prepare-release

help:
@echo "Available commands:"
Expand All @@ -17,6 +17,7 @@ help:
@echo " make changeset-status - Show pending changesets"
@echo " make changeset-version - Apply version bumps from changesets"
@echo " make changeset-changelog - Generate changelogs from applied changesets"
@echo " make prepare-release - Run version bump, changelog generation, and build for release preparation"

generate: generate-types generate-http

Expand Down Expand Up @@ -86,3 +87,6 @@ changeset-version:
changeset-changelog:
@python changesets/manage.py changelog

prepare-release: changeset-version changeset-changelog build
@echo "✅ Release preparation complete"

16 changes: 13 additions & 3 deletions codegen/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,19 @@
"v1InitUserEmailRecoveryResult",
),
"ACTIVITY_TYPE_INIT_OTP": (
"ACTIVITY_TYPE_INIT_OTP_V2",
"v1InitOtpIntentV2",
"v1InitOtpResult",
"ACTIVITY_TYPE_INIT_OTP_V3",
"v1InitOtpIntentV3",
"v1InitOtpResultV2",
),
"ACTIVITY_TYPE_VERIFY_OTP": (
"ACTIVITY_TYPE_VERIFY_OTP_V2",
"v1VerifyOtpIntentV2",
"v1VerifyOtpResult",
),
"ACTIVITY_TYPE_OTP_LOGIN": (
"ACTIVITY_TYPE_OTP_LOGIN_V2",
"v1OtpLoginIntentV2",
"v1OtpLoginResult",
),
}

Expand Down
21 changes: 15 additions & 6 deletions codegen/types/generate_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ def strip_version_suffix(activity_type: str) -> str:
return re.sub(r"(_V\d+)$", "", activity_type)


def escape_description(desc: str) -> str:
"""Escape a description string for safe inclusion in generated code."""
return desc.replace("\\", "\\\\").replace('"', '\\"')


def is_valid_identifier(name: str) -> bool:
"""Check if a string is a valid Python identifier."""
return name.isidentifier()
Expand Down Expand Up @@ -100,15 +105,15 @@ def generate_python_type(name: str, definition: Dict[str, Any]) -> str:
field_params.append("default=None")
field_params.append(f'alias="{original_prop}"')
if desc:
field_params.append(f'description="{desc}"')
field_params.append(f'description="{escape_description(desc)}"')
field_def = f"Field({', '.join(field_params)})"
output += f" {safe_prop}: {prop_type} = {field_def}\n"
elif desc or not is_required:
field_params = []
if not is_required:
field_params.append("default=None")
if desc:
field_params.append(f'description="{desc}"')
field_params.append(f'description="{escape_description(desc)}"')
field_def = f"Field({', '.join(field_params)})"
output += f" {safe_prop}: {prop_type} = {field_def}\n"
else:
Expand Down Expand Up @@ -163,15 +168,15 @@ def generate_inline_properties(
field_params.append("default=None")
field_params.append(f'alias="{original_prop}"')
if desc:
field_params.append(f'description="{desc}"')
field_params.append(f'description="{escape_description(desc)}"')
field_def = f"Field({', '.join(field_params)})"
output += f" {safe_prop}: {prop_type} = {field_def}\n"
elif desc or not is_required:
field_params = []
if not is_required:
field_params.append("default=None")
if desc:
field_params.append(f'description="{desc}"')
field_params.append(f'description="{escape_description(desc)}"')
field_def = f"Field({', '.join(field_params)})"
output += f" {safe_prop}: {prop_type} = {field_def}\n"
else:
Expand Down Expand Up @@ -382,15 +387,19 @@ def generate_api_types(swagger: Dict[str, Any], prefix: str = "") -> str:
field_params.append("default=None")
field_params.append(f'alias="{original_prop}"')
if desc:
field_params.append(f'description="{desc}"')
field_params.append(
f'description="{escape_description(desc)}"'
)
field_def = f"Field({', '.join(field_params)})"
output += f" {safe_prop}: {prop_type} = {field_def}\n"
elif desc or not is_required:
field_params = []
if not is_required:
field_params.append("default=None")
if desc:
field_params.append(f'description="{desc}"')
field_params.append(
f'description="{escape_description(desc)}"'
)
field_def = f"Field({', '.join(field_params)})"
output += f" {safe_prop}: {prop_type} = {field_def}\n"
else:
Expand Down
Loading
Loading