Skip to content

Commit 26e24b4

Browse files
committed
split up leaderboard functions
1 parent 3c73e62 commit 26e24b4

10 files changed

Lines changed: 139 additions & 106 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
# Change Log
22
All notable changes to this project will be documented in this file.
33

4-
## [3.0.3] - TBD
4+
## [3.0.3] - 2/17/20
55
### Added
66
- `invalid_chars` attribute for `NotFoundError` when applicable
77
- `url` attribute for all errors that have requested a URL
88
- `str(error)` will return the message attribute of the error.
99
### Changed
1010
- The `error` attribute for all errors have been renamed to `message`
11+
- For BrawlAPI: `get_leaderboard` split up into `get_player_leaderboard`, `get_club_leaderboard`, and `get_brawler_leaderboard`
12+
- For the official API: `get_rankings` split up into `get_player_rankings`, `get_club_rankings`, and `get_brawler_rankings`
1113

1214
## [3.0.2] - 12/22/19
1315
### Fixed

brawlstats/brawlapi/core.py

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -258,41 +258,73 @@ def get_club(self, tag: bstag):
258258
url = '{}?tag={}'.format(self.api.CLUB, tag)
259259
return self._get_model(url, model=Club)
260260

261-
def get_leaderboard(self, lb_type: str, limit: int=200, region='global', brawler=None):
261+
def get_player_leaderboard(self, limit=200, region='global'):
262262
"""
263-
Get the top count players/clubs/brawlers.
263+
Get the top players.
264264
265265
Parameters
266266
----------
267-
lb_type: str
268-
The type of leaderboard. Must be "players", "clubs", "brawlers".
269-
Anything else will return a ValueError.
270267
limit: Optional[int] = 200
271-
The number of top players or clubs to fetch.
272-
If count > 200, it will return a ValueError.
268+
The number of top players to fetch.
269+
If limit > 200, it will set the limit to 200.
270+
region: Optional[str] = "global"
271+
The region to retrieve from. Must be a 2 letter country code or "global"
272+
273+
Returns Leaderboard
274+
"""
275+
if not 0 < limit <= 200:
276+
limit = 200
277+
278+
url = '{}/players?count={}&region={}'.format(self.api.LEADERBOARD, limit, region)
279+
return self._get_model(url, model=Leaderboard)
280+
281+
def get_club_leaderboard(self, limit=200, region='global'):
282+
"""
283+
Get the top clubs.
284+
285+
Parameters
286+
----------
287+
limit: Optional[int] = 200
288+
The number of top clubs to fetch.
289+
If limit > 200, it will set the limit to 200.
273290
region: Optional[str] = "global"
274291
The region to retrieve from. Must be a 2 letter country code or "global"
275-
brawler: Optional[Union[str, int]] = None
276-
The brawler name or ID.
277292
278293
Returns Leaderboard
279294
"""
280-
if brawler:
281-
brawler = brawler.lower()
282-
if brawler not in self.api.BRAWLERS.keys():
283-
raise ValueError('Invalid brawler.')
284295

285296
# Check for invalid parameters
286-
if lb_type not in ('players', 'clubs', 'brawlers'):
287-
raise ValueError("'lb_type' must be 'players', 'clubs' or 'brawlers'.")
288297
if not 0 < limit <= 200:
289-
raise ValueError('Make sure limit is between 1 and 200.')
298+
limit = 200
290299

291300
# Construct URL
292-
url = '{}/{}?count={}&region={}'.format(self.api.LEADERBOARD, lb_type, limit, region)
293-
if lb_type == 'brawlers':
294-
url = '{}/players?count={}&brawlers={}&region={}'.format(self.api.LEADERBOARD, limit, brawler, region)
301+
url = '{}/clubs?count={}&region={}'.format(self.api.LEADERBOARD, limit, region)
302+
return self._get_model(url, model=Leaderboard)
303+
304+
def get_brawler_leaderboard(self, brawler, limit=200, region='global'):
305+
"""
306+
Get the leaderboard for a certain brawler.
307+
308+
Parameters
309+
----------
310+
brawler: str
311+
The brawler name to get the leaderboard for.
312+
limit: Optional[int] = 200
313+
The number of top clubs to fetch.
314+
If limit > 200, it will set the limit to 200.
315+
region: Optional[str] = "global"
316+
The region to retrieve from. Must be a 2 letter country code or "global"
317+
318+
Returns Leaderboard
319+
"""
320+
brawler = brawler.lower()
321+
if brawler not in self.api.BRAWLERS.keys():
322+
raise ValueError('Invalid brawler.')
323+
324+
if not 0 < limit <= 200:
325+
limit = 200
295326

