Skip to content

Commit 47b73fd

Browse files
committed
refactor: remove side effects
1 parent 03d43c9 commit 47b73fd

File tree

4 files changed

+41
-21
lines changed

4 files changed

+41
-21
lines changed

faststream/asyncapi/generate.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ def _resolve_msg_payloads(
145145
payloads: Dict[str, Any],
146146
messages: Dict[str, Any],
147147
) -> Reference:
148+
"""Replace message payload by reference and normalize payloads.
149+
150+
Payloads and messages are editable dicts to store schemas for reference in AsyncAPI.
151+
"""
148152
one_of_list: List[Reference] = []
149153
m.payload = _move_pydantic_refs(m.payload, DEF_KEY)
150154

@@ -156,30 +160,21 @@ def _resolve_msg_payloads(
156160
for p_title, p in one_of.items():
157161
payloads.update(p.pop(DEF_KEY, {}))
158162
if p_title not in payloads:
159-
if p.pop("empty", False):
160-
payloads[p_title] = {}
161-
else:
162-
payloads[p_title] = p
163+
payloads[p_title] = p
163164
one_of_list.append(Reference(**{"$ref": f"#/components/schemas/{p_title}"}))
164165

165166
elif one_of is not None:
166167
for p in one_of:
167168
p_title = next(iter(p.values())).split("/")[-1]
168169
if p_title not in payloads:
169-
if p.pop("empty", False):
170-
payloads[p_title] = {}
171-
else:
172-
payloads[p_title] = p
170+
payloads[p_title] = p
173171
one_of_list.append(Reference(**{"$ref": f"#/components/schemas/{p_title}"}))
174172

175173
if not one_of_list:
176174
payloads.update(m.payload.pop(DEF_KEY, {}))
177175
p_title = m.payload.get("title", f"{channel_name}Payload")
178176
if p_title not in payloads:
179-
if m.payload.pop("empty", False):
180-
payloads[p_title] = {}
181-
else:
182-
payloads[p_title] = m.payload
177+
payloads[p_title] = m.payload
183178
m.payload = {"$ref": f"#/components/schemas/{p_title}"}
184179

185180
else:
@@ -194,6 +189,7 @@ def _move_pydantic_refs(
194189
original: Any,
195190
key: str,
196191
) -> Any:
192+
"""Remove pydantic references and replacem them by real schemas."""
197193
if not isinstance(original, Dict):
198194
return original
199195

faststream/asyncapi/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def resolve_payloads(
2222
title = body["title"]
2323
words = title.split(":")
2424

25-
if len(words) > 1 and not body.get("empty", False): # not pydantic model case
25+
if len(words) > 1: # not pydantic model case
2626
body["title"] = title = ":".join(
2727
filter(
2828
lambda x: bool(x),

faststream/broker/subscriber/usecase.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -436,12 +436,13 @@ def get_payloads(self) -> List[Tuple["AnyDict", str]]:
436436
payloads.append((body, to_camelcase(h.call_name)))
437437

438438
if not self.calls:
439-
payloads.append(( # TODO: fix
440-
{
441-
"title": to_camelcase("Subscriber:Message:Payload"),
442-
"empty": True,
443-
},
444-
"",
445-
))
439+
payloads.append(
440+
(
441+
{
442+
"title": f"{self.title_ or self.call_name}:Message:Payload",
443+
},
444+
to_camelcase(self.call_name),
445+
)
446+
)
446447

447448
return payloads

tests/asyncapi/base/naming.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,29 @@ def test_subscriber_naming_default(self):
105105
IsStr(regex=r"test[\w:]*:Subscriber:Message")
106106
]
107107

108+
for key, v in schema["components"]["schemas"].items():
109+
assert key == "Subscriber:Message:Payload"
110+
assert v == {"title": key}
111+
112+
def test_subscriber_naming_default_with_title(self):
113+
broker = self.broker_class()
114+
115+
broker.subscriber("test", title="custom")
116+
117+
schema = get_app_schema(FastStream(broker)).to_jsonable()
118+
119+
assert list(schema["channels"].keys()) == ["custom"]
120+
121+
assert list(schema["components"]["messages"].keys()) == ["custom:Message"]
122+
108123
assert list(schema["components"]["schemas"].keys()) == [
109-
"Subscriber:Message:Payload"
124+
"custom:Message:Payload"
110125
]
111126

127+
assert schema["components"]["schemas"]["custom:Message:Payload"] == {
128+
"title": "custom:Message:Payload"
129+
}
130+
112131
def test_multi_subscribers_naming_default(self):
113132
broker = self.broker_class()
114133

@@ -137,6 +156,10 @@ async def handle_user_created(msg: str): ...
137156
"Subscriber:Message:Payload",
138157
]
139158

159+
assert schema["components"]["schemas"]["Subscriber:Message:Payload"] == {
160+
"title": "Subscriber:Message:Payload"
161+
}
162+
140163

141164
class FilterNaming(BaseNaming):
142165
def test_subscriber_filter_base(self):

0 commit comments

Comments
 (0)