fix typing of tuples
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 24 Mar 2023 00:07:54 +0000 (01:07 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 24 Mar 2023 00:07:54 +0000 (01:07 +0100)
14 files changed:
music_assistant/common/models/config_entries.py
music_assistant/common/models/media_items.py
music_assistant/common/models/provider.py
music_assistant/server/controllers/media/base.py
music_assistant/server/controllers/media/playlists.py
music_assistant/server/controllers/player_queues.py
music_assistant/server/controllers/players.py
music_assistant/server/helpers/tags.py
music_assistant/server/models/music_provider.py
music_assistant/server/providers/airplay/__init__.py
music_assistant/server/providers/filesystem_local/base.py
music_assistant/server/providers/spotify/__init__.py
music_assistant/server/providers/ytmusic/__init__.py
music_assistant/server/server.py

index 438034c6c5c6124cba96957163efb5959db03a44..7013370d8657545ee1e76c85a224a6f6bc2835e3 100644 (file)
@@ -65,7 +65,7 @@ class ConfigEntry(DataClassDictMixin):
     default_value: ConfigValueType = None
     required: bool = True
     # options [optional]: select from list of possible values/options
-    options: tuple[ConfigValueOption] | None = None
+    options: tuple[ConfigValueOption, ...] | None = None
     # range [optional]: select values within range
     range: tuple[int, int] | None = None
     # description [optional]: extended description of the setting.
index c4a01926a3d4d7dcfe9e96cb80706cb11194afcd..f405257f836b8fc2ebbc1f3be45d93af132159d6 100755 (executable)
@@ -334,7 +334,7 @@ class Track(MediaItem):
         return None
 
     @property
-    def isrcs(self) -> tuple[str]:
+    def isrcs(self) -> tuple[str, ...]:
         """Split multiple values in isrc field."""
         # sometimes the isrc contains multiple values, split by semicolon
         if not self.isrc:
index 3cb68e3096999693ef8f53f238bbddfe305c6249..a7b728487372acbb6c6e873376e1e7c8b83a09d1 100644 (file)
@@ -65,7 +65,7 @@ class SyncTask:
 
     provider_domain: str
     provider_instance: str
-    media_types: tuple[MediaType]
+    media_types: tuple[MediaType, ...]
     task: asyncio.Task
 
     def to_dict(self, *args, **kwargs) -> dict[str, Any]:
index 41616a6c382b7769105511ad0c5b40569cbc70a5..deb9a1880509dd1d1ff00f55617c74174d386838 100644 (file)
@@ -344,7 +344,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
         self,
         provider_domain: str | None = None,
         provider_instance: str | None = None,
-        provider_item_ids: tuple[str] | None = None,
+        provider_item_ids: tuple[str, ...] | None = None,
         limit: int = 500,
         offset: int = 0,
     ) -> list[ItemCls]:
@@ -375,7 +375,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
         self,
         provider_domain: str | None = None,
         provider_instance: str | None = None,
-        provider_item_ids: tuple[str] | None = None,
+        provider_item_ids: tuple[str, ...] | None = None,
         limit: int = 500,
         offset: int = 0,
     ) -> AsyncGenerator[ItemCls, None]:
index cad0e139dec5095f9815ba48d1e984aff565ef95..2ee28b8e7498e92d5ee267f555b42b1b850e65ad 100644 (file)
@@ -163,7 +163,7 @@ class PlaylistController(MediaControllerBase[Playlist]):
         await self.get(db_playlist_id, provider_domain="database", force_refresh=True)
 
     async def remove_playlist_tracks(
-        self, db_playlist_id: str, positions_to_remove: tuple[int]
+        self, db_playlist_id: str, positions_to_remove: tuple[int, ...]
     ) -> None:
         """Remove multiple tracks from playlist."""
         playlist = await self.get_db_item(db_playlist_id)
index b00c23ce9d7c156c05675e9adc0590f9356d0bec..09abcdf42968f768120840b55349b8eb6a86c617 100755 (executable)
@@ -56,7 +56,7 @@ class PlayerQueuesController:
         return iter(self._queues.values())
 
     @api_command("players/queue/all")
-    def all(self) -> tuple[PlayerQueue]:
+    def all(self) -> tuple[PlayerQueue, ...]:
         """Return all registered PlayerQueues."""
         return tuple(self._queues.values())
 
index ec96dfc3c6af97f084102d05acc5c392282f1e23..6a3a431d6f3e8a3b156e7cafb9befbaf79c610a0 100755 (executable)
@@ -67,7 +67,7 @@ class PlayerController:
         return_unavailable: bool = True,
         return_hidden: bool = True,
         return_disabled: bool = False,
