Skip to content

Commit 4d1fd16

Browse files
committed
fix(asyncapi): preserve default value when resolving schema $ref
1 parent fff5fdb commit 4d1fd16

File tree

6 files changed

+55
-0
lines changed

6 files changed

+55
-0
lines changed

chanx/asyncapi/type_defs.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,16 @@ def _resolve_model(self, model: BaseModel) -> BaseModel | Any:
386386
if ref_value is not None:
387387
resolved = self._lookup_reference(ref_value)
388388
if resolved is not None and resolved is not model:
389+
# If both are SchemaObjects and original has default, preserve it
390+
if isinstance(model, SchemaObject) and isinstance(
391+
resolved, SchemaObject
392+
):
393+
original_default = getattr(model, "default", None)
394+
if original_default is not None:
395+
# Create a copy with the default preserved
396+
resolved = resolved.model_copy(
397+
update={"default": original_default}
398+
)
389399
return resolved
390400

391401
# Recursively process all model fields (access via class, not instance)

sandbox_fastapi/apps/room_chat/messages.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@
22
Message types for the room chat consumer.
33
"""
44

5+
from enum import StrEnum
56
from typing import Literal
67

78
from chanx.messages.base import BaseMessage
89
from pydantic import BaseModel
910

1011

12+
class MessageStatus(StrEnum):
13+
PENDING = "PENDING"
14+
DELIVERED = "DELIVERED"
15+
FAILED = "FAILED"
16+
17+
1118
class RoomMessagePayload(BaseModel):
1219
message: str
1320
room_name: str | None = None
21+
status: MessageStatus = MessageStatus.PENDING
1422

1523

1624
class RoomChatMessage(BaseMessage):

sandbox_fastapi/tests/test_results/asyncapi_schema.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,15 @@
879879
"title": "MessagePayload",
880880
"type": "object"
881881
},
882+
"MessageStatus": {
883+
"enum": [
884+
"PENDING",
885+
"DELIVERED",
886+
"FAILED"
887+
],
888+
"title": "MessageStatus",
889+
"type": "string"
890+
},
882891
"NotificationBroadcastMessage": {
883892
"description": "Notification broadcast message.",
884893
"properties": {
@@ -1058,6 +1067,10 @@
10581067
],
10591068
"default": null,
10601069
"title": "Room Name"
1070+
},
1071+
"status": {
1072+
"$ref": "#/components/schemas/MessageStatus",
1073+
"default": "PENDING"
10611074
}
10621075
},
10631076
"required": [

sandbox_fastapi/tests/test_results/asyncapi_schema.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,13 @@ components:
538538
- message
539539
title: MessagePayload
540540
type: object
541+
MessageStatus:
542+
enum:
543+
- PENDING
544+
- DELIVERED
545+
- FAILED
546+
title: MessageStatus
547+
type: string
541548
NotificationBroadcastMessage:
542549
description: Notification broadcast message.
543550
properties:
@@ -669,6 +676,9 @@ components:
669676
- type: 'null'
670677
default: null
671678
title: Room Name
679+
status:
680+
$ref: '#/components/schemas/MessageStatus'
681+
default: PENDING
672682
required:
673683
- message
674684
title: RoomMessagePayload

tests/fixtures/client_generation/expected_output/room_chat/messages.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class RoomMessagePayload(BaseModel):
1010

1111
message: str
1212
room_name: str | None = None
13+
status: Literal["PENDING", "DELIVERED", "FAILED"] = "PENDING"
1314

1415

1516
class RoomChatMessage(BaseModel):

tests/fixtures/client_generation/schema.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,15 @@
879879
"title": "MessagePayload",
880880
"type": "object"
881881
},
882+
"MessageStatus": {
883+
"enum": [
884+
"PENDING",
885+
"DELIVERED",
886+
"FAILED"
887+
],
888+
"title": "MessageStatus",
889+
"type": "string"
890+
},
882891
"NotificationBroadcastMessage": {
883892
"description": "Notification broadcast message.",
884893
"properties": {
@@ -1058,6 +1067,10 @@
10581067
],
10591068
"default": null,
10601069
"title": "Room Name"
1070+
},
1071+
"status": {
1072+
"$ref": "#/components/schemas/MessageStatus",
1073+
"default": "PENDING"
10611074
}
10621075
},
10631076
"required": [

0 commit comments

Comments
 (0)