327+
url = '{}/players?brawlers={}&count={}&region={}'.format(self.api.LEADERBOARD, brawler, limit, region)
296328
return self._get_model(url, model=Leaderboard)
297329

298330
def get_events(self):

brawlstats/brawlapi/utils.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ def __init__(self, base_url, version=1):
4343
def bstag(tag):
4444
tag = tag.strip('#').upper().replace('O', '0')
4545
allowed = '0289PYLQGRJCUV'
46-
print(tag)
4746
if len(tag) < 3:
48-
print(f'Less than 3 {tag}')
4947
raise NotFoundError('Tag less than 3 characters.', 404)
5048
invalid = [c for c in tag if c not in allowed]
5149
if invalid:

brawlstats/errors.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ class NotFoundError(RequestError):
3333

3434
def __init__(self, code, invalid_chars=[]):
3535
self.code = code
36-
self.message = 'An incorrect tag has been passed.\nInvalid Characters: ' + ', '.join(invalid_chars)
3736
self.invalid_chars = invalid_chars
37+
self.message = 'An incorrect tag has been passed.'
38+
if invalid_chars:
39+
self.message += '\nInvalid Characters: ' + ', '.join(invalid_chars)
3840
super().__init__(self.code, self.message)
3941

4042

brawlstats/officialapi/core.py

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def _get_model(self, url, model, key=None):
196196
# Calls the async function
197197
return self._aget_model(url, model=model, key=key)
198198

199-
data, resp = self._request(url)
199+
data = self._request(url)
200200
if self.prevent_ratelimit:
201201
time.sleep(1 / self.ratelimit[0])
202202

@@ -259,45 +259,74 @@ def get_club_members(self, tag: bstag):
259259
url = '{}/{}/members'.format(self.api.CLUB, tag)
260260
return self._get_model(url, model=Members)
261261

262-
def get_rankings(self, ranking_type: str, limit: int=200, region='global', brawler=None):
262+
def get_player_rankings(self, limit=200, region='global'):
263263
"""
264-
Get the top count players/clubs/brawlers.
264+
Get the top players.
265265
266266
Parameters
267267
----------
268-
ranking_type: str
269-
The type of ranking. Must be "players", "clubs", "brawlers".
270-
Anything else will return a ValueError.
271268
limit: Optional[int] = 200
272269
The number of top players or clubs to fetch.
273-
If count > 200, it will return a ValueError.
270+
If count > 200, it will set the limit to 200.
274271
region: Optional[str] = "global"
275272
The region to retrieve from. Must be a 2 letter country code or "global".
276-
brawler: Optional[Union[str, int]] = None
277-
The brawler name or ID.
278273
279274
Returns Ranking
280275
"""
281-
if brawler:
282-
brawler = brawler.lower()
283-
if brawler not in self.api.BRAWLERS:
284-
raise ValueError('Invalid brawler.')
285-
286-
# Check for invalid parameters
287-
if ranking_type not in ('players', 'clubs', 'brawlers'):
288-
raise ValueError("'lb_type' must be 'players', 'clubs' or 'brawlers'.")
289276
if not 0 < limit <= 200:
290-
raise ValueError('Make sure limit is between 1 and 200.')
277+
limit = 200
278+
279+
url = '{}/{}/players?limit={}'.format(self.api.RANKINGS, region, limit)
280+
return self._get_model(url, model=Ranking)
281+
282+
def get_club_rankings(self, limit=200, region='global'):
283+
"""
284+
Get the top clubs.
285+
286+
Parameters
287+
----------
288+
limit: Optional[int] = 200
289+
The number of top players or clubs to fetch.
290+
If count > 200, it will set the limit to 200.
291+
region: Optional[str] = "global"
292+
The region to retrieve from. Must be a 2 letter country code or "global".
293+
294+
Returns Ranking
295+
"""
296+
if not 0 < limit <= 200:
297+
limit = 200
298+
299+
url = '{}/{}/clubs?limit={}'.format(self.api.RANKINGS, region, limit)
300+
return self._get_model(url, model=Ranking)
301+
302+
def get_brawler_rankings(self, brawler, limit=200, region='global'):
303+
"""
304+
Get the leaderboard for a certain brawler.
305+
306+
Parameters
307+
----------
308+
brawler: Union[str, int]
309+
The brawler name or ID
310+
limit: Optional[int] = 200
311+
The number of top players or clubs to fetch.
312+
If count > 200, it will set the limit to 200.
313+
region: Optional[str] = "global"
314+
The region to retrieve from. Must be a 2 letter country code or "global".
315+
316+
Returns Ranking
317+
"""
318+
brawler = brawler.lower()
319+
if brawler not in self.api.BRAWLERS:
320+
raise ValueError('Invalid brawler.')
321+
322+
if not 0 < limit <= 200:
323+
limit = 200
291324

