Skip to content

Commit

Permalink
Add typehints for remaining sync methods
Browse files Browse the repository at this point in the history
  • Loading branch information
scrazzz committed Feb 2, 2024
1 parent 8ab641d commit 5765501
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 29 deletions.
16 changes: 10 additions & 6 deletions redgifs/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@

import io
import os
from typing import Any, Dict, List, Optional, Union
from datetime import datetime
from typing import TYPE_CHECKING, Any, List, Optional, Union

import requests

Expand All @@ -37,6 +38,9 @@
from .parser import parse_creator, parse_feeds, parse_search, parse_creators, parse_search_image
from .models import URL, GIF, CreatorResult, Feeds, Image, SearchResult, CreatorsResult

if TYPE_CHECKING:
from redgifs.types.tags import TagInfo

__all__ = ('API',)

class API:
Expand Down Expand Up @@ -92,7 +96,7 @@ def get_feeds(self) -> Feeds:
feeds = self.http.get_feeds()
return parse_feeds(feeds)

def get_tags(self) -> List[Dict[str, Union[str, int]]]:
def get_tags(self) -> List[TagInfo]:
"""Get all available RedGifs Tags.
Returns
Expand All @@ -115,11 +119,11 @@ def get_gif(self, id: str) -> GIF:
:py:class:`GIF <redgifs.models.GIF>` - The GIF's info.
"""