-    ) -> tuple[Player]:
+    ) -> tuple[Player, ...]:
         """Return all registered players."""
         return tuple(
             player
index fd064043fc78371002fc4e2e893247355fc34143..22f674c6696f44e6638da6724cde16a05b598938 100644 (file)
@@ -20,7 +20,7 @@ from music_assistant.server.helpers.process import AsyncProcess
 TAG_SPLITTER = ";"
 
 
-def split_items(org_str: str) -> tuple[str]:
+def split_items(org_str: str) -> tuple[str, ...]:
     """Split up a tags string by common splitter."""
     if not org_str:
         return tuple()
@@ -29,7 +29,7 @@ def split_items(org_str: str) -> tuple[str]:
     return tuple(x.strip() for x in org_str.split(TAG_SPLITTER))
 
 
-def split_artists(org_artists: str | tuple[str]) -> tuple[str]:
+def split_artists(org_artists: str | tuple[str, ...]) -> tuple[str, ...]:
     """Parse all artists from a string."""
     final_artists = set()
     # when not using the multi artist tag, the artist string may contain
@@ -77,7 +77,7 @@ class AudioTags:
         return self.tags.get("album")
 
     @property
-    def artists(self) -> tuple[str]:
+    def artists(self) -> tuple[str, ...]:
         """Return track artists."""
         # prefer multi-artist tag
         if tag := self.tags.get("artists"):
@@ -96,7 +96,7 @@ class AudioTags:
         return (UNKNOWN_ARTIST,)
 
     @property
-    def album_artists(self) -> tuple[str]:
+    def album_artists(self) -> tuple[str, ...]:
         """Return (all) album artists (if any)."""
         # prefer multi-artist tag
         if tag := self.tags.get("albumartists"):
@@ -109,7 +109,7 @@ class AudioTags:
         return tuple()
 
     @property
-    def genres(self) -> tuple[str]:
+    def genres(self) -> tuple[str, ...]:
         """Return (all) genres, if any."""
         return split_items(self.tags.get("genre"))
 
@@ -139,12 +139,12 @@ class AudioTags:
         return None
 
     @property
-    def musicbrainz_artistids(self) -> tuple[str]:
+    def musicbrainz_artistids(self) -> tuple[str, ...]:
         """Return musicbrainz_artistid tag(s) if present."""
         return split_items(self.tags.get("musicbrainzartistid"))
 
     @property
-    def musicbrainz_albumartistids(self) -> tuple[str]:
+    def musicbrainz_albumartistids(self) -> tuple[str, ...]:
         """Return musicbrainz_albumartistid tag if present."""
         return split_items(self.tags.get("musicbrainzalbumartistid"))
 
index 9bacb694a7af938315de7efa3981bfd6778a4e86..aaf2e423f24351f5492377e6cc3e9e3ff3660e76 100644 (file)
@@ -195,7 +195,7 @@ class MusicProvider(Provider):
             raise NotImplementedError
 
     async def remove_playlist_tracks(
-        self, prov_playlist_id: str, positions_to_remove: tuple[int]
+        self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
     ) -> None:
         """Remove track(s) from playlist."""
         if ProviderFeature.PLAYLIST_TRACKS_EDIT in self.supported_features:
index 2416ab2f6a03763ae0de0a72e65b9abc142a7c2c..8a5a6bc4a6adbd2dbe7e58edb5c94538b29d260b 100644 (file)
@@ -121,7 +121,7 @@ class AirplayProvider(PlayerProvider):
         self._closing = True
         await self._stop_bridge()
 
-    def get_player_config_entries(self, player_id: str) -> tuple[ConfigEntry]:
+    def get_player_config_entries(self, player_id: str) -> tuple[ConfigEntry, ...]:
         """Return all (provider/player specific) Config Entries for the given player (if any)."""
         slimproto_prov = self.mass.get_provider("slimproto")
         base_entries = slimproto_prov.get_player_config_entries(player_id)
index f4724d6766709a8332660cf8910822d72df0877a..61798aed4f175cb66627a5a0f344ee713128f2f9 100644 (file)
@@ -619,7 +619,7 @@ class FileSystemProviderBase(MusicProvider):
         await self.write_file_content(prov_playlist_id, playlist_data.encode("utf-8"))
 
     async def remove_playlist_tracks(
-        self, prov_playlist_id: str, positions_to_remove: tuple[int]
+        self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
     ) -> None:
         """Remove track(s) from playlist."""
         if not await self.exists(prov_playlist_id):
index 3e894d286c851e410e80c81aa33cb5fbb26b0ee4..dddfbf472ce15809c336edfeaec0f3d0bc1399bd 100644 (file)
@@ -315,7 +315,7 @@ class SpotifyProvider(MusicProvider):
         return await self._post_data(f"playlists/{prov_playlist_id}/tracks", data=data)
 
     async def remove_playlist_tracks(
-        self, prov_playlist_id: str, positions_to_remove: tuple[int]
+        self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
     ) -> None:
         """Remove track(s) from playlist."""
         track_uris = []
index a05b6e72ad9ed525b81bfac379d2bf15d76cf4b7..9b9b307ca953d747775593e1f6779285ca665bb3 100644 (file)
@@ -364,7 +364,7 @@ class YoutubeMusicProvider(MusicProvider):
         )
 
     async def remove_playlist_tracks(
-        self, prov_playlist_id: str, positions_to_remove: tuple[int]
+        self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
     ) -> None:
         """Remove track(s) from playlist."""
         playlist_obj = await get_playlist(
index 8e2c0c0562b83d85e1215fad547fd8778496f454..90a5ed3c49bf84b9dbc0391b374c5ab77b0774e4 100644 (file)
@@ -35,7 +35,9 @@ if TYPE_CHECKING:
     from types import TracebackType
 
 EventCallBackType = Callable[[MassEvent], None]
-EventSubscriptionType = tuple[EventCallBackType, tuple[EventType] | None, tuple[str] | None]
+EventSubscriptionType = tuple[
+    EventCallBackType, tuple[EventType, ...] | None, tuple[str, ...] | None
+]
 
 LOGGER = logging.getLogger(ROOT_LOGGER_NAME)