From 25f4babc0f2e50a667ce53ef9a40d848ae9e8f07 Mon Sep 17 00:00:00 2001 From: Amir Hasan Aref Asl Date: Wed, 1 Jan 2025 16:49:12 +0330 Subject: [PATCH 1/2] remove youtube services --- README.md | 59 ++++---- examples/youtube_seo.py | 35 ----- examples/youtube_suggestions.py | 41 ------ examples/youtube_top_keywords.py | 51 ------- magicalapi/client.py | 10 -- magicalapi/services/__init__.py | 6 - magicalapi/services/youtube_seo_service.py | 36 ----- .../services/youtube_suggestions_service.py | 53 ------- .../services/youtube_top_keywords_service.py | 115 --------------- magicalapi/types/__init__.py | 3 - magicalapi/types/resume_review.py | 2 +- magicalapi/types/youtube_seo.py | 103 ------------- magicalapi/types/youtube_suggestions.py | 33 ----- magicalapi/types/youtube_top_keywords.py | 30 ---- pyproject.toml | 3 + smoke/test_smoke.py | 35 ----- tests/conftest.py | 40 ----- tests/services/test_base_service.py | 39 ++--- tests/types/test_youtube_seo_type.py | 139 ------------------ tests/types/test_youtube_suggestions_type.py | 68 --------- .../types/test_youtube_top_keywords_types.py | 33 ----- 21 files changed, 48 insertions(+), 886 deletions(-) delete mode 100644 examples/youtube_seo.py delete mode 100644 examples/youtube_suggestions.py delete mode 100644 examples/youtube_top_keywords.py delete mode 100644 magicalapi/services/youtube_seo_service.py delete mode 100644 magicalapi/services/youtube_suggestions_service.py delete mode 100644 magicalapi/services/youtube_top_keywords_service.py delete mode 100644 magicalapi/types/youtube_seo.py delete mode 100644 magicalapi/types/youtube_suggestions.py delete mode 100644 magicalapi/types/youtube_top_keywords.py delete mode 100644 tests/types/test_youtube_seo_type.py delete mode 100644 tests/types/test_youtube_suggestions_type.py delete mode 100644 tests/types/test_youtube_top_keywords_types.py diff --git a/README.md b/README.md index 32da93c..183e9a8 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ ## What is [MagicalAPI][website-url]? -MagicalAPI is your AI edge in **content** and **careers**, Your ultimate tool for **YouTube SEO**, **Resume Parsing**, **LinkedIn data** and more. +MagicalAPI is your AI edge in **content** and **careers**, Your ultimate tool for **Resume Parsing**, **LinkedIn data** and more.
@@ -149,44 +149,43 @@ client = AsyncClinet()
-Here is an example of how to get keywords of [Youtube Top Keywords](https://magicalapi.com/services/youtube-keywords) service: +Here is an example of how to parse a resume using [Resume Parser](https://magicalapi.com/resume/) service: ```python import asyncio + from magicalapi.client import AsyncClient +from magicalapi.errors import APIServerError, APIServerTimedout from magicalapi.types.base import ErrorResponse -search_sentence = "chatgpt 4 turbo" # your search sentence to get keywords related to -country = "1" # use get_countries method to see countries codes (Default = 1 : WorlWide) -language = "1000" # use get_languages method to see countries codes (Default = 1000 : English) +resume_url = ( + "https://resume-resource.com/wp-content/uploads/00123-sales-professional-resume.pdf" +) +output_file_name = "resume_parser.json" async def main(): - # the api_key will load from the .env file - async with AsyncClient() as client: - # Get YouTube keywords - keywords_response = await client.youtube_top_keywords.get_keywords( - search_sentence=search_sentence, - country=country, - language=language, - ) - if type(keywords_response) == ErrorResponse: - # got error from API - print("Error :", keywords_response.message) - else: - # got response successfully - print("credits :", keywords_response.usage.credits) - print("keywords count :", len(keywords_response.data.keywords)) - - # save response in JSON file - with open("keywords_response.json", "w") as file: - file.write(keywords_response.model_dump_json(indent=3)) - - - # get languages list - # languages = await client.youtube_top_keywords.get_languages() - # get countries list - # countries = await client.youtube_top_keywords.get_countries() + try: + # the api_key will load from the .env file + async with AsyncClient() as client: + response = await client.resume_parser.get_resume_parser(url=resume_url) + + if isinstance(response, ErrorResponse): + # got error from api + print("Error :", response.message) + else: + # got response successfully + print("credists :", response.usage.credits) + # save response in json file + with open(output_file_name, "w") as file: + file.write(response.model_dump_json(indent=3)) + + print(f"response saved to {output_file_name}") + except (APIServerError, APIServerTimedout) as e: + # handling server errors + print(e) + except Exception as e: + print("An error occurred:", str(e)) asyncio.run(main()) diff --git a/examples/youtube_seo.py b/examples/youtube_seo.py deleted file mode 100644 index 69eedee..0000000 --- a/examples/youtube_seo.py +++ /dev/null @@ -1,35 +0,0 @@ -import asyncio - -from magicalapi.client import AsyncClient -from magicalapi.errors import APIServerError, APIServerTimedout -from magicalapi.types.base import ErrorResponse - -video_url = "https://www.youtube.com/watch?v=PZZI1QXlM80" -output_file_name = "youtube_seo.json" - - -async def main(): - try: - # the api_key will load from the .env file - async with AsyncClient() as client: - response = await client.youtube_seo.get_youtube_seo(url=video_url) - - if isinstance(response, ErrorResponse): - # got error from api - print("Error :", response.message) - else: - # got response successfully - print("credists :", response.usage.credits) - # save response in json file - with open(output_file_name, "w") as file: - file.write(response.model_dump_json(indent=3)) - - print(f"response saved to {output_file_name}") - except (APIServerError, APIServerTimedout) as e: - # handling server errors - print(e) - except Exception as e: - print("An error occurred:", str(e)) - - -asyncio.run(main()) diff --git a/examples/youtube_suggestions.py b/examples/youtube_suggestions.py deleted file mode 100644 index 3dc7a94..0000000 --- a/examples/youtube_suggestions.py +++ /dev/null @@ -1,41 +0,0 @@ -import asyncio - -from magicalapi.client import AsyncClient -from magicalapi.errors import APIServerError, APIServerTimedout -from magicalapi.types.base import ErrorResponse - -prompt_sentence = "How to create a profitable Shopify store" -count = 5 -suggestion_goal = "hashtag" -output_file_name = "youtube_suggestions.json" - - -async def main(): - try: - # the api_key will load from the .env file - async with AsyncClient() as client: - response = await client.youtube_suggestions.get_youtube_suggestions( - prompt_sentence=prompt_sentence, - count=count, - suggestion_goal=suggestion_goal, - ) - - if isinstance(response, ErrorResponse): - # got error from api - print("Error :", response.message) - else: - # got response successfully - print("credists :", response.usage.credits) - # save response in json file - with open(output_file_name, "w") as file: - file.write(response.model_dump_json(indent=3)) - - print(f"response saved to {output_file_name}") - except (APIServerError, APIServerTimedout) as e: - # handling server errors - print(e) - except Exception as e: - print("An error occurred:", str(e)) - - -asyncio.run(main()) diff --git a/examples/youtube_top_keywords.py b/examples/youtube_top_keywords.py deleted file mode 100644 index 204a516..0000000 --- a/examples/youtube_top_keywords.py +++ /dev/null @@ -1,51 +0,0 @@ -import asyncio - -from magicalapi.client import AsyncClient -from magicalapi.errors import APIServerError, APIServerTimedout -from magicalapi.types.base import ErrorResponse - -search_sentence = "movie trailers" -country = "1" -language = "1000" -output_file_name = f"youtube_top_keywords_{search_sentence}.json" - - -async def main(): - try: - # the api_key will load from the .env file - async with AsyncClient() as client: - # get languages and countries list - # languages = await client.youtube_top_keywords.get_languages() - # countries = await client.youtube_top_keywords.get_countries() - # print("Languauges :") - # print(languages) - # print("Countries : ") - # print(countries) - - # get youtube keywords - response = await client.youtube_top_keywords.get_keywords( - search_sentence=search_sentence, - country=country, - language=language, - ) - if isinstance(response, ErrorResponse): - # got error from api - print("Error :", response.message) - else: - # got response successfully - print("credists :", response.usage.credits) - print("keywords count :", len(response.data.keywords)) - - # save response in json file - with open(output_file_name, "w") as file: - file.write(response.model_dump_json(indent=3)) - - print(f"response saved to {output_file_name}") - except (APIServerError, APIServerTimedout) as e: - # handling server errors - print(e) - except Exception as e: - print("An error occurred:", str(e)) - - -asyncio.run(main()) diff --git a/magicalapi/client.py b/magicalapi/client.py index 17e483e..51e9bfc 100644 --- a/magicalapi/client.py +++ b/magicalapi/client.py @@ -7,9 +7,6 @@ ProfileDataService, ResumeParserService, ResumeScoreService, - YoutubeSeoService, - YoutubeSuggestionsService, - YoutubeTopKeywordsService, ) from magicalapi.services.resume_review_service import ResumeReviewService from magicalapi.settings import settings @@ -58,18 +55,11 @@ def __init__(self, api_key: str | None = None) -> None: logger.debug("httpx client created") # create service - self.youtube_top_keywords = YoutubeTopKeywordsService( - httpx_client=self._httpx_client - ) self.profile_data = ProfileDataService(httpx_client=self._httpx_client) self.company_data = CompanyDataService(httpx_client=self._httpx_client) - self.youtube_seo = YoutubeSeoService(httpx_client=self._httpx_client) self.resume_parser = ResumeParserService(httpx_client=self._httpx_client) self.resume_score = ResumeScoreService(httpx_client=self._httpx_client) self.resume_review = ResumeReviewService(httpx_client=self._httpx_client) - self.youtube_suggestions = YoutubeSuggestionsService( - httpx_client=self._httpx_client - ) logger.debug(f"async client created : {self}") diff --git a/magicalapi/services/__init__.py b/magicalapi/services/__init__.py index 5fa92f1..1423750 100644 --- a/magicalapi/services/__init__.py +++ b/magicalapi/services/__init__.py @@ -3,17 +3,11 @@ from .resume_parser_service import ResumeParserService from .resume_review_service import ResumeReviewService from .resume_score_service import ResumeScoreService -from .youtube_seo_service import YoutubeSeoService -from .youtube_suggestions_service import YoutubeSuggestionsService -from .youtube_top_keywords_service import YoutubeTopKeywordsService __all__ = [ - "YoutubeTopKeywordsService", "ProfileDataService", "CompanyDataService", - "YoutubeSeoService", "ResumeParserService", "ResumeScoreService", "ResumeReviewService", - "YoutubeSuggestionsService", ] diff --git a/magicalapi/services/youtube_seo_service.py b/magicalapi/services/youtube_seo_service.py deleted file mode 100644 index 43972a1..0000000 --- a/magicalapi/services/youtube_seo_service.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -this file stores the implementation of youtube seo Service. - -""" - -from pydantic import BaseModel - -from magicalapi.types.base import ErrorResponse -from magicalapi.types.schemas import HttpResponse -from magicalapi.types.youtube_seo import YoutubeSeoResponse - -from .base_service import BaseService - - -class YoutubeSeoService(BaseService): - service_path = "youtube-seo" - - async def get_youtube_seo(self, url: str) -> YoutubeSeoResponse | ErrorResponse: - """this method sends request to youtube seo service in magicalAPI. - - url (``str``): - the URL of youtube video that you want to get it's seo data. - - """ - request_body = { - "video_url": url, - } - response = await self._send_post_request(self.service_path, data=request_body) - return self.validate_response( - response=response, validate_model=YoutubeSeoResponse - ) - - def validate_response( - self, response: HttpResponse, validate_model: type[BaseModel] - ) -> YoutubeSeoResponse | ErrorResponse: - return super().validate_response(response, validate_model) diff --git a/magicalapi/services/youtube_suggestions_service.py b/magicalapi/services/youtube_suggestions_service.py deleted file mode 100644 index 16b57bb..0000000 --- a/magicalapi/services/youtube_suggestions_service.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -this file stores the implementation of youtube suggestions Service. -https://magicalapi.com/services/youtube-suggestions - -""" - -from typing import Literal - -from pydantic import BaseModel - -from magicalapi.types.base import ErrorResponse -from magicalapi.types.schemas import HttpResponse -from magicalapi.types.youtube_suggestions import YoutubeSuggestionsResponse - -from .base_service import BaseService - - -class YoutubeSuggestionsService(BaseService): - service_path = "youtube-suggestions" - - async def get_youtube_suggestions( - self, - prompt_sentence: str, - count: int, - suggestion_goal: Literal["caption", "title", "hashtag", "tag"], - ) -> YoutubeSuggestionsResponse | ErrorResponse: - """this method sends request to youtube suggestions service in magicalAPI. - https://magicalapi.com/services/youtube-suggestions - - prompt_sentence (``str``): - your prompt sentence to get suggestions based on it - - count (``int``) - the number of results - - suggestion_goal (``str``): - the goal that you want to get suggestions about it, one of `caption`, `title`, `hashtag`, `tag` - - """ - request_body = { - "prompt_sentence": prompt_sentence, - "count": count, - "suggestion_goal": suggestion_goal, - } - response = await self._send_post_request(self.service_path, data=request_body) - return self.validate_response( - response=response, validate_model=YoutubeSuggestionsResponse - ) - - def validate_response( - self, response: HttpResponse, validate_model: type[BaseModel] - ) -> YoutubeSuggestionsResponse | ErrorResponse: - return super().validate_response(response, validate_model) diff --git a/magicalapi/services/youtube_top_keywords_service.py b/magicalapi/services/youtube_top_keywords_service.py deleted file mode 100644 index 39e610f..0000000 --- a/magicalapi/services/youtube_top_keywords_service.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -this file stores the implementation of Youtube Top Keywords Service. -https://magicalapi.com/services/youtube-keywords - -""" - -from typing import overload - -from pydantic import BaseModel - -from magicalapi.types.base import ErrorResponse -from magicalapi.types.company_data import CountriesResponse, LanguagesResponse -from magicalapi.types.schemas import HttpResponse -from magicalapi.types.youtube_top_keywords import YoutubeTopKeywordsResponse - -from .base_service import BaseService - - -class YoutubeTopKeywordsService(BaseService): - service_path = "youtube-keywords" - - @overload - def validate_response( - self, - response: HttpResponse, - validate_model: type[YoutubeTopKeywordsResponse], - ) -> YoutubeTopKeywordsResponse | ErrorResponse: - pass - - @overload - def validate_response( - self, - response: HttpResponse, - validate_model: type[CountriesResponse], - ) -> CountriesResponse | ErrorResponse: - pass - - @overload - def validate_response( - self, - response: HttpResponse, - validate_model: type[LanguagesResponse], - ) -> LanguagesResponse | ErrorResponse: - pass - - @overload - def validate_response( - self, response: HttpResponse, validate_model: type[BaseModel] - ) -> ( - YoutubeTopKeywordsResponse - | LanguagesResponse - | CountriesResponse - | ErrorResponse - ): - pass - - def validate_response( - self, response: HttpResponse, validate_model: type[BaseModel] - ) -> ( - YoutubeTopKeywordsResponse - | LanguagesResponse - | CountriesResponse - | ErrorResponse - ): - return super().validate_response(response, validate_model) - - async def get_keywords( - self, search_sentence: str, country: str, language: str - ) -> YoutubeTopKeywordsResponse | ErrorResponse: - """this method sends request to Youtube Top Keywords service in magicalAPI. - https://magicalapi.com/services/youtube-keywords - - country (``str``): - the country code of the country that you want to get keywords from. - - language (``str``): - the language code of the language that you want to get keywords from. - - request_id (``str``, *optional*): - the request_id if you have sent a request before and want to get response of it. - """ - request_body = { - "search_sentence": search_sentence, - "country": country, - "language": language, - } - - response = await self._send_post_request("/youtube-keywords", data=request_body) - return self.validate_response( - response=response, validate_model=YoutubeTopKeywordsResponse - ) - - async def get_countries(self) -> CountriesResponse | ErrorResponse: - """this method retrives the supported - countries list for Youtube Top Keywords service in magicalAPI. - https://magicalapi.com/services/youtube-keywords - - """ - # get request - response = await self._send_get_request(self.service_path + "/countries") - return self.validate_response( - response=response, validate_model=CountriesResponse - ) - - async def get_languages(self) -> LanguagesResponse | ErrorResponse: - """this method retrives the supported - languages list for Youtube Top Keywords service in magicalAPI. - https://magicalapi.com/services/youtube-keywords - - """ - # get request - response = await self._send_get_request(self.service_path + "/languages") - return self.validate_response( - response=response, validate_model=LanguagesResponse - ) diff --git a/magicalapi/types/__init__.py b/magicalapi/types/__init__.py index 04c3a8b..5c3a051 100644 --- a/magicalapi/types/__init__.py +++ b/magicalapi/types/__init__.py @@ -1,11 +1,8 @@ from .base import ErrorResponse from .profile_data import Profile, ProfileDataResponse -from .youtube_top_keywords import KeywordIdea, YoutubeTopKeywordsResponse __all__ = [ "ErrorResponse", - "YoutubeTopKeywordsResponse", - "KeywordIdea", "ProfileDataResponse", "Profile", ] diff --git a/magicalapi/types/resume_review.py b/magicalapi/types/resume_review.py index fbbc9bf..338dd61 100644 --- a/magicalapi/types/resume_review.py +++ b/magicalapi/types/resume_review.py @@ -1,5 +1,5 @@ """ -types schem of youtube seo service +types schem of resume review service """ diff --git a/magicalapi/types/youtube_seo.py b/magicalapi/types/youtube_seo.py deleted file mode 100644 index 79b2c12..0000000 --- a/magicalapi/types/youtube_seo.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -types schem of youtube seo service - -""" - -from __future__ import annotations - -from datetime import datetime -from typing import Literal - -from pydantic import BaseModel, HttpUrl - -from magicalapi.types.base import BaseResponse - - -class YoutubeAPI: - # youtube api video response schema - - class Thumbnail(BaseModel): - url: HttpUrl - width: int - height: int - - class Thumbnails(BaseModel): - default: YoutubeAPI.Thumbnail - medium: YoutubeAPI.Thumbnail - high: YoutubeAPI.Thumbnail - standard: YoutubeAPI.Thumbnail | None = None - maxres: YoutubeAPI.Thumbnail | None = None - - class Localized(BaseModel): - title: str - description: str - - class Snippet(BaseModel): - publishedAt: datetime - channelId: str - title: str - description: str - thumbnails: YoutubeAPI.Thumbnails - channelTitle: str - categoryId: str - liveBroadcastContent: str - defaultLanguage: str | None = None - defaultAudioLanguage: str | None = None - tags: list[str] - - class contentDetails(BaseModel): - duration: str - definition: Literal["hd", "sd"] - # TODO ensure empty always - # contentRating: - - class statistics(BaseModel): - viewCount: int - likeCount: int - favoriteCount: int - commentCount: int | None - - class VideoItem(BaseModel): - kind: str - etag: str - id: str - snippet: YoutubeAPI.Snippet - contentDetails: YoutubeAPI.contentDetails - statistics: YoutubeAPI.statistics - - class VideoDetails(BaseModel): - kind: str - etag: str - # TODO keep only the first item video - items: list[YoutubeAPI.VideoItem] - - -class SeoItem(BaseModel): - pros: list[str] - cons: list[str] - - -class SeoItems(BaseModel): - title: SeoItem - description: SeoItem - tags: SeoItem - video_quality: SeoItem - comments: SeoItem - - -class LongVideoSeoItems(SeoItems): - thumbnail: SeoItem - - -class ShortVideoSeoItems(SeoItems): - pass - - -class YoutubeSeo(BaseModel): - score: int - result: LongVideoSeoItems | ShortVideoSeoItems - details: YoutubeAPI.VideoDetails - - -class YoutubeSeoResponse(BaseResponse): - data: YoutubeSeo diff --git a/magicalapi/types/youtube_suggestions.py b/magicalapi/types/youtube_suggestions.py deleted file mode 100644 index 2ff6d7a..0000000 --- a/magicalapi/types/youtube_suggestions.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -types schem of resume score service -https://magicalapi.com/services/resume-score -""" - -from __future__ import annotations - -from .base import BaseModelValidated, BaseResponse - - -class Captions(BaseModelValidated): - captions: list[str] - - -class Titles(BaseModelValidated): - titles: list[str] - - -class Hashtags(BaseModelValidated): - hashtags: list[str] - - -class Keywords(BaseModelValidated): - keywords: list[str] - - -class YoutubeSuggestionsResponse(BaseResponse): - """ - the main resposne schema for resume score service - https://magicalapi.com/services/resume-score - """ - - data: Captions | Titles | Hashtags | Keywords diff --git a/magicalapi/types/youtube_top_keywords.py b/magicalapi/types/youtube_top_keywords.py deleted file mode 100644 index 830338c..0000000 --- a/magicalapi/types/youtube_top_keywords.py +++ /dev/null @@ -1,30 +0,0 @@ -from pydantic import BaseModel - -from .base import BaseResponse - - -class KeywordIdeaMonth(BaseModel): - month: str - year: int - monthly_searches: int - - -class KeywordIdea(BaseModel): - keyword: str - search_volume: int - competition: str - competition_index: int - low_top_of_page_bid_micros: int - high_top_of_page_bid_micros: int - average_cpc: str - monthly_search: list[KeywordIdeaMonth] - - -class Keywords(BaseModel): - keywords: list[KeywordIdea] - - -class YoutubeTopKeywordsResponse(BaseResponse): - """respone model of profile data service""" - - data: Keywords diff --git a/pyproject.toml b/pyproject.toml index a3512d8..9d5fb23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,6 +64,9 @@ allow-direct-references = true [tool.hatch.build.targets.wheel] packages = ["magicalapi"] +[tool.rye.scripts] +smoke = { cmd = "pytest -vs smoke", env-file = ".env"} +test = { cmd = "pytest -vs tests"} [tool.pytest.ini_options] diff --git a/smoke/test_smoke.py b/smoke/test_smoke.py index c9150c2..91eaf48 100644 --- a/smoke/test_smoke.py +++ b/smoke/test_smoke.py @@ -17,9 +17,6 @@ from magicalapi.types.resume_parser import ResumeParserResponse from magicalapi.types.resume_review import ResumeReviewResponse from magicalapi.types.resume_score import ResumeScoreResponse -from magicalapi.types.youtube_seo import YoutubeSeoResponse -from magicalapi.types.youtube_suggestions import YoutubeSuggestionsResponse -from magicalapi.types.youtube_top_keywords import YoutubeTopKeywordsResponse @pytest_asyncio.fixture(scope="function") @@ -100,35 +97,3 @@ async def test_resume_score(client: AsyncClient): ) assert isinstance(response, ResumeScoreResponse) - - -@pytest.mark.asyncio -async def test_youtube_seo(client: AsyncClient): - # test api returns 200 and correct response schema - response = await client.youtube_seo.get_youtube_seo( - url="https://www.youtube.com/watch?v=PZZI1QXlM80" - ) - - assert isinstance(response, YoutubeSeoResponse) - - -@pytest.mark.asyncio -async def test_youtube_suggestions(client: AsyncClient): - # test api returns 200 and correct response schema - response = await client.youtube_suggestions.get_youtube_suggestions( - prompt_sentence="How to create a profitable Shopify store", - count=5, - suggestion_goal="hashtag", - ) - - assert isinstance(response, YoutubeSuggestionsResponse) - - -@pytest.mark.asyncio -async def test_youtube_keywords(client: AsyncClient): - # test api returns 200 and correct response schema - response = await client.youtube_top_keywords.get_keywords( - search_sentence="movie trailers", country="1", language="1000" - ) - - assert isinstance(response, YoutubeTopKeywordsResponse) diff --git a/tests/conftest.py b/tests/conftest.py index 3581b6a..5514a01 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,46 +8,6 @@ Faker.seed() -@pytest.fixture(scope="function") -def youtube_keyword(): - # create a sample profile data dictionary - fake = Faker(locale="en") - MONTH_LIST = [ - "JANUARY", - "FEBRUARY", - "MARCH", - "APRIL", - "MAY", - "JUNE", - "JULY", - "AUGUST", - "SEPTEMBER", - "OCTOBER", - "NOVEMBER", - "DECEMBER", - ] - keyword = { - "keyword": fake.text(max_nb_chars=15), - "search_volume": randint(1000, 1000000), - "competition": choice(("LOW", "MEDIUM", "HIGH")), - "competition_index": randint(0, 100), - "low_top_of_page_bid_micros": randint(0, 10**7), - "high_top_of_page_bid_micros": randint(0, 10**7), - "average_cpc": f"${random.random()}", - "monthly_search": [ - { - "month": month, - "year": randint(2000, 2023), - "monthly_searches": randint(1000, 1000000), - } - for month in MONTH_LIST - ], - } - - yield keyword - del keyword - - @pytest.fixture(scope="function") def resume_data(): # sample data of resume parser service diff --git a/tests/services/test_base_service.py b/tests/services/test_base_service.py index 9c16ba4..1ee8d81 100644 --- a/tests/services/test_base_service.py +++ b/tests/services/test_base_service.py @@ -8,11 +8,8 @@ from magicalapi.errors import APIServerError, APIServerTimedout from magicalapi.services.base_service import BaseService from magicalapi.types.base import ErrorResponse +from magicalapi.types.resume_score import ResumeScore, ResumeScoreResponse from magicalapi.types.schemas import HttpResponse -from magicalapi.types.youtube_top_keywords import ( - KeywordIdea, - YoutubeTopKeywordsResponse, -) @pytest_asyncio.fixture(scope="function") @@ -68,38 +65,32 @@ async def test_base_service_request_timed_out(httpxclient: httpx.AsyncClient): await base_service._send_get_request(path="https://httpbin.org/delay/6") -def test_base_service_validating_response( - httpxclient: httpx.AsyncClient, youtube_keyword: KeywordIdea -): +def test_base_service_validating_response(httpxclient: httpx.AsyncClient): # test validating base service valida_response method base_service = BaseService(httpxclient) # fake response fake_json_response = { - "data": {"keywords": [youtube_keyword]}, + "data": {"score": 10, "reason": "some reason"}, "usage": {"credits": randint(1, 200)}, } - # test validating youtube top keywords validation + # test validating resume score keywords validation # 200 response fake_response = HttpResponse(text=json.dumps(fake_json_response), status_code=200) - assert ( - type( - base_service.validate_response( - response=fake_response, validate_model=YoutubeTopKeywordsResponse - ) - ) - == YoutubeTopKeywordsResponse + assert isinstance( + base_service.validate_response( + response=fake_response, validate_model=ResumeScoreResponse + ), + ResumeScoreResponse, ) # 404 response fake_json_response = {"usage": {"credits": 0}, "message": "request not found !"} fake_response = HttpResponse(text=json.dumps(fake_json_response), status_code=404) - assert ( - type( - base_service.validate_response( - response=fake_response, validate_model=YoutubeTopKeywordsResponse - ) - ) - == ErrorResponse + assert isinstance( + base_service.validate_response( + response=fake_response, validate_model=ResumeScoreResponse + ), + ErrorResponse, ) @@ -110,5 +101,5 @@ def test_base_service_validating_response_raise_error(httpxclient: httpx.AsyncCl fake_response = HttpResponse(text="Internal Server Error!", status_code=500) with pytest.raises(APIServerError): base_service.validate_response( - response=fake_response, validate_model=YoutubeTopKeywordsResponse + response=fake_response, validate_model=ResumeScoreResponse ) diff --git a/tests/types/test_youtube_seo_type.py b/tests/types/test_youtube_seo_type.py deleted file mode 100644 index 2acc48b..0000000 --- a/tests/types/test_youtube_seo_type.py +++ /dev/null @@ -1,139 +0,0 @@ -from random import choice, randint -from uuid import uuid4 - -import pytest -from faker import Faker -from pydantic import ValidationError - -from magicalapi.types.youtube_seo import YoutubeSeoResponse - -Faker.seed() - - -@pytest.fixture(scope="function") -def youtube_seo_data(): # type: ignore - # test data for youtube seo - fake = Faker(locale="en") - _video_id = str(uuid4()) - youtube_seo = { # type: ignore - "score": 41, - "result": { - "title": { - "pros": [], - "cons": [fake.text()], - }, - "description": { - "pros": [], - "cons": [fake.text(), fake.text(), fake.text()], - }, - "tags": { - "pros": [], - "cons": [fake.text()], - }, - "comments": { - "pros": [], - "cons": [fake.text()], - }, - "video_quality": { - "pros": [ - fake.text(), - ], - "cons": [], - }, - "thumbnail": { - "pros": [fake.text()], - "cons": [], - }, - }, - "details": { - "kind": "youtube#videoListResponse", - "etag": "dKkUgpwMfKcMUUXnKYiyXvsCcAA", - "items": [ - { - "kind": "youtube#video", - "etag": str(uuid4()), - "id": _video_id, - "snippet": { - "publishedAt": fake.date_time_this_year().strftime("%FT%TZ"), - "channelId": str(uuid4()), - "title": fake.text(max_nb_chars=100), - "description": fake.text(), - "thumbnails": { - "default": { - "url": f"https://i.ytimg.com/vi/{_video_id}/mqdefault.jpg", - "width": 120, - "height": 90, - }, - "medium": { - "url": f"https://i.ytimg.com/vi/{_video_id}/mqdefault.jpg", - "width": 320, - "height": 180, - }, - "high": { - "url": f"https://i.ytimg.com/vi/{_video_id}/hqdefault.jpg", - "width": 480, - "height": 360, - }, - }, - "channelTitle": fake.name(), - "categoryId": str(randint(1, 40)), - "liveBroadcastContent": "none", - "defaultLanguage": "en", - "localized": { - "title": fake.text(max_nb_chars=100), - "description": fake.text(), - }, - "defaultAudioLanguage": "en", - "tags": [fake.text(max_nb_chars=10) for _ in range(1, 5)], - }, - "contentDetails": { - "duration": f"PT{randint(0,59)}M{randint(0,59)}S", - "dimension": "2d", - "definition": choice(("hd", "sd")), - "caption": choice(("true", "false")), - "licensedContent": choice((True, False)), - "projection": "rectangular", - }, - "status": { - "uploadStatus": "processed", - "privacyStatus": "public", - "license": "youtube", - "embeddable": choice((True, False)), - "publicStatsViewable": choice((True, False)), - "madeForKids": choice((True, False)), - }, - "statistics": { - "viewCount": str(randint(1, 1000000)), - "likeCount": str(randint(1, 1000000)), - "favoriteCount": str(randint(1, 1000000)), - # "commentCount": str(randint(1, 1000000)), - "commentCount": None, # test no comment count - }, - } - ], - "pageInfo": {"totalResults": 1, "resultsPerPage": 1}, - }, - } - - yield youtube_seo - - del youtube_seo - - -def test_youtube_seo_validate_type(youtube_seo_data): - # test validating youtube_seo response type - response = {"data": youtube_seo_data, "usage": {"credits": randint(10, 500)}} - - assert type(YoutubeSeoResponse.model_validate(response)) == YoutubeSeoResponse - - -def test_youtube_seo_validate_type_failing(youtube_seo_data): - # test validating youtube_seo response type must fail - # make data schema invalid - del youtube_seo_data["score"] - youtube_seo_data["details"]["items"] = {} - - response = {"data": youtube_seo_data, "usage": {"credits": randint(10, 500)}} - - with pytest.raises(ValidationError): - YoutubeSeoResponse.model_validate(response) diff --git a/tests/types/test_youtube_suggestions_type.py b/tests/types/test_youtube_suggestions_type.py deleted file mode 100644 index d030e85..0000000 --- a/tests/types/test_youtube_suggestions_type.py +++ /dev/null @@ -1,68 +0,0 @@ -from random import randint - -import pytest -from faker import Faker - -from magicalapi.types.youtube_suggestions import YoutubeSuggestionsResponse - -Faker.seed() - - -@pytest.fixture(scope="function") -def captions(): - fake = Faker(locale="en") - captions = {"captions": [fake.text() for _ in range(5)]} - - yield captions - - del captions - - -@pytest.fixture(scope="function") -def titles(): - fake = Faker(locale="en") - titles = {"titles": [fake.text(max_nb_chars=80) for _ in range(5)]} - - yield titles - - del titles - - -@pytest.fixture(scope="function") -def hashtags(): - fake = Faker(locale="en") - hashtags = {"hashtags": [fake.text(max_nb_chars=10) for _ in range(5)]} - - yield hashtags - - del hashtags - - -@pytest.fixture(scope="function") -def keywords(): - fake = Faker(locale="en") - keywords = {"keywords": [fake.text(max_nb_chars=10) for _ in range(5)]} - - yield keywords - - del keywords - - -def test_youtube_suggestions_validate_type(captions, titles, hashtags, keywords): - # test validating youtube_suggestions response type - - responses = ( - {"data": captions, "usage": {"credits": randint(10, 500)}}, - {"data": titles, "usage": {"credits": randint(10, 500)}}, - {"data": hashtags, "usage": {"credits": randint(10, 500)}}, - {"data": keywords, "usage": {"credits": randint(10, 500)}}, - ) - - # check all suggestion goals - assert all( - [ - type(YoutubeSuggestionsResponse.model_validate(response)) - == YoutubeSuggestionsResponse - for response in responses - ] - ) diff --git a/tests/types/test_youtube_top_keywords_types.py b/tests/types/test_youtube_top_keywords_types.py deleted file mode 100644 index 8ae3862..0000000 --- a/tests/types/test_youtube_top_keywords_types.py +++ /dev/null @@ -1,33 +0,0 @@ -from random import randint - -import pytest -from pydantic import ValidationError - -from magicalapi.types.youtube_top_keywords import ( - KeywordIdea, - YoutubeTopKeywordsResponse, -) - - -@pytest.mark.dependency() -def test_youtube_top_keywords_type(youtube_keyword: KeywordIdea): - try: - # validating keywords - KeywordIdea.model_validate( - obj=youtube_keyword, - ) - - except ValidationError as exc: - assert False, "validating youtube_top_keywords type failed : " + str(exc) - - -@pytest.mark.dependency(depends=["test_youtube_top_keywords_type"]) -def test_youtube_top_keywords_response_type(youtube_keyword: KeywordIdea): - try: - response_schema = { - "data": {"keywords": [youtube_keyword]}, - "usage": {"credits": randint(1, 200)}, - } - YoutubeTopKeywordsResponse.model_validate(response_schema) - except ValidationError as exc: - assert False, "validating youtube_top_keywords response failed : " + str(exc) From c6d05b41fe691032785b489eb4c3d4bc1faeb1e8 Mon Sep 17 00:00:00 2001 From: Amir Hasan Aref Asl Date: Wed, 1 Jan 2025 17:26:26 +0330 Subject: [PATCH 2/2] update logo on README and update version to 1.2 --- README.md | 6 +++--- docs/logo.jpg | Bin 7913 -> 0 bytes docs/logo.png | Bin 4813 -> 87790 bytes pyproject.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 docs/logo.jpg diff --git a/README.md b/README.md index 183e9a8..1c34095 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@
- Logo + Logo

MagicalAPI Python Client

@@ -34,8 +34,8 @@ - View Demo - · + + Report Bug · Request Feature diff --git a/docs/logo.jpg b/docs/logo.jpg deleted file mode 100644 index 949ca8a5f6637cbcafc0a37e4f318c302419b5e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7913 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