fix(event_handler): match generic alias response models in OpenAPI schema - #8453
Conversation
…hema Custom responses are deep-copied before resolving their model, and deepcopy returns a new object for generic aliases such as list[Model]. The identity check against response_extra_models never matched, so schema generation raised StopIteration. Compare by equality instead. Fixes aws-powertools#8450
|
Thanks a lot for your first contribution! Please check out our contributing guidelines and don't hesitate to ask whatever you need. |
|
leandrodamascena
left a comment
There was a problem hiding this comment.
Thanks Tanbir, this is a very good fix. I reproduced the StopIteration on develop and confirmed that both list[Model] and dict[str, Model] generate the expected schemas with this change.
Using equality here makes sense because deepcopy creates a new generic alias, while regular model classes keep the same behavior. I’ll approve and merge this.
|
Tick the box to add this pull request to the merge queue (same as
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #8453 +/- ##
========================================
Coverage 96.65% 96.65%
========================================
Files 296 296
Lines 14905 14905
Branches 1266 1266
========================================
Hits 14407 14407
Misses 363 363
Partials 135 135 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Awesome work, congrats on your first merged pull request and thank you for helping improve everyone's experience! |
|
Awesome work, congrats on your first merged pull request and thank you for helping improve everyone's experience! |



Issue number: closes #8450
Summary
Changes
Since custom responses started being deep-copied before their
modelis resolved, a generic alias such aslist[Model]comes back as a newGenericAliasobject, so the identity check in_resolve_response_payloadnever found the matching field andget_openapi_schema()raisedStopIteration. This compares the model with==instead ofis; plain classes still compare by identity, and generic aliases compare structurally. I added a regression test intest_openapi_responses.pycoveringlist[Model]anddict[str, Model], which fails withStopIterationbefore the change and passes after; the event_handler functional tests, ruff and mypy all pass locally.User experience
Before, any route with a generic alias as a custom response model broke OpenAPI schema generation, Swagger and validation setup with
StopIteration. After, those routes produce the expected array or object schema again, as they did up to 3.24.0.By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
Disclaimer: We value your time and bandwidth. As such, any pull requests created on non-triaged issues might not be successful.