292325
# Replace brawler name with ID
293326
if brawler in self.api.BRAWLERS.keys():
294327
brawler = self.api.BRAWLERS[brawler]
295328

296-
# Construct URL
297-
url = '{}/{}/{}?limit={}'.format(self.api.RANKINGS, region, ranking_type, limit)
298-
if ranking_type == 'brawlers':
299-
url = '{}/{}/{}/{}?limit={}'.format(self.api.RANKINGS, region, ranking_type, brawler, limit)
300-
329+
url = '{}/{}/brawlers/{}?limit={}'.format(self.api.RANKINGS, region, brawler, limit)
301330
return self._get_model(url, model=Ranking)
302331

303332
@typecasted

examples/brawlapi/async.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ async def main():
1616
for player in best_players:
1717
print(player.name, player.trophies)
1818

19-
leaderboard = await client.get_leaderboard('players', limit=5) # gets top 5 players
19+
leaderboard = await client.get_player_leaderboard(limit=5) # gets top 5 players
2020
for player in leaderboard:
2121
print(player.name, player.position)
2222

examples/brawlapi/sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
for player in best_players:
1414
print(player.name, player.trophies) # prints name and trophies
1515

16-
leaderboard = client.get_leaderboard('players', limit=5) # gets top 5 players
16+
leaderboard = client.get_player_leaderboard(limit=5) # gets top 5 players
1717
for player in leaderboard:
1818
print(player.name, player.position)
1919

tests/brawlapi/test_async.py

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,21 @@ async def test_get_club(self):
4646
self.assertEqual(club.tag, self.club_tag)
4747

4848
async def test_get_leaderboard_player(self):
49-
lb = await self.client.get_leaderboard('players')
49+
lb = await self.client.get_player_leaderboard(limit=200)
5050
self.assertIsInstance(lb, Leaderboard)
51-
lb = await self.client.get_leaderboard('players', region='us')
51+
lb = await self.client.get_player_leaderboard(limit=5, region='us')
5252
self.assertIsInstance(lb, Leaderboard)
53-
lb = await self.client.get_leaderboard('players', region='us', limit=5)
54-
self.assertTrue(len(lb) == 5)
5553

5654
async def test_get_leaderboard_club(self):
57-
lb = await self.client.get_leaderboard('clubs')
55+
lb = await self.client.get_club_leaderboard(limit=200)
56+
self.assertIsInstance(lb, Leaderboard)
57+
lb = await self.client.get_club_leaderboard(limit=5, region='us')
5858
self.assertIsInstance(lb, Leaderboard)
5959

