From 43f4a908584c06a3f05bea2539b9c938064df93c Mon Sep 17 00:00:00 2001 From: AndrielFR Date: Sat, 28 Dec 2024 22:40:39 -0300 Subject: [PATCH] refactor: rollback type hints to py 3.8 --- anilist/async_client.py | 32 ++++++++++++++++---------------- anilist/client_process.py | 25 ++++++++++++------------- anilist/sync_client.py | 28 ++++++++++++++-------------- anilist/types/statistics.py | 9 ++++----- pyproject.toml | 7 ++++++- requirements-dev.lock | 12 ++++++++++++ 6 files changed, 64 insertions(+), 49 deletions(-) diff --git a/anilist/async_client.py b/anilist/async_client.py index b336a54..91a6d40 100644 --- a/anilist/async_client.py +++ b/anilist/async_client.py @@ -3,7 +3,7 @@ # # SPDX-License-Identifier: MIT -from typing import List, Optional, Union +from typing import List, Optional, Union, Tuple import httpx @@ -71,7 +71,7 @@ async def search( pagination: bool = False, ) -> Optional[ Union[ - tuple[Union[Anime, Manga, Character, Staff, User], PageInfo], + Tuple[Union[Anime, Manga, Character, Staff, User], PageInfo], Union[Anime, Manga, Character, Staff, User]] ]: """Used to search specified content type with the given query. @@ -135,7 +135,7 @@ async def get( page: int = 1, limit: int = 25, pagination: bool = False, - ) -> Optional[tuple[Union[Anime, Manga, Character, Staff, List[MediaList], User], PageInfo]]: + ) -> Optional[Tuple[Union[Anime, Manga, Character, Staff, List[MediaList], User], PageInfo]]: """Gets specified item from given id. Args: @@ -172,7 +172,7 @@ async def get( user = await self.get_user(name=id) id = user.id except Exception: - raise TypeError(f"user not found") + raise TypeError("user not found") else: raise TypeError( f"id argument must be a string, not '{id.__class__.__name__}'" @@ -207,7 +207,7 @@ async def get( @staticmethod async def search_anime( query: str, limit: int, page: int = 1 - ) -> Optional[tuple[list[Anime], PageInfo]]: + ) -> Optional[Tuple[List[Anime], PageInfo]]: response = await api_query(ANIME_SEARCH_QUERY, dict(search=query, page=page, per_page=limit, MediaType="ANIME")) data: Optional[dict] = response.json() @@ -216,7 +216,7 @@ async def search_anime( @staticmethod async def search_manga( query: str, limit: int, page: int = 1 - ) -> Optional[tuple[list[Manga], PageInfo]]: + ) -> Optional[Tuple[List[Manga], PageInfo]]: response = await api_query(MANGA_SEARCH_QUERY, dict(search=query, page=page, per_page=limit, MediaType="MANGA")) data: dict = response.json() @@ -225,7 +225,7 @@ async def search_manga( @staticmethod async def search_character( query: str, limit: int, page: int = 1 - ) -> Optional[tuple[list[Character], PageInfo]]: + ) -> Optional[Tuple[List[Character], PageInfo]]: response = await api_query(CHARACTER_SEARCH_QUERY, dict(search=query, page=page, per_page=limit)) data = response.json() return process_search_character(data) @@ -233,7 +233,7 @@ async def search_character( @staticmethod async def search_staff( query: str, limit: int, page: int = 1 - ) -> Optional[tuple[list[Staff], PageInfo]]: + ) -> Optional[Tuple[List[Staff], PageInfo]]: response = await api_query(STAFF_SEARCH_QUERY, dict(search=query, page=page, per_page=limit)) data = response.json() return process_search_staff(data) @@ -241,7 +241,7 @@ async def search_staff( @staticmethod async def search_user( query: str, limit: int, page: int = 1 - ) -> Optional[tuple[list[User], PageInfo]]: + ) -> Optional[Tuple[List[User], PageInfo]]: response = await api_query(USER_SEARCH_QUERY, dict(search=query, page=page, per_page=limit)) data = response.json() return process_search_user(data) @@ -279,7 +279,7 @@ async def get_user(name: str) -> Optional[User]: @staticmethod async def get_list( user_id: int, limit: int, page: int = 1, content_type: str = "anime" - ) -> Optional[tuple[List[MediaList], List[MediaList]]]: + ) -> Optional[Tuple[List[MediaList], List[MediaList]]]: is_manga = "manga" in content_type response = await api_query(LIST_GET_QUERY_ANIME if not is_manga else LIST_GET_QUERY_MANGA, dict(user_id=user_id, page=page, per_page=limit)) @@ -308,7 +308,7 @@ async def get_activity( page: int = 1, limit: int = 25, pagination: bool = False, - ) -> Union[Optional[tuple[ListActivity, PageInfo]], Optional[ListActivity]]: + ) -> Union[Optional[Tuple[ListActivity, PageInfo]], Optional[ListActivity]]: """Returns activity of a user. Args: @@ -370,7 +370,7 @@ async def get_activity( @staticmethod async def get_anime_activity( user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[ListActivity], PageInfo]]: + ) -> Optional[Tuple[List[ListActivity], PageInfo]]: response = await api_query(LIST_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit, activity_type="ANIME_LIST")) data = response.json() @@ -378,7 +378,7 @@ async def get_anime_activity( @staticmethod async def get_manga_activity(user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[ListActivity], PageInfo]]: + ) -> Optional[Tuple[List[ListActivity], PageInfo]]: MANGA_ACTIVITY_QUERY = LIST_ACTIVITY_QUERY.replace("episodes", "chapters\nvolumes") response = await api_query(MANGA_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit, activity_type="MANGA_LIST")) @@ -387,21 +387,21 @@ async def get_manga_activity(user_id: int, limit: int, page: int = 1 @staticmethod async def get_text_activity(user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[TextActivity], PageInfo]]: + ) -> Optional[Tuple[List[TextActivity], PageInfo]]: response = await api_query(TEXT_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit)) data = response.json() return process_get_text_activity(data) @staticmethod async def get_message_activity(user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[TextActivity], PageInfo]]: + ) -> Optional[Tuple[List[TextActivity], PageInfo]]: response = await api_query(MESSAGE_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit)) data = response.json() return process_get_message_activity(data) @staticmethod async def get_message_activity_sent(user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[TextActivity], PageInfo]]: + ) -> Optional[Tuple[List[TextActivity], PageInfo]]: response = await api_query(MESSAGE_ACTIVITY_QUERY_SENT, dict(user_id=user_id, page=page, per_page=limit)) data = response.json() return process_get_message_activity_sent(data) diff --git a/anilist/client_process.py b/anilist/client_process.py index 5608bbc..30da80c 100644 --- a/anilist/client_process.py +++ b/anilist/client_process.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Optional, List, Tuple from .types import ( Anime, @@ -163,7 +163,7 @@ def construct_studio_object(media: dict) -> Studio: ) -def process_search_anime(data: Optional[dict]) -> Optional[tuple[list[Anime], PageInfo]]: +def process_search_anime(data: Optional[dict]) -> Optional[Tuple[List[Anime], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["media"] @@ -184,7 +184,7 @@ def process_search_anime(data: Optional[dict]) -> Optional[tuple[list[Anime], Pa return None -def process_search_manga(data: Optional[dict]) -> Optional[tuple[list[Manga], PageInfo]]: +def process_search_manga(data: Optional[dict]) -> Optional[Tuple[List[Manga], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["media"] @@ -205,7 +205,7 @@ def process_search_manga(data: Optional[dict]) -> Optional[tuple[list[Manga], Pa return None -def process_search_character(data: dict) -> Optional[tuple[list[Character], PageInfo]]: +def process_search_character(data: dict) -> Optional[Tuple[List[Character], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["characters"] @@ -225,7 +225,7 @@ def process_search_character(data: dict) -> Optional[tuple[list[Character], Page return None -def process_search_staff(data) -> Optional[tuple[list[Staff], PageInfo]]: +def process_search_staff(data) -> Optional[Tuple[List[Staff], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["staff"] @@ -243,7 +243,7 @@ def process_search_staff(data) -> Optional[tuple[list[Staff], PageInfo]]: return None -def process_search_user(data) -> Optional[tuple[list[User], PageInfo]]: +def process_search_user(data) -> Optional[Tuple[List[User], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["users"] @@ -265,7 +265,6 @@ def process_search_user(data) -> Optional[tuple[list[User], PageInfo]]: def process_get_anime(data) -> Optional[Anime]: - print(data) if data["data"]: try: item = data["data"]["Page"]["media"][0] @@ -472,7 +471,7 @@ def process_get_user(data) -> Optional[User]: return None -def process_get_list(data: dict, content_type: str) -> Optional[tuple[list[MediaList], PageInfo]]: +def process_get_list(data: dict, content_type: str) -> Optional[Tuple[List[MediaList], PageInfo]]: is_manga = "manga" in content_type res = [] if data["data"]: @@ -557,7 +556,7 @@ def process_get_list_item(data: dict) -> Optional[MediaList]: return None -def process_get_anime_activity(data) -> Optional[tuple[list[ListActivity], PageInfo]]: +def process_get_anime_activity(data) -> Optional[Tuple[List[ListActivity], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["activities"] @@ -592,7 +591,7 @@ def process_get_anime_activity(data) -> Optional[tuple[list[ListActivity], PageI return None -def process_get_manga_activity(data: dict) -> Optional[tuple[list[ListActivity], PageInfo]]: +def process_get_manga_activity(data: dict) -> Optional[Tuple[List[ListActivity], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["activities"] @@ -626,7 +625,7 @@ def process_get_manga_activity(data: dict) -> Optional[tuple[list[ListActivity], return None -def process_get_text_activity(data: dict) -> Optional[tuple[list[TextActivity], PageInfo]]: +def process_get_text_activity(data: dict) -> Optional[Tuple[List[TextActivity], PageInfo]]: if data["data"]: try: items = data["data"]["Page"]["activities"] @@ -662,7 +661,7 @@ def process_get_text_activity(data: dict) -> Optional[tuple[list[TextActivity], return None -def process_get_message_activity(data: dict) -> Optional[list[TextActivity]]: +def process_get_message_activity(data: dict) -> Optional[List[TextActivity]]: result = [] if data["data"]: @@ -700,5 +699,5 @@ def process_get_message_activity(data: dict) -> Optional[list[TextActivity]]: return None -def process_get_message_activity_sent(data: dict) -> Optional[tuple[list[TextActivity], PageInfo]]: +def process_get_message_activity_sent(data: dict) -> Optional[Tuple[List[TextActivity], PageInfo]]: return process_get_message_activity(data) # Currently they are the same diff --git a/anilist/sync_client.py b/anilist/sync_client.py index 1958d51..a04ae9d 100644 --- a/anilist/sync_client.py +++ b/anilist/sync_client.py @@ -70,7 +70,7 @@ def search( pagination: bool = False, ) -> Optional[ Union[ - tuple[Union[Anime, Manga, Character, Staff, User], PageInfo], + Tuple[Union[Anime, Manga, Character, Staff, User], PageInfo], Union[Anime, Manga, Character, Staff, User]] ]: """Used to search specified content type with the given query. @@ -132,7 +132,7 @@ def get( page: int = 1, limit: int = 25, pagination: bool = False, - ) -> Optional[tuple[Union[Anime, Manga, Character, Staff, List[MediaList], User], PageInfo]]: + ) -> Optional[Tuple[Union[Anime, Manga, Character, Staff, List[MediaList], User], PageInfo]]: """Gets specified item from given id. Args: @@ -202,31 +202,31 @@ def get( raise TypeError("There is no such content type.") @staticmethod - def search_anime(query: str, limit: int, page: int = 1) -> Optional[tuple[list[Anime], PageInfo]]: + def search_anime(query: str, limit: int, page: int = 1) -> Optional[Tuple[List[Anime], PageInfo]]: response = api_query(ANIME_SEARCH_QUERY, dict(search=query, page=page, per_page=limit, MediaType="ANIME")) data: Optional[dict] = response.json() return process_search_anime(data) @staticmethod - def search_manga(query: str, limit: int, page: int = 1) -> Optional[tuple[list[Manga], PageInfo]]: + def search_manga(query: str, limit: int, page: int = 1) -> Optional[Tuple[List[Manga], PageInfo]]: response = api_query(MANGA_SEARCH_QUERY, dict(search=query, page=page, per_page=limit, MediaType="MANGA")) data = response.json() return process_search_manga(data) @staticmethod - def search_character(query: str, limit: int, page: int = 1) -> Optional[tuple[list[Character], PageInfo]]: + def search_character(query: str, limit: int, page: int = 1) -> Optional[Tuple[List[Character], PageInfo]]: response = api_query(CHARACTER_SEARCH_QUERY, dict(search=query, page=page, per_page=limit)) data = response.json() return process_search_character(data) @staticmethod - def search_staff(query: str, limit: int, page: int = 1) -> Optional[tuple[list[Staff], PageInfo]]: + def search_staff(query: str, limit: int, page: int = 1) -> Optional[Tuple[List[Staff], PageInfo]]: response = api_query(STAFF_SEARCH_QUERY, dict(search=query, page=page, per_page=limit)) data = response.json() return process_search_staff(data) @staticmethod - def search_user(query: str, limit: int, page: int = 1) -> Optional[tuple[list[User], PageInfo]]: + def search_user(query: str, limit: int, page: int = 1) -> Optional[Tuple[List[User], PageInfo]]: response = api_query(USER_SEARCH_QUERY, dict(search=query, page=page, per_page=limit)) data = response.json() return process_search_user(data) @@ -264,7 +264,7 @@ def get_user(name: str) -> Optional[User]: @staticmethod def get_list( user_id: int, limit: int, page: int = 1, content_type: str = "anime" - ) -> Optional[tuple[list[MediaList], PageInfo]]: + ) -> Optional[Tuple[List[MediaList], PageInfo]]: is_manga = "manga" in content_type response = api_query(LIST_GET_QUERY_ANIME if not is_manga else LIST_GET_QUERY_MANGA, dict(user_id=user_id, page=page, per_page=limit)) @@ -293,7 +293,7 @@ def get_activity( page: int = 1, limit: int = 25, pagination: bool = False, - ) -> Union[Optional[tuple[ListActivity, PageInfo]], Optional[ListActivity]]: + ) -> Union[Optional[Tuple[ListActivity, PageInfo]], Optional[ListActivity]]: """Returns activity of a user. Args: @@ -348,7 +348,7 @@ def get_activity( @staticmethod def get_anime_activity(user_id: int, limit: int, page: int = 1) \ - -> Optional[tuple[list[ListActivity], PageInfo]]: + -> Optional[Tuple[List[ListActivity], PageInfo]]: response = api_query(LIST_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit, activity_type="ANIME_LIST")) data = response.json() @@ -356,7 +356,7 @@ def get_anime_activity(user_id: int, limit: int, page: int = 1) \ @staticmethod def get_manga_activity(user_id: int, limit: int, page: int = 1) \ - -> Optional[tuple[list[ListActivity], PageInfo]]: + -> Optional[Tuple[List[ListActivity], PageInfo]]: MANGA_ACTIVITY_QUERY = LIST_ACTIVITY_QUERY.replace( "episodes", "chapters\nvolumes" ) @@ -368,7 +368,7 @@ def get_manga_activity(user_id: int, limit: int, page: int = 1) \ @staticmethod def get_text_activity( user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[TextActivity], PageInfo]]: + ) -> Optional[Tuple[List[TextActivity], PageInfo]]: response = api_query(TEXT_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit)) data = response.json() return process_get_text_activity(data) @@ -376,7 +376,7 @@ def get_text_activity( @staticmethod def get_message_activity( user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[TextActivity], PageInfo]]: + ) -> Optional[Tuple[List[TextActivity], PageInfo]]: response = api_query(MESSAGE_ACTIVITY_QUERY, dict(user_id=user_id, page=page, per_page=limit)) data = response.json() return process_get_message_activity(data) @@ -384,7 +384,7 @@ def get_message_activity( @staticmethod def get_message_activity_sent( user_id: int, limit: int, page: int = 1 - ) -> Optional[tuple[list[TextActivity], PageInfo]]: + ) -> Optional[Tuple[List[TextActivity], PageInfo]]: response = api_query(MESSAGE_ACTIVITY_QUERY_SENT, dict(user_id=user_id, page=page, per_page=limit)) data = response.json() return process_get_message_activity_sent(data) diff --git a/anilist/types/statistics.py b/anilist/types/statistics.py index 49dd88d..5008c78 100644 --- a/anilist/types/statistics.py +++ b/anilist/types/statistics.py @@ -3,10 +3,9 @@ # # SPDX-License-Identifier: MIT -from typing import Callable, Dict, List +from typing import List, Dict from .object import Object -from .score import Score class Ranking(Object): @@ -44,9 +43,9 @@ def __init__( episodes_watched: int = None, chapters_read: int = None, volumes_read: int = None, - statuses: list[list[dict[str, int], dict[str, int]]] = None, - genres: list[list[dict[str, int], dict[str, int]]] = None, - tags: list[list[dict[str, int], dict[str, int]]] = None, + statuses: List[List[Dict[str, int]]] = None, + genres: List[List[Dict[str, int]]] = None, + tags: List[List[Dict[str, int]]] = None, ) -> None: self.count = count self.mean_score = mean_score diff --git a/pyproject.toml b/pyproject.toml index 5ef2a05..1ad37be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,8 +36,13 @@ source = "https://github.com/AmanoTeam/python-anilist" [tool.setuptools.package-data] anilist = ["py.typed", "*.graphql"] +[tool.rye] +dev-dependencies = [ + "pytest>=8.3.4", + "pytest-asyncio>=0.24.0", +] + [tool.pytest.ini_options] -addopts = "--cov=python-anilist" testpaths = [ "tests", ] diff --git a/requirements-dev.lock b/requirements-dev.lock index 7d0e464..9ceb837 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -17,6 +17,7 @@ certifi==2024.12.14 # via httpx exceptiongroup==1.2.2 # via anyio + # via pytest h11==0.14.0 # via httpcore h2==4.1.0 @@ -32,7 +33,18 @@ hyperframe==6.0.1 idna==3.10 # via anyio # via httpx +iniconfig==2.0.0 + # via pytest +packaging==24.2 + # via pytest +pluggy==1.5.0 + # via pytest +pytest==8.3.4 + # via pytest-asyncio +pytest-asyncio==0.24.0 sniffio==1.3.1 # via anyio # via httpcore # via httpx +tomli==2.2.1 + # via pytest