Contains the main client class for interacting with the Luduvo API.
Client
Represents a Luduvo Client.
Attributes:
| Name |
Type |
Description |
requests |
Requests
|
The requests object, which is used to send requests to Luduvo endpoints.
|
url_generator |
URLGenerator
|
The URL generator object, which is used to generate URLs to send requests to endpoints.
|
Source code in luduvo/client.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 | class Client:
"""Represents a Luduvo Client.
Attributes:
requests: The requests object, which is used to send requests to Luduvo endpoints.
url_generator: The URL generator object, which is used to generate URLs to send requests to endpoints.
"""
def __init__(self, base_url="luduvo.com"):
"""
Args:
base_url (str, optional): The base URL for the Luduvo API.
"""
logger.debug("Initializing Client(base_url=%s)", base_url)
self._url_generator: URLGenerator = URLGenerator(base_url=base_url)
self._requests: Requests = Requests()
self.url_generator: URLGenerator = self._url_generator
self.requests: Requests = self._requests
def __repr__(self):
return f"<{self.__class__.__name__}>"
# --------------------------
# API Endpoints
# --------------------------
async def get_user(self, user_id: int) -> User:
"""
Gets a user with the specified user ID.
Arguments:
user_id: A Luduvo user ID.
Returns:
A user object.
"""
logger.debug(f"Fetching user with ID: {user_id}")
try:
user_response = await self._requests.get(
url=self.url_generator.get_url(f"users/{user_id}/profile", "api")
)
except NotFound as exception:
logger.error(f"User not found: {user_id}")
raise UserNotFound(
message="Invalid user.", response=exception.response
) from None
user_data = user_response.json()
logger.debug(f"Successfully retrieved user data for ID: {user_id}")
return User(client=self, data=user_data)
async def get_user_by_username(
self, username: str, expand: bool = True
) -> User | PartialUser:
"""
Gets a user with the specified username.
Arguments:
username: A Luduvo username.
expand: Whether to return a User (2 requests) rather than a PartialUser (1 request)
Returns:
A User or PartialUser depending on the expand argument.
"""
logger.debug(f"Fetching user with username: {username}")
try:
user_response = await self._requests.get(
url=self.url_generator.get_url(f"users?q={username}", "api")
)
except NotFound as exception:
logger.error(f"User not found: {username}")
raise UserNotFound(
message="Invalid user.", response=exception.response
) from None
user_data = user_response.json()
if len(user_data) == 0:
logger.error(f"User not found: {username}")
raise UserNotFound(message="Invalid user.")
user_info = user_data[0]
if expand:
logger.debug(f"Expanding user data for username: {username}")
return await self.get_user(user_info["id"])
return PartialUser(client=self, data=user_info)
|
__init__(base_url='luduvo.com')
Parameters:
| Name |
Type |
Description |
Default |
base_url
|
str
|
The base URL for the Luduvo API.
|
'luduvo.com'
|
Source code in luduvo/client.py
21
22
23
24
25
26
27
28
29
30
31
32 | def __init__(self, base_url="luduvo.com"):
"""
Args:
base_url (str, optional): The base URL for the Luduvo API.
"""
logger.debug("Initializing Client(base_url=%s)", base_url)
self._url_generator: URLGenerator = URLGenerator(base_url=base_url)
self._requests: Requests = Requests()
self.url_generator: URLGenerator = self._url_generator
self.requests: Requests = self._requests
|
get_user(user_id)
async
Gets a user with the specified user ID.
Parameters:
| Name |
Type |
Description |
Default |
user_id
|
int
|
|
required
|
Returns:
Source code in luduvo/client.py
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 | async def get_user(self, user_id: int) -> User:
"""
Gets a user with the specified user ID.
Arguments:
user_id: A Luduvo user ID.
Returns:
A user object.
"""
logger.debug(f"Fetching user with ID: {user_id}")
try:
user_response = await self._requests.get(
url=self.url_generator.get_url(f"users/{user_id}/profile", "api")
)
except NotFound as exception:
logger.error(f"User not found: {user_id}")
raise UserNotFound(
message="Invalid user.", response=exception.response
) from None
user_data = user_response.json()
logger.debug(f"Successfully retrieved user data for ID: {user_id}")
return User(client=self, data=user_data)
|
get_user_by_username(username, expand=True)
async
Gets a user with the specified username.
Parameters:
| Name |
Type |
Description |
Default |
username
|
str
|
|
required
|
expand
|
bool
|
Whether to return a User (2 requests) rather than a PartialUser (1 request)
|
True
|
Returns:
| Type |
Description |
User | PartialUser
|
A User or PartialUser depending on the expand argument.
|
Source code in luduvo/client.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 | async def get_user_by_username(
self, username: str, expand: bool = True
) -> User | PartialUser:
"""
Gets a user with the specified username.
Arguments:
username: A Luduvo username.
expand: Whether to return a User (2 requests) rather than a PartialUser (1 request)
Returns:
A User or PartialUser depending on the expand argument.
"""
logger.debug(f"Fetching user with username: {username}")
try:
user_response = await self._requests.get(
url=self.url_generator.get_url(f"users?q={username}", "api")
)
except NotFound as exception:
logger.error(f"User not found: {username}")
raise UserNotFound(
message="Invalid user.", response=exception.response
) from None
user_data = user_response.json()
if len(user_data) == 0:
logger.error(f"User not found: {username}")
raise UserNotFound(message="Invalid user.")
user_info = user_data[0]
if expand:
logger.debug(f"Expanding user data for username: {username}")
return await self.get_user(user_info["id"])
return PartialUser(client=self, data=user_info)
|