6060
async def test_get_leaderboard_brawler(self):
61-
lb = await self.client.get_leaderboard('brawlers', brawler='shelly')
61+
lb = await self.client.get_club_leaderboard('shelly', limit=200)
62+
self.assertIsInstance(lb, Leaderboard)
63+
lb = await self.client.get_club_leaderboard('mortis', limit=5, region='us')
6264
self.assertIsInstance(lb, Leaderboard)
6365

6466
async def test_get_events(self):
@@ -93,24 +95,11 @@ async def test_invalid_tag(self):
9395
async def request():
9496
await self.client.get_player(invalid_tag)
9597
invalid_tag = 'P'
96-
self.assertRaises(brawlstats.NotFoundError, request)
98+
self.assertAsyncRaises(brawlstats.NotFoundError, request)
9799
invalid_tag = 'AAA'
98-
self.assertRaises(brawlstats.NotFoundError, request)
100+
self.assertAsyncRaises(brawlstats.NotFoundError, request)
99101
invalid_tag = '2PPPPPPP'
100-
self.assertRaises(brawlstats.ServerError, request)
101-
102-
async def test_invalid_lb(self):
103-
async def request():
104-
await self.client.get_leaderboard(invalid_type, invalid_limit)
105-
invalid_type = 'test'
106-
invalid_limit = 200
107-
self.assertRaises(ValueError, request)
108-
invalid_type = 'players'
109-
invalid_limit = 201
110-
self.assertRaises(ValueError, request)
111-
invalid_type = 'players'
112-
invalid_limit = -5
113-
self.assertRaises(ValueError, request)
102+
self.assertAsyncRaises(brawlstats.ServerError, request)
114103

115104

116105
if __name__ == '__main__':

tests/brawlapi/test_blocking.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,21 @@ def test_get_club(self):
4646
self.assertEqual(club.tag, self.club_tag)
4747

4848
def test_get_leaderboard_player(self):
49-
lb = self.client.get_leaderboard('players')
49+
lb = self.client.get_player_leaderboard(limit=200)
50+
self.assertIsInstance(lb, Leaderboard)
51+
lb = self.client.get_player_leaderboard(limit=5, region='us')
5052
self.assertIsInstance(lb, Leaderboard)
51-
region = self.client.get_leaderboard('players', region='us')
52-
self.assertIsInstance(region, Leaderboard)
5353

5454
def test_get_leaderboard_club(self):
55-
lb = self.client.get_leaderboard('clubs')
55+
lb = self.client.get_club_leaderboard(limit=200)
56+
self.assertIsInstance(lb, Leaderboard)
57+
lb = self.client.get_club_leaderboard(limit=5, region='us')
5658
self.assertIsInstance(lb, Leaderboard)
5759

5860
def test_get_leaderboard_brawler(self):
59-
lb = self.client.get_leaderboard('brawlers', brawler='shelly')
61+
lb = self.client.get_club_leaderboard('shelly', limit=200)
62+
self.assertIsInstance(lb, Leaderboard)
63+
lb = self.client.get_club_leaderboard('mortis', limit=5, region='us')
6064
self.assertIsInstance(lb, Leaderboard)
6165

6266
def test_get_events(self):
@@ -95,18 +99,6 @@ def test_invalid_tag(self):
9599
invalid_tag = '2PPPPPPP'
96100
self.assertRaises(brawlstats.ServerError, get_player, invalid_tag)
97101

98-
def test_invalid_lb(self):
99-
get_lb = self.client.get_leaderboard
100-
invalid_type = 'test'
101-
invalid_limit = 200
102-
self.assertRaises(ValueError, get_lb, invalid_type, invalid_limit)
103-
invalid_type = 'players'
104-
invalid_limit = 201
105-
self.assertRaises(ValueError, get_lb, invalid_type, invalid_limit)
106-
invalid_type = 'players'
107-
invalid_limit = -5
108-
self.assertRaises(ValueError, get_lb, invalid_type, invalid_limit)
109-
110102

111103
if __name__ == '__main__':
112104
unittest.main()

0 commit comments

Comments
 (0)