Add strict typing of post to Mastodon (#140299)

* Type post API

* Update quality scale
This commit is contained in:
Andrew Jackson 2025-03-11 08:11:46 +00:00 committed by GitHub
parent 6b601b9aad
commit cdff2e4648
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 15 additions and 14 deletions

View File

@ -5,7 +5,7 @@ from __future__ import annotations
from typing import Any, cast from typing import Any, cast
from mastodon import Mastodon from mastodon import Mastodon
from mastodon.Mastodon import MastodonAPIError from mastodon.Mastodon import MastodonAPIError, MediaAttachment
import voluptuous as vol import voluptuous as vol
from homeassistant.components.notify import ( from homeassistant.components.notify import (
@ -114,7 +114,7 @@ class MastodonNotificationService(BaseNotificationService):
message, message,
visibility=target, visibility=target,
spoiler_text=content_warning, spoiler_text=content_warning,
media_ids=mediadata["id"], media_ids=mediadata.id,
sensitive=sensitive, sensitive=sensitive,
) )
except MastodonAPIError as err: except MastodonAPIError as err:
@ -134,12 +134,14 @@ class MastodonNotificationService(BaseNotificationService):
translation_key="unable_to_send_message", translation_key="unable_to_send_message",
) from err ) from err
def _upload_media(self, media_path: Any = None) -> Any: def _upload_media(self, media_path: Any = None) -> MediaAttachment:
"""Upload media.""" """Upload media."""
with open(media_path, "rb"): with open(media_path, "rb"):
media_type = get_media_type(media_path) media_type = get_media_type(media_path)
try: try:
mediadata = self.client.media_post(media_path, mime_type=media_type) mediadata: MediaAttachment = self.client.media_post(
media_path, mime_type=media_type
)
except MastodonAPIError as err: except MastodonAPIError as err:
raise HomeAssistantError( raise HomeAssistantError(
translation_domain=DOMAIN, translation_domain=DOMAIN,

View File

@ -93,7 +93,4 @@ rules:
# Platinum # Platinum
async-dependency: todo async-dependency: todo
inject-websession: todo inject-websession: todo
strict-typing: strict-typing: done
status: todo
comment: |
Requirement 'Mastodon.py==1.8.1' appears untyped

View File

@ -5,7 +5,7 @@ from functools import partial
from typing import Any, cast from typing import Any, cast
from mastodon import Mastodon from mastodon import Mastodon
from mastodon.Mastodon import MastodonAPIError from mastodon.Mastodon import MastodonAPIError, MediaAttachment
import voluptuous as vol import voluptuous as vol
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
@ -104,7 +104,7 @@ def setup_services(hass: HomeAssistant) -> None:
def _post(client: Mastodon, **kwargs: Any) -> None: def _post(client: Mastodon, **kwargs: Any) -> None:
"""Post to Mastodon.""" """Post to Mastodon."""
media_data: dict[str, Any] | None = None media_data: MediaAttachment | None = None
media_path = kwargs.get("media_path") media_path = kwargs.get("media_path")
if media_path: if media_path:
@ -137,7 +137,7 @@ def setup_services(hass: HomeAssistant) -> None:
try: try:
media_ids: str | None = None media_ids: str | None = None
if media_data: if media_data:
media_ids = media_data["id"] media_ids = media_data.id
client.status_post(media_ids=media_ids, **kwargs) client.status_post(media_ids=media_ids, **kwargs)
except MastodonAPIError as err: except MastodonAPIError as err:
raise HomeAssistantError( raise HomeAssistantError(

View File

@ -2,7 +2,7 @@
from unittest.mock import AsyncMock, Mock, patch from unittest.mock import AsyncMock, Mock, patch
from mastodon.Mastodon import MastodonAPIError from mastodon.Mastodon import MastodonAPIError, MediaAttachment
import pytest import pytest
from homeassistant.components.mastodon.const import ( from homeassistant.components.mastodon.const import (
@ -106,7 +106,9 @@ async def test_service_post(
with ( with (
patch.object(hass.config, "is_allowed_path", return_value=True), patch.object(hass.config, "is_allowed_path", return_value=True),
patch.object(mock_mastodon_client, "media_post", return_value={"id": "1"}), patch.object(
mock_mastodon_client, "media_post", return_value=MediaAttachment(id="1")
),
): ):
await hass.services.async_call( await hass.services.async_call(
DOMAIN, DOMAIN,
@ -163,7 +165,7 @@ async def test_post_service_failed(
await hass.async_block_till_done() await hass.async_block_till_done()
hass.config.is_allowed_path = Mock(return_value=True) hass.config.is_allowed_path = Mock(return_value=True)
mock_mastodon_client.media_post.return_value = {"id": "1"} mock_mastodon_client.media_post.return_value = MediaAttachment(id="1")
mock_mastodon_client.status_post.side_effect = MastodonAPIError mock_mastodon_client.status_post.side_effect = MastodonAPIError