Skip to content

Commit eb905d1

Browse files
committed
validate datatype names
1 parent 2d42120 commit eb905d1

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

src/lpdb/async_session/async_session.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from datetime import date
22
from http import HTTPStatus
33
from types import TracebackType
4-
from typing import Any, Literal, Optional
4+
from typing import Any, Literal, Optional, override
55

66
import aiohttp
77

@@ -78,6 +78,8 @@ async def make_request(
7878
order: Optional[list[tuple[str, Literal["asc", "desc"]]]] = None,
7979
groupby: Optional[list[tuple[str, Literal["asc", "desc"]]]] = None,
8080
) -> list[dict[str, Any]]:
81+
if not AbstractLpdbSession._validate_datatype_name(lpdb_datatype):
82+
raise ValueError(f'Invalid LPDB data type: "{lpdb_datatype}"')
8183
async with self.__session.get(
8284
lpdb_datatype,
8385
headers=self._get_header(),

src/lpdb/session.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from abc import abstractmethod, ABC
22
from datetime import date
33
from http import HTTPStatus
4-
from typing import Any, Final, Literal, NotRequired, Optional, Required, TypedDict
4+
from typing import Any, Final, Literal, NotRequired, Optional, override, Required, TypedDict, TypeGuard
55
import re
66
import warnings
77

@@ -11,6 +11,8 @@
1111

1212
__all__ = ["LpdbError", "LpdbWarning", "LpdbSession"]
1313

14+
type LpdbDataType = Literal["broadcasters", "company", "datapoint", "externalmedialink", "match", "placement", "player", "series", "squadplayer", "standingsentry", "standingstable", "team", "tournament", "transfer"]
15+
1416

1517
class LpdbResponse(TypedDict):
1618
"""
@@ -54,6 +56,23 @@ class AbstractLpdbSession(ABC):
5456

5557
BASE_URL: Final[str] = "https://api.liquipedia.net/api/v3/"
5658

59+
__DATA_TYPES: Final[set[str]] = {
60+
"broadcasters",
61+
"company",
62+
"datapoint",
63+
"externalmedialink",
64+
"match",
65+
"placement",
66+
"player",
67+
"series",
68+
"squadplayer",
69+
"standingsentry",
70+
"standingstable",
71+
"team",
72+
"tournament",
73+
"transfer",
74+
}
75+
5776
__api_key: str
5877

5978
def __init__(self, api_key: str):
@@ -66,6 +85,10 @@ def _get_header(self) -> dict[str, str]:
6685
"accept-encoding": "gzip",
6786
}
6887

88+
@staticmethod
89+
def _validate_datatype_name(lpdb_datatype: str) -> TypeGuard[LpdbDataType]:
90+
return lpdb_datatype in AbstractLpdbSession.__DATA_TYPES
91+
6992
@staticmethod
7093
@abstractmethod
7194
def get_wikis() -> set[str]:
@@ -179,7 +202,7 @@ def _parse_params(
179202
if isinstance(wiki, str):
180203
parameters["wiki"] = wiki
181204
elif isinstance(wiki, list):
182-
parameters["wiki"] = "|".join(wiki)
205+
parameters["wiki"] = ", ".join(wiki)
183206
else:
184207
raise TypeError()
185208
parameters["limit"] = min(limit, 1000)
@@ -239,7 +262,7 @@ def __handle_response(response: requests.Response) -> list[dict[str, Any]]:
239262

240263
def make_request(
241264
self,
242-
lpdb_datatype,
265+
lpdb_datatype: str,
243266
wiki: str | list[str],
244267
limit: int = 20,
245268
offset: int = 0,
@@ -248,6 +271,8 @@ def make_request(
248271
order: Optional[list[tuple[str, Literal["asc", "desc"]]]] = None,
249272
groupby: Optional[list[tuple[str, Literal["asc", "desc"]]]] = None,
250273
) -> list[dict[str, Any]]:
274+
if not AbstractLpdbSession._validate_datatype_name(lpdb_datatype):
275+
raise ValueError(f'Invalid LPDB data type: "{lpdb_datatype}"')
251276
lpdb_response = requests.get(
252277
AbstractLpdbSession.BASE_URL + lpdb_datatype,
253278
headers=self._get_header(),

0 commit comments

Comments
 (0)