Skip to content

Commit cb47271

Browse files
committed
Revert "split up leaderboard functions"
This reverts commit 26e24b4.
1 parent 8f12f3c commit cb47271

10 files changed

Lines changed: 106 additions & 139 deletions

File tree

CHANGELOG.md

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

4-
## [3.0.3] - 2/17/20
4+
## [3.0.3] - TBD
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`
1311

1412
## [3.0.2] - 12/22/19
1513
### Fixed

brawlstats/brawlapi/core.py

Lines changed: 19 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -258,73 +258,41 @@ 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_player_leaderboard(self, limit=200, region='global'):
261+
def get_leaderboard(self, lb_type: str, limit: int=200, region='global', brawler=None):
262262
"""
263-
Get the top players.
263+
Get the top count players/clubs/brawlers.
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.
267270
limit: Optional[int] = 200
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.
271+
The number of top players or clubs to fetch.
272+
If count > 200, it will return a ValueError.
290273
region: Optional[str] = "global"
291274
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.
292277
293278
Returns Leaderboard
294279
"""
280+
if brawler:
281+
brawler = brawler.lower()
282+
if brawler not in self.api.BRAWLERS.keys():
283+
raise ValueError('Invalid brawler.')
295284

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

300291
# Construct URL
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
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)
326295

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

330298
def get_events(self):

brawlstats/brawlapi/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ 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)
4647
if len(tag) < 3:
48+
print(f'Less than 3 {tag}')
4749
raise NotFoundError('Tag less than 3 characters.', 404)
4850
invalid = [c for c in tag if c not in allowed]
4951
if invalid:

brawlstats/errors.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,8 @@ 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)
3637
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)
4038
super().__init__(self.code, self.message)
4139

4240

brawlstats/officialapi/core.py

Lines changed: 23 additions & 52 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 = self._request(url)
199+
data, resp = self._request(url)
200200
if self.prevent_ratelimit:
201201
time.sleep(1 / self.ratelimit[0])
202202

@@ -259,74 +259,45 @@ 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_player_rankings(self, limit=200, region='global'):
262+
def get_rankings(self, ranking_type: str, limit: int=200, region='global', brawler=None):
263263
"""
264-
Get the top players.
264+
Get the top count players/clubs/brawlers.
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.
268271
limit: Optional[int] = 200
269272
The number of top players or clubs to fetch.
270-
If count > 200, it will set the limit to 200.
273+
If count > 200, it will return a ValueError.
271274
region: Optional[str] = "global"
272275
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.
273278
274279
Returns Ranking
275280
"""
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'.")
276289
if not 0 < limit <= 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
290+
raise ValueError('Make sure limit is between 1 and 200.')
324291

325292
# Replace brawler name with ID
326293
if brawler in self.api.BRAWLERS.keys():
327294
brawler = self.api.BRAWLERS[brawler]
328295

329-
url = '{}/{}/brawlers/{}?limit={}'.format(self.api.RANKINGS, region, brawler, limit)
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+
330301
return self._get_model(url, model=Ranking)
331302

332303
@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_player_leaderboard(limit=5) # gets top 5 players
19+
leaderboard = await client.get_leaderboard('players', 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_player_leaderboard(limit=5) # gets top 5 players
16+
leaderboard = client.get_leaderboard('players', 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: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,19 @@ 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_player_leaderboard(limit=200)
49+
lb = await self.client.get_leaderboard('players')
5050
self.assertIsInstance(lb, Leaderboard)
51-
lb = await self.client.get_player_leaderboard(limit=5, region='us')
51+
lb = await self.client.get_leaderboard('players', 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)
5355

5456
async def test_get_leaderboard_club(self):
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')
57+
lb = await self.client.get_leaderboard('clubs')
5858
self.assertIsInstance(lb, Leaderboard)
5959

6060
async def test_get_leaderboard_brawler(self):
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')
61+
lb = await self.client.get_leaderboard('brawlers', brawler='shelly')
6462
self.assertIsInstance(lb, Leaderboard)
6563

6664
async def test_get_events(self):
@@ -94,11 +92,24 @@ async def test_invalid_tag(self):
9492
async def request():
9593
await self.client.get_player(invalid_tag)
9694
invalid_tag = 'P'
97-
self.assertAsyncRaises(brawlstats.NotFoundError, request)
95+
self.assertRaises(brawlstats.NotFoundError, request)
9896
invalid_tag = 'AAA'
99-
self.assertAsyncRaises(brawlstats.NotFoundError, request)
97+
self.assertRaises(brawlstats.NotFoundError, request)
10098
invalid_tag = '2PPPPPPP'
101-
self.assertAsyncRaises(brawlstats.ServerError, request)
99+
self.assertRaises(brawlstats.ServerError, request)
100+
101+
async def test_invalid_lb(self):
102+
async def request():
103+
await self.client.get_leaderboard(invalid_type, invalid_limit)
104+
invalid_type = 'test'
105+
invalid_limit = 200
106+
self.assertRaises(ValueError, request)
107+
invalid_type = 'players'
108+
invalid_limit = 201
109+
self.assertRaises(ValueError, request)
110+
invalid_type = 'players'
111+
invalid_limit = -5
112+
self.assertRaises(ValueError, request)
102113

103114

104115
if __name__ == '__main__':

tests/brawlapi/test_blocking.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,17 @@ 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_player_leaderboard(limit=200)
50-
self.assertIsInstance(lb, Leaderboard)
51-
lb = self.client.get_player_leaderboard(limit=5, region='us')
49+
lb = self.client.get_leaderboard('players')
5250
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_club_leaderboard(limit=200)
56-
self.assertIsInstance(lb, Leaderboard)
57-
lb = self.client.get_club_leaderboard(limit=5, region='us')
55+
lb = self.client.get_leaderboard('clubs')
5856
self.assertIsInstance(lb, Leaderboard)
5957

6058
def test_get_leaderboard_brawler(self):
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')
59+
lb = self.client.get_leaderboard('brawlers', brawler='shelly')
6460
self.assertIsInstance(lb, Leaderboard)
6561

6662
def test_get_events(self):
@@ -98,6 +94,18 @@ def test_invalid_tag(self):
9894
invalid_tag = '2PPPPPPP'
9995
self.assertRaises(brawlstats.ServerError, get_player, invalid_tag)
10096

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

102110
if __name__ == '__main__':
103111
unittest.main()

0 commit comments

Comments
 (0)