Skip to content

Commit

Permalink
Huge Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
raimannma committed May 5, 2023
1 parent eff57d8 commit 50a4473
Show file tree
Hide file tree
Showing 27 changed files with 464 additions and 3,490 deletions.
4 changes: 2 additions & 2 deletions tests/e2e/test_mmr_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

@settings(deadline=None, max_examples=15)
@given(
version=st.sampled_from(["v1", "v2"]),
version=st.sampled_from(["v2"]),
id=st.sampled_from(["ManuelHexe#5777", "jasminaxrose#7024"]),
episode=st.one_of(
st.none(),
Expand Down Expand Up @@ -49,7 +49,7 @@ async def test_get_mmr_details_by_name(

@settings(deadline=None, max_examples=15)
@given(
version=st.sampled_from(["v1", "v2"]),
version=st.sampled_from(["v2"]),
puuid=st.sampled_from(
["ee89b4d9-13d0-5832-8dd7-eb5d8806d918", "930bb0d3-c914-5394-bcf6-0bc81f465bd7"]
),
Expand Down
2 changes: 1 addition & 1 deletion tests/e2e/test_store_offers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


@settings(deadline=None, max_examples=15)
@given(version=st.sampled_from(["v1", "v2"]))
@given(version=st.sampled_from(["v2"]))
@pytest.mark.asyncio
@new_event_loop_decorator
async def test_get_store_offers(version: str):
Expand Down
1 change: 1 addition & 0 deletions tests/unit/endpoints/test_crosshair.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ async def test_get_crosshair_error(

url = f"{Config.BASE_URL}/valorant/{version}/crosshair/generate"

crosshair_id = crosshair_id.lower()
params = {"id": crosshair_id}

responses.add(
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/endpoints/test_mmr_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@


@given(
version=st.sampled_from(["v1", "v2"]),
version=st.sampled_from(["v2"]),
region=st.sampled_from(Config.ALL_REGIONS),
name=st.text(),
tag=st.text(),
Expand Down Expand Up @@ -83,7 +83,7 @@ async def test_get_mmr_details_by_name(


@given(
version=st.sampled_from(["v1", "v2"]),
version=st.sampled_from(["v2"]),
region=st.sampled_from(Config.ALL_REGIONS),
name=st.text(),
tag=st.text(),
Expand Down Expand Up @@ -153,7 +153,7 @@ async def test_get_mmr_details_by_name_error(


@given(
version=st.sampled_from(["v1", "v2"]),
version=st.sampled_from(["v2"]),
region=st.sampled_from(Config.ALL_REGIONS),
puuid=st.uuids(),
filter=st.one_of(st.none(), st.sampled_from(["competitive", "unrated"])),
Expand Down
8 changes: 4 additions & 4 deletions tests/unit/endpoints/test_raw_competitiveupdates.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ async def test_get_raw_competitiveupdates(version: str, puuid: UUID, region: str
status=200,
)

getattr(valo_api, f"get_raw_data_{version}")(
getattr(valo_api, f"get_raw_competitive_updates_data_{version}")(
type=EndpointType.COMPETITIVE_UPDATES, region=region, value=puuid
)
assert len(responses.calls) == 1

getattr(valo_api, "get_raw_data")(
getattr(valo_api, "get_raw_competitive_updates_data")(
version=version,
type=EndpointType.COMPETITIVE_UPDATES,
region=region,
Expand All @@ -51,7 +51,7 @@ async def test_get_raw_competitiveupdates(version: str, puuid: UUID, region: str
f"{url}?region={region}&type=competitiveupdates&value={puuid}",
payload=get_mock_response(f"raw_competitiveupdates_{version}.json"),
)
await getattr(valo_api, f"get_raw_data_{version}_async")(
await getattr(valo_api, f"get_raw_competitive_updates_data_{version}_async")(
type=EndpointType.COMPETITIVE_UPDATES, region=region, value=puuid
)
m.assert_called_once()
Expand All @@ -61,7 +61,7 @@ async def test_get_raw_competitiveupdates(version: str, puuid: UUID, region: str
f"{url}?region={region}&type=competitiveupdates&value={puuid}",
payload=get_mock_response(f"raw_competitiveupdates_{version}.json"),
)
await getattr(valo_api, f"get_raw_data_async")(
await getattr(valo_api, f"get_raw_competitive_updates_data_async")(
version=version,
type=EndpointType.COMPETITIVE_UPDATES,
region=region,
Expand Down
8 changes: 4 additions & 4 deletions tests/unit/endpoints/test_raw_matchdetails.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ async def test_get_raw_matchdetails(version: str, puuid: UUID, region: str):
status=200,
)

getattr(valo_api, f"get_raw_data_{version}")(
getattr(valo_api, f"get_raw_match_details_data_{version}")(
type=EndpointType.MATCH_DETAILS, region=region, value=puuid
)
assert len(responses.calls) == 1

getattr(valo_api, "get_raw_data")(
getattr(valo_api, "get_raw_match_details_data")(
version=version,
type=EndpointType.MATCH_DETAILS,
region=region,
Expand All @@ -52,7 +52,7 @@ async def test_get_raw_matchdetails(version: str, puuid: UUID, region: str):
f"{url}?region={region}&type=matchdetails&value={puuid}",
payload=get_mock_response(f"raw_matchdetails_{version}.json"),
)
await getattr(valo_api, f"get_raw_data_{version}_async")(
await getattr(valo_api, f"get_raw_match_details_data_{version}_async")(
type=EndpointType.MATCH_DETAILS, region=region, value=puuid
)
m.assert_called_once()
Expand All @@ -62,7 +62,7 @@ async def test_get_raw_matchdetails(version: str, puuid: UUID, region: str):
f"{url}?region={region}&type=matchdetails&value={puuid}",
payload=get_mock_response(f"raw_matchdetails_{version}.json"),
)
await getattr(valo_api, "get_raw_data_async")(
await getattr(valo_api, "get_raw_match_details_data_async")(
version=version,
type=EndpointType.MATCH_DETAILS,
region=region,
Expand Down
8 changes: 4 additions & 4 deletions tests/unit/endpoints/test_raw_matchhistory.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ async def test_get_raw_matchhistory(version: str, match_id: UUID, region: str):
status=200,
)

getattr(valo_api, f"get_raw_data_{version}")(
getattr(valo_api, f"get_raw_match_history_data_{version}")(
type=EndpointType.MATCH_HISTORY, region=region, value=match_id
)
assert len(responses.calls) == 1

getattr(valo_api, "get_raw_data")(
getattr(valo_api, "get_raw_match_history_data")(
version=version,
type=EndpointType.MATCH_HISTORY,
region=region,
Expand All @@ -51,7 +51,7 @@ async def test_get_raw_matchhistory(version: str, match_id: UUID, region: str):
f"{url}?region={region}&type=matchhistory&value={match_id}",
payload=get_mock_response(f"raw_matchhistory_{version}.json"),
)
await getattr(valo_api, f"get_raw_data_{version}_async")(
await getattr(valo_api, f"get_raw_match_history_data_{version}_async")(
type=EndpointType.MATCH_HISTORY, region=region, value=match_id
)
m.assert_called_once()
Expand All @@ -61,7 +61,7 @@ async def test_get_raw_matchhistory(version: str, match_id: UUID, region: str):
f"{url}?region={region}&type=matchhistory&value={match_id}",
payload=get_mock_response(f"raw_matchhistory_{version}.json"),
)
await getattr(valo_api, "get_raw_data_async")(
await getattr(valo_api, "get_raw_match_history_data_async")(
version=version,
type=EndpointType.MATCH_HISTORY,
region=region,
Expand Down
8 changes: 4 additions & 4 deletions tests/unit/endpoints/test_raw_mmr.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ async def test_get_raw_mmr(version: str, puuid: UUID, region: str):
status=200,
)

getattr(valo_api, f"get_raw_data_{version}")(
getattr(valo_api, f"get_raw_mmr_data_{version}")(
type=EndpointType.MMR, region=region, value=puuid
)
assert len(responses.calls) == 1

getattr(valo_api, "get_raw_data")(
getattr(valo_api, "get_raw_mmr_data")(
version=version,
type=EndpointType.MMR,
region=region,
Expand All @@ -51,7 +51,7 @@ async def test_get_raw_mmr(version: str, puuid: UUID, region: str):
f"{url}?region={region}&type=mmr&value={puuid}",
payload=get_mock_response(f"raw_mmr_{version}.json"),
)
await getattr(valo_api, f"get_raw_data_{version}_async")(
await getattr(valo_api, f"get_raw_mmr_data_{version}_async")(
type=EndpointType.MMR, region=region, value=puuid
)
m.assert_called_once()
Expand All @@ -61,7 +61,7 @@ async def test_get_raw_mmr(version: str, puuid: UUID, region: str):
f"{url}?region={region}&type=mmr&value={puuid}",
payload=get_mock_response(f"raw_mmr_{version}.json"),
)
await getattr(valo_api, "get_raw_data_async")(
await getattr(valo_api, "get_raw_mmr_data_async")(
version=version,
type=EndpointType.MMR,
region=region,
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/endpoints/test_store_offers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from valo_api.exceptions.valo_api_exception import ValoAPIException


@given(version=st.sampled_from(["v1", "v2"]))
@given(version=st.sampled_from(["v2"]))
@responses.activate
@pytest.mark.asyncio
async def test_get_store_offers(version: str):
Expand Down Expand Up @@ -53,7 +53,7 @@ async def test_get_store_offers(version: str):


@given(
version=st.sampled_from(["v1", "v2"]),
version=st.sampled_from(["v2"]),
error_response=st.sampled_from(get_error_responses("store_offers")),
)
@responses.activate
Expand Down
125 changes: 125 additions & 0 deletions valo_api/endpoint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import json
from typing import (
Awaitable,
Callable,
Dict,
Generic,
Iterable,
Optional,
Tuple,
Type,
TypeVar,
Union,
)

import io
from dataclasses import dataclass

import msgspec
from PIL import Image
from requests import Response
from valo_api.utils.dict_struct import DictStruct

from valo_api.exceptions.valo_api_exception import ValoAPIException
from valo_api.responses.error_response import ErrorResponse
from valo_api.utils.fetch_endpoint import fetch_endpoint, fetch_endpoint_async

R = TypeVar("R")


def response_type(api_type: R):
class APIResponse(DictStruct):
status: int
data: api_type

return APIResponse


@dataclass
class Endpoint(Generic[R]):
path: str
f_name: str
return_type: R
versions: Iterable[str] = ("v1",)
method: str = "GET"
kwargs: Optional[Dict[str, Type]] = None
query_args: Optional[Dict[str, str]] = None
data_response: bool = True

def endpoint_wrappers(
self,
) -> Iterable[Tuple[str, Callable[..., Union[R, Awaitable[R]]]]]:
for version in self.versions:
yield f"{self.f_name}_{version}", self._get_endpoint_wrapper(version)
yield f"{self.f_name}_{version}_async", self._get_endpoint_wrapper(
version, True
)
yield self.f_name, self._get_endpoint_wrapper()
yield f"{self.f_name}_async", self._get_endpoint_wrapper(async_function=True)

def _get_endpoint_wrapper(
self, version: Optional[str] = None, async_function: bool = False
) -> Union[Callable[..., Union[R, Awaitable[R]]]]:
if async_function:

async def wrapper(**kwargs) -> R:
kwargs["version"] = kwargs.get("version", version)
for k, v in self.kwargs.items():
kwargs[k] = kwargs.get(k, "")
return await self._get_endpoint_async(**kwargs)

else:

def wrapper(**kwargs) -> R:
kwargs["version"] = kwargs.get("version", version)
for k, v in self.kwargs.items():
kwargs[k] = kwargs.get(k, "")
return self._get_endpoint(**kwargs)

return wrapper

def build_query_args(self, **kwargs):
formatted_query_args = (
{
k: v.format(**kwargs)
for k, v in self.query_args.items()
if v
}
if self.query_args
else None
)
if formatted_query_args is None:
return {}
filtered_query_args = {
k: str(v).lower() for k, v in formatted_query_args.items() if len(v) > 0 and v.lower() != "none"
}
return filtered_query_args

def _get_endpoint(self, **kwargs) -> R:
response = fetch_endpoint(
self.path,
method=self.method,
query_args=self.build_query_args(**kwargs),
**kwargs,
)
return self.parse_response(response, response.content)

async def _get_endpoint_async(self, **kwargs) -> R:
response, content = await fetch_endpoint_async(
self.path,
method=self.method,
query_args=self.build_query_args(**kwargs),
**kwargs,
)
return self.parse_response(response, content)

def parse_response(self, response: Response, content: bytes) -> R:
if response.ok is False:
error = msgspec.json.decode(content, type=ErrorResponse)
error.headers = dict(response.headers)
raise ValoAPIException(error)
if self.return_type == Image.Image:
return Image.open(io.BytesIO(response.content))
return_type = response_type(self.return_type) if self.data_response else self.return_type
result = msgspec.json.decode(content, type=return_type)
return result.data if self.data_response else result
Loading

0 comments on commit 50a4473

Please sign in to comment.