json: Dict[str, Any] = self.http.get_gif(id)['gif']
json = self.http.get_gif(id)['gif']
urls = json['urls']
return GIF(
id=json['id'],
create_date=json['createDate'],
create_date=datetime.utcfromtimestamp(json['createDate']),
has_audio=json['hasAudio'],
width=json['width'],
height=json['height'],
Expand Down Expand Up @@ -165,7 +169,7 @@ def get_trending_images(self) -> List[Image]:
r = self.http.get_trending_images()['gifs']
return _images_iter(r)

def get_trending_tags(self) -> List[Dict[str, Union[str, int]]]:
def get_trending_tags(self) -> List[TagInfo]:
"""Get the trending searches on RedGifs.
Returns
Expand Down Expand Up @@ -206,7 +210,7 @@ def fetch_tag_suggestions(self, query: str) -> List[str]:
A list of tag names.
"""
result = self.http.get_tag_suggestions(query)
return [d['text'] for d in result]
return [d['text'] for d in result] # type: ignore

def search(
self,
Expand Down
27 changes: 14 additions & 13 deletions redgifs/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
from redgifs.types.image import ImageResponse, TrendingImagesResponse
from redgifs.types.feeds import FeedsResponse
from redgifs.types.tags import TagsResponse
from redgifs.types.user import CreatorResponse, CreatorsResponse

T = TypeVar('T')
Response = Coroutine[Any, Any, T]
Expand Down Expand Up @@ -137,16 +138,16 @@ def get_temp_token(self):

# GIF methods

def get_feeds(self):
def get_feeds(self) -> FeedsResponse:
return self.request(Route('GET', '/v2/home/feeds'))

def get_tags(self, **params: Any):
def get_tags(self, **params: Any) -> TagsResponse:
return self.request(Route('GET', '/v1/tags'), **params)

def get_gif(self, id: str, **params: Any):
def get_gif(self, id: str, **params: Any) -> GetGifResponse:
return self.request(Route('GET', '/v2/gifs/{id}', id=id), **params)

def search(self, search_text: str, order: Order, count: int, page: int, **params: Any):
def search(self, search_text: str, order: Order, count: int, page: int, **params: Any) -> GifResponse:
r = Route(
'GET', '/v2/gifs/search?search_text={search_text}&order={order}&count={count}&page={page}',
search_text=search_text, order=order.value, count=count, page=page
Expand All @@ -162,7 +163,7 @@ def search_creators(
verified: bool,
tags: Optional[List[str]],
**params: Any
):
) -> CreatorsResponse:
url = '/v1/creators/search?page={page}&order={order}'
if verified:
url += '&verified={verified}'
Expand All @@ -181,37 +182,37 @@ def search_creators(
)
return self.request(r, **params)

def search_creator(self, username: str, page: int, count: int, order: Order, type: Type, **params):
def search_creator(self, username: str, page: int, count: int, order: Order, type: Type, **params) -> CreatorResponse:
r = Route(
'GET', '/v2/users/{username}/search?page={page}&count={count}&order={order}&type={type}',
username=username, page=page, count=count, order=order.value, type=type.value
)
return self.request(r, **params)

def get_trending_gifs(self):
def get_trending_gifs(self) -> TrendingGifsResponse:
r = Route('GET', '/v2/explore/trending-gifs')
return self.request(r)

# Pic methods

def search_image(self, search_text: str, order: Order, count: int, page: int, **params: Any):
def search_image(self, search_text: str, order: Order, count: int, page: int, **params: Any) -> ImageResponse:
r = Route(
'GET', '/v2/gifs/search?search_text={search_text}&order={order}&count={count}&page={page}&type=i',
search_text=search_text, order=order.value, count=count, page=page
)
return self.request(r, **params)

def get_trending_images(self):
def get_trending_images(self) -> TrendingImagesResponse:
r = Route('GET', '/v2/explore/trending-images')
return self.request(r)

# Tag methods

def get_trending_tags(self):
def get_trending_tags(self) -> TagsResponse:
r = Route('GET', '/v2/search/trending')
return self.request(r)

def get_tag_suggestions(self, query: str):
def get_tag_suggestions(self, query: str) -> List[Dict[str, Union[str, int]]]:
r = Route(
'GET', '/v2/search/suggest?query={query}',
query=query
Expand Down Expand Up @@ -336,7 +337,7 @@ def search_creators(
verified: bool,
tags: Optional[List[str]],
**params: Any
):
) -> Response[CreatorsResponse]:
url = '/v1/creators/search?page={page}&order={order}'
if verified:
url += '&verified={verified}'
Expand All @@ -355,7 +356,7 @@ def search_creators(
)
return self.request(r, **params)

def search_creator(self, username: str, page: int, count: int, order: Order, type: Type, **params):
def search_creator(self, username: str, page: int, count: int, order: Order, type: Type, **params) -> Response[CreatorResponse]:
r = Route(
'GET', '/v2/users/{username}/search?page={page}&count={count}&order={order}&type={type}',
username=username, page=page, count=count, order=order.value, type=type.value
Expand Down
2 changes: 1 addition & 1 deletion redgifs/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ class User:
following: int
gifs: int
name: str
profile_image_url: str
profile_image_url: Optional[str]
profile_url: str
published_collections: Optional[int]
published_gifs: int
Expand Down
13 changes: 7 additions & 6 deletions redgifs/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

import logging
from datetime import datetime
from typing import TYPE_CHECKING, Any, Dict
from typing import TYPE_CHECKING

from .enums import Type
from .utils import _gifs_iter, _images_iter, _users_iter, build_file_url, to_web_url
Expand All @@ -36,6 +36,7 @@
from redgifs.types.feeds import FeedsResponse
from redgifs.types.gif import GifResponse
from redgifs.types.image import ImageResponse
from redgifs.types.user import CreatorResponse, CreatorsResponse

_log = logging.getLogger(__name__)

Expand Down Expand Up @@ -176,7 +177,7 @@ def parse_search_image(searched_for: str, json: ImageResponse) -> SearchResult:
tags=json['tags'],
)

def parse_creators(json: Dict[str, Any]) -> CreatorsResult:
def parse_creators(json: CreatorsResponse) -> CreatorsResult:
_log.debug('Using `parse_creators`')
items = json['items']
return CreatorsResult(
Expand All @@ -186,7 +187,7 @@ def parse_creators(json: Dict[str, Any]) -> CreatorsResult:
total=json['total'],
)

def parse_creator(json: Dict[str, Any], type: Type) -> CreatorResult:
def parse_creator(json: CreatorResponse, type: Type) -> CreatorResult:
_log.debug('Using `parse_creator`')
user = json['users'][0]
return CreatorResult(
Expand All @@ -195,7 +196,7 @@ def parse_creator(json: Dict[str, Any], type: Type) -> CreatorResult:
description=user['description'],
followers=user['followers'],
following=user['following'],
gifs=json['gifs'],
gifs=user['gifs'],
name=user['name'],
profile_image_url=user['profileImageUrl'],
profile_url=user['profileUrl'],
Expand All @@ -219,14 +220,14 @@ def parse_creator(json: Dict[str, Any], type: Type) -> CreatorResult:
GIF(
id=gif['id'],
create_date=datetime.utcfromtimestamp(gif['createDate']),
has_audio=gif['hasAudio'],
has_audio=gif['hasAudio'], # type: ignore - We aren't setting values for ImageInfo
width=gif['width'],
height=gif['height'],
likes=gif['likes'],
tags=gif['tags'],
verified=gif['verified'],
views=gif['views'],
duration=int(gif['duration']) if gif['duration'] is not None else gif['duration'],
duration=gif['duration'], # type: ignore - We aren't setting values for ImageInfo
published=gif['published'],
urls=URL(
sd=gif['urls']['sd'],
Expand Down
6 changes: 3 additions & 3 deletions redgifs/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import asyncio
import yarl
from datetime import datetime
from typing import TYPE_CHECKING, Dict, List, Union
from typing import TYPE_CHECKING, Dict, List

from .models import GIF, URL, Image, User
from .const import REDGIFS_THUMBS_RE
Expand Down Expand Up @@ -132,13 +132,13 @@ def _images_iter(images: List[ImageInfo]) -> List[Image]:
for i in images
]

def _users_iter(users: Union[List[UserInfo], List[GifInfo], List[ImageInfo]]) -> List[User]:
def _users_iter(users: List[UserInfo]) -> List[User]:
return [
User(
# I only had this occurrence once where redgifs did not
# send the response properly and messed up the entire JSON
# response, this is why I have used dict.get() here.
creation_time=datetime.utcfromtimestamp(user.get('creationtime')) if user.get('creationtime') is not None else None, # type: ignore
creation_time=datetime.utcfromtimestamp(user.get('creationtime')) if user.get('creationtime') is not None else None,
description=user.get('description'),
followers=user.get('followers'),
following=user.get('following'),
Expand Down

0 comments on commit 5765501

Please sign in to comment.