From b5b3689290a53ac06f4ab93ff4078873ffc42915 Mon Sep 17 00:00:00 2001 From: Il`ya Semyonov Date: Sun, 7 Jun 2020 15:24:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D1=81=D0=B5=D1=80=D0=B8=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20decomposed=20?= =?UTF-8?q?=D1=83=20Artist.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit И года не прошло. Не без веселья конечно #10 --- tests/conftest.py | 16 +++++++++++++--- tests/test_artist.py | 14 ++++++++------ yandex_music/artist/artist.py | 16 +++++++++++----- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6468ecc..41407d5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -25,12 +25,12 @@ from . import TestAccount, TestAdParams, TestAlbum, TestArtist, TestAutoRenewabl @pytest.fixture(scope='session') def artist_factory(cover, counts, ratings, link, description): class ArtistFactory: - def get(self, popular_tracks): + def get(self, popular_tracks, decomposed=None): return Artist(TestArtist.id, TestArtist.error, TestArtist.reason, TestArtist.name, cover, TestArtist.various, TestArtist.composer, TestArtist.genres, TestArtist.og_image, TestArtist.op_image, TestArtist.no_pictures_from_search, counts, TestArtist.available, ratings, [link], TestArtist.tickets_available, TestArtist.likes_count, popular_tracks, - TestArtist.regions, TestArtist.decomposed, TestArtist.full_names, description, + TestArtist.regions, decomposed, TestArtist.full_names, description, TestArtist.countries, TestArtist.en_wikipedia_link, TestArtist.db_aliases, TestArtist.aliases, TestArtist.init_date, TestArtist.end_date) @@ -38,7 +38,12 @@ def artist_factory(cover, counts, ratings, link, description): @pytest.fixture(scope='session') -def artist(artist_factory, track_without_artists_and_albums): +def artist(artist_factory, track_without_artists_and_albums, artist_decomposed): + return artist_factory.get([track_without_artists_and_albums], artist_decomposed) + + +@pytest.fixture(scope='session') +def artist_without_nested_artist(artist_factory, track_without_artists_and_albums): return artist_factory.get([track_without_artists_and_albums]) @@ -47,6 +52,11 @@ def artist_without_tracks(artist_factory): return artist_factory.get([]) +@pytest.fixture(scope='session') +def artist_decomposed(artist_without_nested_artist): + return [' & ', artist_without_nested_artist] + + @pytest.fixture(scope='session') def track_factory(major, normalization, user, meta_data): class TrackFactory: diff --git a/tests/test_artist.py b/tests/test_artist.py index f3595c1..35061d2 100644 --- a/tests/test_artist.py +++ b/tests/test_artist.py @@ -16,7 +16,6 @@ class TestArtist: tickets_available = False likes_count = 657469 regions = None - decomposed = None full_names = None countries = None en_wikipedia_link = None @@ -25,7 +24,8 @@ class TestArtist: init_date = '1935-01-08' end_date = None - def test_expected_values(self, artist, cover, counts, ratings, link, track_without_artists_and_albums, description): + def test_expected_values(self, artist, cover, counts, ratings, link, track_without_artists_and_albums, + description, artist_decomposed): assert artist.id == self.id assert artist.error == self.error assert artist.reason == self.reason @@ -45,7 +45,7 @@ class TestArtist: assert artist.likes_count == self.likes_count assert artist.popular_tracks == [track_without_artists_and_albums] assert artist.regions == self.regions - assert artist.decomposed == self.decomposed + assert artist.decomposed == artist_decomposed assert artist.full_names == self.full_names assert artist.description == description assert artist.countries == self.countries @@ -67,7 +67,9 @@ class TestArtist: assert artist.id == self.id - def test_de_json_all(self, client, cover, counts, ratings, link, track_without_artists, description): + def test_de_json_all(self, client, cover, counts, ratings, link, track_without_artists, + description, artist_decomposed): + artist_decomposed_dict = [item if isinstance(item, str) else item.to_dict() for item in artist_decomposed] json_dict = {'id_': self.id, 'reason': self.reason, 'error': self.error, 'name': self.name, 'various': self.various, 'composer': self.composer, 'cover': cover.to_dict(), 'genres': self.genres, 'op_image': self.op_image, 'og_image': self.og_image, @@ -75,7 +77,7 @@ class TestArtist: 'available': self.available, 'ratings': ratings.to_dict(), 'links': [link.to_dict()], 'tickets_available': self.tickets_available, 'likes_count': self.likes_count, 'popular_tracks': [track_without_artists.to_dict()], - 'regions': self.regions, 'decomposed': self.decomposed, 'full_names': self.full_names, + 'regions': self.regions, 'decomposed': artist_decomposed_dict, 'full_names': self.full_names, 'description': description.to_dict(), 'countries': self.countries, 'en_wikipedia_link': self.en_wikipedia_link, 'db_aliases': self.db_aliases, 'aliases': self.aliases, 'init_date': self.init_date, 'end_date': self.end_date} @@ -100,7 +102,7 @@ class TestArtist: assert artist.likes_count == self.likes_count assert artist.popular_tracks == [track_without_artists] assert artist.regions == self.regions - assert artist.decomposed == self.decomposed + assert artist.decomposed == artist_decomposed assert artist.full_names == self.full_names assert artist.description == description assert artist.countries == self.countries diff --git a/yandex_music/artist/artist.py b/yandex_music/artist/artist.py index baa06ef..b2ae061 100644 --- a/yandex_music/artist/artist.py +++ b/yandex_music/artist/artist.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Optional, List +from typing import TYPE_CHECKING, Optional, List, Union from yandex_music import YandexMusicObject @@ -27,7 +27,8 @@ class Artist(YandexMusicObject): links (:obj:`list` из :obj:`yandex_music.Link`): Ссылки на ресурсы исполнителя. tickets_available (:obj:`bool`): Имеются ли в продаже билеты на концерт. regions (:obj:`list` из :obj:`str`): Регион TODO. - decomposed: TODO. + decomposed (:obj:`list` из :obj:`str` и :obj:`yandex_music.Artist`): Декомпозиция всех исполнителей. Лист, где + чередуется разделитель и артист. Фиты и прочее. popular_tracks (:obj:`list` :obj:`yandex_music.Track`): Популярные треки. likes_count (:obj:`int`): Количество лайков. full_names: TODO. @@ -60,7 +61,8 @@ class Artist(YandexMusicObject): likes_count (:obj:`int`, optional): Количество лайков. popular_tracks (:obj:`list` :obj:`yandex_music.Track`, optional): Популярные треки. regions (:obj:`list` из :obj:`str`, optional): Регион TODO. - decomposed: TODO. + decomposed (:obj:`list` из :obj:`str` и :obj:`yandex_music.Artist`, optional): Декомпозиция всех исполнителей. + Лист, где чередуется разделитель и артист. Фиты и прочее. full_names: TODO. description (:obj:`yandex_music.Description`, optional): Описание. countries (:obj:`list` из :obj:`str`, optional): Страны. @@ -93,7 +95,7 @@ class Artist(YandexMusicObject): likes_count: Optional[int] = None, popular_tracks: Optional[List['Track']] = None, regions: Optional[List[str]] = None, - decomposed=None, + decomposed: Optional[List[Union[str, 'Artist']]] = None, full_names=None, description: Optional['Description'] = None, countries: Optional[List[str]] = None, @@ -212,7 +214,11 @@ class Artist(YandexMusicObject): data['links'] = Link.de_list(data.get('links'), client) data['popular_tracks'] = Track.de_list(data.get('popular_tracks'), client) data['description'] = Description.de_json(data.get('description'), client) - # TODO add "decomposed" deserialization + + # Мне очень интересно увидеть как в яндухе на клиентах солвят свой бэковский костыль, пригласите на экскурсию + if data.get('decomposed'): + data['decomposed'] = [Artist.de_json(part, client) + if isinstance(part, dict) else part for part in data['decomposed']] return cls(client=client, **data)