Skip to content

Commit 2c1272c

Browse files
committed
Cleanup of deserializing media and handling of the media object(s)
1 parent 04f5fa1 commit 2c1272c

File tree

4 files changed

+75
-23
lines changed

4 files changed

+75
-23
lines changed

hikari/api/special_endpoints.py

+17-14
Original file line numberDiff line numberDiff line change
@@ -2258,10 +2258,6 @@ def add_text_menu(
22582258
"""
22592259

22602260

2261-
MessageActionRowBuilderComponentsT = typing.Union[ButtonBuilder, SelectMenuBuilder]
2262-
"""FIXME: Document me."""
2263-
2264-
22652261
class MessageMediaResourceBuilder(abc.ABC):
22662262
"""Builder class for media items."""
22672263

@@ -2699,16 +2695,6 @@ def add_file(
26992695
"""
27002696

27012697

2702-
MessageContainerBuilderComponentsT = typing.Union[ # FIXME: I got no idea where this should be put.
2703-
MessageActionRowBuilder,
2704-
MessageTextDisplayBuilder,
2705-
MessageSectionBuilder,
2706-
MessageMediaGalleryBuilder,
2707-
MessageSeparatorBuilder,
2708-
MessageFileBuilder,
2709-
]
2710-
2711-
27122698
class ModalActionRowBuilder(ComponentBuilder, abc.ABC):
27132699
"""Builder class for modal action row components."""
27142700

@@ -2789,3 +2775,20 @@ def add_text_input(
27892775
ModalActionRowBuilder
27902776
The modal action row builder to enable call chaining.
27912777
"""
2778+
2779+
2780+
MessageContainerBuilderComponentsT = typing.Union[ # FIXME: I got no idea where this should be put.
2781+
MessageActionRowBuilder,
2782+
MessageTextDisplayBuilder,
2783+
MessageSectionBuilder,
2784+
MessageMediaGalleryBuilder,
2785+
MessageSeparatorBuilder,
2786+
MessageFileBuilder,
2787+
]
2788+
"""FIXME: Document me."""
2789+
2790+
2791+
MessageActionRowBuilderComponentsT = typing.Union[ # FIXME: I got no idea where this should be put.
2792+
ButtonBuilder, SelectMenuBuilder
2793+
]
2794+
"""FIXME: Document me."""

hikari/components.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -413,16 +413,16 @@ class MediaResource(files.Resource[files.AsyncReader]):
413413
populated on any received embed attached to a message event.
414414
"""
415415

416-
width: int = attrs.field(repr=True)
416+
width: undefined.UndefinedNoneOr[int] = attrs.field(repr=True)
417417
"""The width of media item."""
418418

419-
height: int = attrs.field(repr=True)
419+
height: undefined.UndefinedNoneOr[int] = attrs.field(repr=True)
420420
"""The height of the media item."""
421421

422-
content_type: str = attrs.field(repr=True)
422+
content_type: undefined.UndefinedNoneOr[str] = attrs.field(repr=True)
423423
"""The content type of the media item."""
424424

425-
loading_state: MediaLoadingType = attrs.field(repr=True)
425+
loading_state: undefined.UndefinedNoneOr[MediaLoadingType] = attrs.field(repr=True)
426426
"""The loading state of the media item."""
427427

428428
@property

hikari/impl/entity_factory.py

+26-5
Original file line numberDiff line numberDiff line change
@@ -3083,13 +3083,32 @@ def _deserialize_text_input(self, payload: data_binding.JSONObject) -> component
30833083
)
30843084

30853085
def _deserialize_media(self, payload: data_binding.JSONObject) -> component_models.MediaResource:
3086+
height: undefined.UndefinedNoneOr[int] = undefined.UNDEFINED
3087+
if "height" in payload:
3088+
height = payload.get("height")
3089+
3090+
width: undefined.UndefinedNoneOr[int] = undefined.UNDEFINED
3091+
if "width" in payload:
3092+
width = payload.get("width")
3093+
3094+
content_type: undefined.UndefinedNoneOr[str] = undefined.UNDEFINED
3095+
if "content_type" in payload:
3096+
content_type = payload.get("content_type")
3097+
3098+
loading_state: undefined.UndefinedNoneOr[component_models.MediaLoadingType] = undefined.UNDEFINED
3099+
if "loading_state" in payload:
3100+
if state := payload.get("loading_state"):
3101+
loading_state = component_models.MediaLoadingType(state)
3102+
else:
3103+
loading_state = None
3104+
30863105
return component_models.MediaResource(
30873106
resource=files.ensure_resource(payload["url"]), # FIXME: Idk if this is how its supposed to work.
3088-
proxy_resource=files.ensure_resource(payload["proxy_url"]),
3089-
height=payload["height"],
3090-
width=payload["width"],
3091-
content_type=payload["content_type"],
3092-
loading_state=component_models.MediaLoadingType(payload["loading_state"]),
3107+
proxy_resource=files.ensure_resource(payload["proxy_url"]) if "proxy_url" in payload else None,
3108+
height=height,
3109+
width=width,
3110+
content_type=content_type,
3111+
loading_state=loading_state,
30933112
)
30943113

30953114
def _deserialize_action_row_component(
@@ -3113,6 +3132,8 @@ def _deserialize_action_row_component(
31133132
type=component_models.ComponentType.ACTION_ROW, id=payload.get("id"), components=components
31143133
)
31153134

3135+
return None
3136+
31163137
def _deserialize_section_component(self, payload: data_binding.JSONObject) -> component_models.SectionComponent:
31173138
accessory_payload = payload["accessory"]
31183139

tests/hikari/impl/test_entity_factory.py

+28
Original file line numberDiff line numberDiff line change
@@ -5719,6 +5719,34 @@ def test__deserialize_media(self, entity_factory_impl, media_payload):
57195719

57205720
assert isinstance(media, component_models.MediaResource)
57215721

5722+
def test__deserialize_media_with_unset_fields(self, entity_factory_impl, media_payload):
5723+
del media_payload["proxy_url"]
5724+
del media_payload["width"]
5725+
del media_payload["height"]
5726+
del media_payload["content_type"]
5727+
5728+
media = entity_factory_impl._deserialize_media(media_payload)
5729+
5730+
assert media.proxy_url is None
5731+
assert media.width is undefined.UNDEFINED
5732+
assert media.height is undefined.UNDEFINED
5733+
assert media.content_type is undefined.UNDEFINED
5734+
5735+
assert isinstance(media, component_models.MediaResource)
5736+
5737+
def test__deserialize_media_with_nullable_fields(self, entity_factory_impl, media_payload):
5738+
media_payload["width"] = None
5739+
media_payload["height"] = None
5740+
media_payload["content_type"] = None
5741+
5742+
media = entity_factory_impl._deserialize_media(media_payload)
5743+
5744+
assert media.width is None
5745+
assert media.height is None
5746+
assert media.content_type is None
5747+
5748+
assert isinstance(media, component_models.MediaResource)
5749+
57225750
def test__deserialize_action_row_component(self, entity_factory_impl, action_row_payload, button_payload):
57235751
action_row = entity_factory_impl._deserialize_action_row_component(action_row_payload)
57245752

0 commit comments

Comments
 (0)