Skip to content

Commit 0ae747e

Browse files
author
Nick Shorter
committed
Abstract Classes for each api
1 parent 056a219 commit 0ae747e

File tree

9 files changed

+263
-152
lines changed

9 files changed

+263
-152
lines changed

lib/sports/apisports/apisports.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from lib.sports.sportbase import SportBase
2+
from lib.sports.apisports.baseball.baseball import Baseball
3+
from lib.sports.apisports.basketball.basketball import Basketball
4+
from lib.sports.apisports.hockey.hockey import Hockey
5+
from lib.sports.apisports.football.football import Football
6+
import json
7+
import sys
8+
import os
9+
10+
class ApiSports(SportBase):
11+
def __init__(self, config):
12+
self.config = config
13+
self.sport = self.config['sport']
14+
try:
15+
if "sport_token" in self.config['basic']:
16+
self.token = self.config['basic'].get('sport_token')
17+
else:
18+
self.token = os.environ['SPORTTOKEN']
19+
except KeyError:
20+
self.logger.critical("No Sport Token")
21+
sys.exit("No Sport Token")
22+
self.headers = {'x-apisports-key': 'ebb2c44c416b9a9a0b538e2d73c7dbe6'}
23+
24+
async def run_api_sports(self):
25+
sport_data = {"Sport": {}}
26+
if 'football' == self.sport.get('sport').lower():
27+
self.logger.debug("Running football data")
28+
football = Football(self.token, self.config['sport'], self.headers)
29+
football_return = await football.run()
30+
sport_data['Sport'].update({'football': football_return})
31+
elif 'baseball' == self.sport.get('sport').lower():
32+
self.logger.debug('Running baseball data')
33+
baseball = Baseball(self.token, self.config['sport'], self.headers)
34+
sport_data = await baseball.run()
35+
elif 'basketball' == self.sport.get('sport').lower():
36+
self.logger.debug('Got basketball in config')
37+
basketball = Basketball(self.token, self.config['sport'], self.headers)
38+
basketball_return = await basketball.run()
39+
sport_data['Sport'].update({'basketball': basketball_return})
40+
elif 'hockey' == self.sport.get('sport').lower():
41+
self.logger.debug('Got Hockey from Config')
42+
hockey = Hockey(self.token, self.config['sport'], self.headers)
43+
sport_data = await hockey.run()
44+
return sport_data

lib/sports/apisports/baseball/baseball.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from lib.run import Runner
22
from datetime import datetime
3+
from lib.sports.apisports.result import SportApiResult
34

45
class Baseball(Runner):
56
def __init__(self, token, config, headers):
@@ -33,4 +34,5 @@ async def run(self):
3334
api_data = {}
3435
for section, url in self.url_builder(parsed).items():
3536
api_data.update({section: await self.get_data(url, self.headers)})
36-
return api_data
37+
api_data['sport'] = 'baseball'
38+
return SportApiResult(api_data)

lib/sports/apisports/basketball/basketball.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ async def run(self):
3535
api_data = {}
3636
for section, url in self.url_builder(parsed).items():
3737
api_data.update({section: await self.get_data(url, self.headers)})
38+
api_data['sport'] = 'basketball'
3839
return api_data

lib/sports/apisports/football/__init__.py

Whitespace-only changes.

lib/sports/apisports/hockey/hockey.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from lib.run import Runner
22
from datetime import datetime
3+
from lib.sports.apisports.result import SportApiResult
34

45
class Hockey(Runner):
56
def __init__(self, token, config, headers):
@@ -29,10 +30,11 @@ def url_builder(self, args):
2930
urls.update({'next_game': base + f"games?team={self.config.getint('team_id')}&league=57&season=2020&timezone=America/Chicago"})
3031
return urls
3132

32-
async def run(self):
33+
async def run(self) -> SportApiResult:
3334
self.logger.info('Running Hockey API')
3435
parsed = self.parse_args()
3536
api_data = {}
3637
for section, url in self.url_builder(parsed).items():
3738
api_data.update({section: await self.get_data(url, self.headers)})
38-
return api_data
39+
api_data['sport'] = 'hockey'
40+
return SportApiResult(api_data)

