diff --git a/src/glean/api_client/models/answerlikes.py b/src/glean/api_client/models/answerlikes.py index cd1539f0..2c3388e2 100644 --- a/src/glean/api_client/models/answerlikes.py +++ b/src/glean/api_client/models/answerlikes.py @@ -3,15 +3,15 @@ from __future__ import annotations from glean.api_client.types import BaseModel import pydantic -from typing import List, TYPE_CHECKING -from typing_extensions import Annotated, TypedDict +from typing import List, Optional, TYPE_CHECKING +from typing_extensions import Annotated, NotRequired, TypedDict if TYPE_CHECKING: from .answerlike import AnswerLike, AnswerLikeTypedDict class AnswerLikesTypedDict(TypedDict): - liked_by: List["AnswerLikeTypedDict"] + liked_by: NotRequired[Optional[List["AnswerLikeTypedDict"]]] liked_by_user: bool r"""Whether the user in context liked the answer.""" num_likes: int @@ -19,7 +19,9 @@ class AnswerLikesTypedDict(TypedDict): class AnswerLikes(BaseModel): - liked_by: Annotated[List["AnswerLike"], pydantic.Field(alias="likedBy")] + liked_by: Annotated[ + Optional[List["AnswerLike"]], pydantic.Field(alias="likedBy") + ] = None liked_by_user: Annotated[bool, pydantic.Field(alias="likedByUser")] r"""Whether the user in context liked the answer.""" diff --git a/src/glean/api_client/models/documentcontent.py b/src/glean/api_client/models/documentcontent.py index 1de9c4df..ce4e92ff 100644 --- a/src/glean/api_client/models/documentcontent.py +++ b/src/glean/api_client/models/documentcontent.py @@ -27,7 +27,7 @@ def serialize_model(self, handler): for n, f in type(self).model_fields.items(): k = f.alias or n - val = serialized.get(k) + val = serialized.get(k, serialized.get(n, UNSET_SENTINEL)) if val != UNSET_SENTINEL: if val is not None or k not in optional_fields: diff --git a/tests/test_model_regressions.py b/tests/test_model_regressions.py new file mode 100644 index 00000000..7550ac6b --- /dev/null +++ b/tests/test_model_regressions.py @@ -0,0 +1,23 @@ +from glean.api_client import models + + +def test_answer_likes_accepts_null_liked_by(): + payload = { + "likedBy": None, + "likedByUser": False, + "numLikes": 0, + } + + likes = models.AnswerLikes.model_validate(payload) + + assert likes.liked_by is None + assert likes.liked_by_user is False + assert likes.num_likes == 0 + + +def test_document_content_model_dump_keeps_alias_field_value(): + content = models.DocumentContent(fullTextList=["This is a test document."]) + + dumped = content.model_dump() + + assert dumped["fullTextList"] == ["This is a test document."]