Description
Use case
Pydantic supports parsing unions of BaseModel types. This can be pretty handy when a lambda might accept a few different event types.
Example: a callback handler lambda might process an error response or a success response type. These might have different fields.
The current implementation of BaseEnvelope will error if you pass a Union or Annotated Union to the model field. This is because neither of those types have a parse_raw
or parse_obj
method which BaseModel expects.
Solution/User Experience
I believe this can mostly be taken care of by switching from using model.parse_raw
and model.parse_obj
here in BaseEnvelope to use pydantic.parse_obj_as
and pydantic.parse_raw_as
(available from pydantic 1.7 onwards so should match this projects dependencies). Docs here.
Happy to work on a PR, just wanted to check in here before I did too much work.
Alternative solutions
1. I've gotten around this in the past by just parsing the parent type in `event_parser`. For example, parsing `EventBridgeModel`, then parsing the `detail` myself using `parse_obj_as`.
2. This can also be solved on a case-by-case basis by rearchitecting the event structure so that the Union takes place within the model being parsed, but changing the event fields isn't always an option in existing codebases.
Acknowledgment
- This feature request meetsShould this be considered in other Powertools for AWS Lambda languages? i.e. , , and
Metadata
Metadata
Assignees
Type
Projects
Status
Activity
boring-cyborg commentedon Jul 10, 2023
Thanks for opening your first issue here! We'll come back to you as soon as we can.
In the meantime, check out the #python channel on our Powertools for AWS Lambda Discord: Invite link
leandrodamascena commentedon Jul 12, 2023
Looking at this now.
leandrodamascena commentedon Jul 13, 2023
Hi @dcheno! Do you have a snippet of the code you are using to reproduce this feature request? I understand your point about our current codebase, but I'm trying to think of situations where this might happen.
Thank you
dcheno commentedon Jul 13, 2023
hey @leandrodamascena , thanks for taking a look.
Sure, here's the kind of thing I run into occassionaly:
Which returns error:
There are definitely ways around this, but I've had lambdas like this a few times so thought it would be worth checking in.
leandrodamascena commentedon Aug 17, 2023
Hello @dcheno! I'm back to this issue and sorry for a long time without an update.
I was looking at our base code and trying to come up with some scenarios to see how we can update it but I think, we can't do that right now. Powertools now supports Pydantic v1 and v2 and keep Pydantic functions that work in both versions without code change. I see the
parse_raw_as
function has been removed in Pydantic v2.We already have a Roadmap to drop Pydanticv1 in Powertools v3 and in this new version, we will refactor the parser utility with Pydanticv2 and can add it. We are estimating (tentative) Powertools v3 for later this year/early next year.
I'll update our roadmap to add this feature to support unions of BaseModels in an Annotated type.
Thanks.
19 remaining items