lib/sports/apisports/result.py

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
from lib.sports.sportbase import SportResultBase
2+
3+
import json
4+
5+
class SportApiResult(SportResultBase):
6+
def __init__(self, api) -> None:
7+
super().__init__()
8+
self.api_type = ""
9+
self.api = api
10+
self.main_sport = api
11+
self._sport = api['sport']
12+
if len(self.main_sport['standings']['errors']) != 0:
13+
self._error = self.set_error()
14+
else:
15+
self._error = self.set_error()
16+
if 'standings' in self.main_sport:
17+
self.standings = self.build_standings()
18+
self._length = len(self.standings)
19+
self._positions = [(team.get('name'), team.get('position')) for team in self.standings]
20+
self._leagues = [(team.get('name'), team.get('league')) for team in self.standings]
21+
self._games_played = [(team.get('name'), team.get('games').get('played')) for team in self.standings]
22+
self._wins = [(team.get('name'), team['games']['win']['total']) for team in self.standings]
23+
self._wins_percentage = [(team.get('name'), team['games']['win']['percentage']) for team in self.standings]
24+
self._losses = [(team.get('name'), team['games']['lose']['total']) for team in self.standings]
25+
self._loss_percentage = [(team.get('name'), team['games']['lose']['percentage']) for team in self.standings]
26+
if 'next_game' in self.main_sport:
27+
self.next_game = self.build_nextgame()
28+
self._game_ids = [game.get('game_id') for game in self.next_game]
29+
self._timestamps = [(game.get('game_id'), game.get('timestamp')) for game in self.next_game]
30+
self._teams = [(game.get('game_id'), game.get('teams')) for game in self.next_game]
31+
self._vs = [(game.get('game_id'), (game['teams']['home']['name'], game['teams']['away']['name'])) for game in self.next_game]
32+
self._status = [(game.get('game_id'), game.get('status')) for game in self.next_game]
33+
self._game_result = {game.get('game_id'): game.get('score') for game in self.next_game}
34+
35+
def __repr__(self):
36+
attrs = [
37+
f"length={self._length}",
38+
f"positions={json.dumps(self._positions, indent=2)}",
39+
f'leagues={json.dumps(self._leagues, indent=2)}',
40+
f"games_played={json.dumps(self._games_played, indent=2)}",
41+
f"wins={json.dumps(self._wins, indent=2)}",
42+
f"wins_percentage={json.dumps(self._wins_percentage, indent=2)}",
43+
f"losses={json.dumps(self._losses, indent=2)}",
44+
f"loss_percentage={json.dumps(self._loss_percentage, indent=2)}",
45+
f"game_ids={json.dumps(self._game_ids, indent=2)}",
46+
f"timestamps={json.dumps(self._timestamps, indent=2)}",
47+
f"teams={json.dumps(self._teams, indent=2)}",
48+
f"vs={json.dumps(self._vs, indent=2)}",
49+
f"status={json.dumps(self._status, indent=2)}",
50+
f"game_result={json.dumps(self._game_result, indent=2)}"
51+
]
52+
joined = "\t\n".join(attrs)
53+
return f"Sport(\n{joined})"
54+
55+
def build_standings(self):
56+
#counter = 0
57+
position = []
58+
regular_season_check = (
59+
"MLB - Regular Season",
60+
"NBA - Regular Season",
61+
"NHL - Regular Season",
62+
"NFL - Regular Season"
63+
)
64+
# Can Be Empty Must try and except for that
65+
for pos in self.main_sport['standings'].get('response')[0]:
66+
if not pos.get('stage') in regular_season_check:
67+
continue
68+
position.append({'name': pos.get('team').get('name'),
69+
'position': pos.get('position'),
70+
'league': pos.get('group').get('name'),
71+
'games': pos.get('games')
72+
})
73+
return position
74+
75+
def build_nextgame(self):
76+
main = []
77+
for game in self.main_sport['next_game'].get('response'):
78+
main.append({
79+
'game_id': game.get('id'),
80+
'timestamp': game.get('timestamp'),
81+
'status': game['status']['short'],
82+
'teams': game['teams'],
83+
'score': game['scores']
84+
})
85+
return main
86+
87+
def set_error(self):
88+
if isinstance(self.main_sport['standings']['errors'], list):
89+
return True, ""
90+
else:
91+
return False, self.main_sport['standings']['errors']['requests']
92+
93+
@property
94+
def get_sport(self):
95+
return self._sport
96+
97+
@property
98+
def get_error(self):
99+
return self._error
100+
101+
@property
102+
def get_length_position_teams(self):
103+
return len(self.standings)
104+
105+
@property
106+
def get_standings(self):
107+
return self.standings
108+
109+
@property
110+
def get_position_teams(self):
111+
return self._positions
112+
113+
@property
114+
def get_leagues(self):
115+
return self._leagues
116+
117+
@property
118+
def get_games_played(self):
119+
return self._games_played
120+
121+
@property
122+
def get_wins(self):
123+
return self._wins
124+
125+
@property
126+
def get_wins_percentage(self):
127+
return self._wins_percentage
128+
129+
@property
130+
def get_losses(self):
131+
return self._losses
132+
133+
@property
134+
def get_loss_percentage(self):
135+
return self._loss_percentage
136+
137+
@property
138+
def get_game_ids(self):
139+
return self._game_ids
140+
141+
@property
142+
def get_timestamps(self):
143+
return self._timestamps
144+
145+
@property
146+
def get_teams(self):
147+
return self._teams
148+
149+
@property
150+
def get_versus(self):
151+
return self._vs
152+
153+
@property
154+
def get_status(self):
155+
return self._status
156+
157+
@property
158+
def get_scores(self):
159+
return self._game_result
160+
161+
def get_specific_score(self, game_id):
162+
return self._game_result.get(game_id)
163+

lib/sports/sportbase.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from lib.run import Runner, Caller
2+
3+
class SportBase(Runner):
4+
pass
5+
class SportResultBase(Caller):
6+
pass

0 commit comments

Comments
 (0)