Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/build-and-test-mlbstatsapi-prd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ jobs:
virtualenvs-in-project: true
- name: Install dependencies
run: poetry install --no-interaction
- name: Test with mocks with pytest
run: poetry run pytest tests/mock_tests/
- name: Test external tests with pytest
run: poetry run pytest tests/external_tests/
- name: Build package
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/build-and-test-mlbstatsapi-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ jobs:
virtualenvs-in-project: true
- name: Install dependencies
run: poetry install --no-interaction
- name: Test with mocks with pytest
run: poetry run pytest tests/mock_tests/
- name: Test external tests with pytest
run: poetry run pytest tests/external_tests/
- name: Build package
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ jobs:
virtualenvs-in-project: true
- name: Install dependencies
run: poetry install --no-interaction
- name: Test with mocks with pytest
run: poetry run pytest tests/mock_tests/
- name: Test external tests with pytest
run: poetry run pytest tests/external_tests/
- name: Build package
Expand Down
13 changes: 5 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Ty France
>>> groups = ['hitting']
>>> params = {'season': 2022}
>>> mlb.get_player_stats(664034, stats, groups, **params)
{'hitting': {'season': Stat, 'seasonadvanced': Stat }}
{'hitting': {'season': Stat, 'seasonAdvanced': Stat }}

>>> mlb.get_team_id("Seattle Mariners")
[136]
Expand Down Expand Up @@ -185,9 +185,6 @@ Contributions are welcome! Whether it's bug fixes, new features, or documentatio
# Run tests
poetry run pytest

# Run mock tests only (no external API calls)
poetry run pytest tests/mock_tests/

# Run external tests (requires internet)
poetry run pytest tests/external_tests/
```
Expand Down Expand Up @@ -277,7 +274,7 @@ Use team id and the stat types and groups to return season hitting stats
```python
>>> stats = mlb.get_team_stats(team_id, stats=stats, groups=groups, **params)
>>> season_hitting = stats['hitting']['season']
>>> advanced_hitting = stats['hitting']['seasonadvanced']
>>> advanced_hitting = stats['hitting']['seasonAdvanced']
```

Print stats as JSON
Expand All @@ -301,7 +298,7 @@ Print stats as JSON
>>> params = {'season': 2022}

>>> stats = mlb.get_player_stats(player_id, stats=stats, groups=group, **params)
>>> expected = stats['hitting']['expectedstatistics']
>>> expected = stats['hitting']['expectedStatistics']
>>> for split in expected.splits:
... print(f"Expected AVG: {split.stat.avg}")
... print(f"Expected SLG: {split.stat.slg}")
Expand All @@ -326,7 +323,7 @@ Set stat type, stat groups, and params
Get stats
```python
>>> stats = mlb.get_player_stats(ty_france_id, stats=stats, groups=group, **params)
>>> vs_player = stats['hitting']['vsplayer']
>>> vs_player = stats['hitting']['vsPlayer']
>>> for split in vs_player.splits:
... print(f"Games: {split.stat.games_played}, Hits: {split.stat.hits}")
Games: 2, Hits: 2
Expand All @@ -340,7 +337,7 @@ Games: 2, Hits: 2
>>> params = {'season': 2022}

>>> hotcoldzones = mlb.get_player_stats(ty_france_id, stats=stats, groups=hitting_group, **params)
>>> zones = hotcoldzones['stats']['hotcoldzones']
>>> zones = hotcoldzones['stats']['hotColdZones']

>>> for split in zones.splits:
... print(f"Stat: {split.stat.name}")
Expand Down
21 changes: 10 additions & 11 deletions mlbstatsapi/mlb_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ def get_persons(self, person_ids: Union[str, List[int]], **params) -> List[Perso
return person_list

def get_people_id(self, fullname: str, sport_id: int = 1,
search_key: str = 'fullname', **params) -> List[int]:
search_key: str = 'fullName', **params) -> List[int]:
"""
Returns specific player information based on players fullname

Expand Down Expand Up @@ -903,7 +903,7 @@ def get_game(self, game_id: int, **params) -> Union[Game, None]:
if 400 <= mlb_data.status_code <= 499:
return None

if 'gamepk' in mlb_data.data and mlb_data.data['gamepk'] == game_id:
if 'gamePk' in mlb_data.data and mlb_data.data['gamePk'] == game_id:
return Game(**mlb_data.data)

def get_game_play_by_play(self, game_id: int, **params) -> Union[Plays, None]:
Expand Down Expand Up @@ -948,7 +948,7 @@ def get_game_play_by_play(self, game_id: int, **params) -> Union[Plays, None]:
if 400 <= mlb_data.status_code <= 499:
return None

if 'allplays' in mlb_data.data and mlb_data.data['allplays']:
if 'allPlays' in mlb_data.data and mlb_data.data['allPlays']:
return Plays(**mlb_data.data)

def get_game_line_score(self, game_id: int, **params) -> Union[Linescore, None]:
Expand Down Expand Up @@ -1095,7 +1095,7 @@ def get_game_ids(self, date: str = None,
if 'dates' in mlb_data.data and mlb_data.data['dates']:
for date in mlb_data.data['dates']:
for game in date['games']:
game_ids.append(game.gamepk)
game_ids.append(game['gamePk'])

return game_ids

Expand Down Expand Up @@ -2027,7 +2027,7 @@ def get_homerun_derby(self, game_id, **params) -> Union[HomeRunDerby, None]:
Parameters
----------
game_id : int
Insert gamePk to return HomerunDerby data for a specific gamepk.
Insert gamePk to return HomerunDerby data for a specific gamePk.

Other Parameters
----------------
Expand Down Expand Up @@ -2088,7 +2088,7 @@ def get_team_stats(self, team_id: int, stats: list, groups: list, **params) -> d
>>> stats = ['season', 'seasonAdvanced']
>>> groups = ['pitching']
>>> mlb.get_team_stats(133, stats, groups)
{'pitching': {'season': [PitchingSeason], 'seasonadvanced': [PitchingSeasonAdvanced] }}
{'pitching': {'season': [PitchingSeason], 'seasonAdvanced': [PitchingSeasonAdvanced] }}
"""
params['stats'] = stats
params['group'] = groups
Expand Down Expand Up @@ -2134,8 +2134,8 @@ def get_players_stats_for_game(self, person_id: int, game_id: int, **params) ->
>>> player_id = 663728
>>> game_id = 715757
>>> stats = mlb.get_player_stats_for_game(person_id=person_id, game_id=game_id)
>>> print(stats['stats']['gamelog'])
>>> print(stats['hitting']['playlog'])
>>> print(stats['stats']['gameLog'])
>>> print(stats['hitting']['playLog'])
"""
mlb_data = self._mlb_adapter_v1.get(endpoint=f'people/{person_id}/stats/game/{game_id}')
if 400 <= mlb_data.status_code <= 499:
Expand Down Expand Up @@ -2166,7 +2166,7 @@ def get_player_stats(self, person_id: int, stats: list, groups: list, **params)
season : str
Insert year to return team stats for a particular season, season=2018
eventType : str
Notes for individual events for playLog, playlog can be filered by individual events.
Notes for individual events for playLog, playLog can be filered by individual events.
List of eventTypes can be found at https://statsapi.mlb.com/api/v1/eventTypes

Returns
Expand All @@ -2186,7 +2186,7 @@ def get_player_stats(self, person_id: int, stats: list, groups: list, **params)
>>> stats = ['season', 'seasonAdvanced']
>>> groups = ['hitting']
>>> mlb.get_player_stats(647351, stats, groups)
{'hitting': {'season': [HittingSeason], 'seasonadvanced': [HittingSeasonAdvanced] }}
{'hitting': {'season': [HittingSeason], 'seasonAdvanced': [HittingSeasonAdvanced] }}
"""
params['stats'] = stats
params['group'] = groups
Expand Down Expand Up @@ -2262,4 +2262,3 @@ def get_stats(self, stats: list, groups: list, **params: dict) -> dict:
return splits

# This is to test pypi, please delete later

37 changes: 1 addition & 36 deletions mlbstatsapi/mlb_dataadapter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Dict, List
from typing import Dict
from .exceptions import TheMlbStatsApiException
import requests
import logging
Expand Down Expand Up @@ -46,39 +46,6 @@ def __init__(self, hostname: str = 'statsapi.mlb.com', ver: str = 'v1', logger:
self._logger = logger or logging.getLogger(__name__)
self._logger.setLevel(logging.DEBUG)

def _transform_keys_in_data(self, data) -> dict:
"""
Recursivly transform all the keys in a dictionary to lowercase

Parameters
----------
data : dict
MlbResult data dictionary

Returns
-------
dict
"""

if isinstance(data, Dict):
lowered_dict = {}

for key, value in data.items():
lowered_dict[key.lower()] = self._transform_keys_in_data(value)

return lowered_dict

elif isinstance(data, List):
lowered_list = []

for item in data:
lowered_list.append(self._transform_keys_in_data(item))

return lowered_list

else:
return data

def get(self, endpoint: str, ep_params: Dict = None, data: Dict = None) -> MlbResult:
"""
return a MlbResult from endpoint
Expand All @@ -98,7 +65,6 @@ def get(self, endpoint: str, ep_params: Dict = None, data: Dict = None) -> MlbRe
"""

full_url = self.url + endpoint
print (full_url)
logline_pre = f'url={full_url}'
logline_post = " ,".join((logline_pre, 'success={}, status_code={}, message={}, url={}'))

Expand All @@ -121,7 +87,6 @@ def get(self, endpoint: str, ep_params: Dict = None, data: Dict = None) -> MlbRe
self._logger.debug(msg=logline_post.format('success',
response.status_code, response.reason, response.url))

data = self._transform_keys_in_data(data)
return MlbResult(response.status_code, message=response.reason, data=data)

elif response.status_code >= 400 and response.status_code <= 499:
Expand Down
17 changes: 8 additions & 9 deletions mlbstatsapi/mlb_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,14 @@ def create_split_data(stat_data: dict) -> dict:
if 'splits' in stat and stat['splits']:
split_data = return_splits(stat['splits'], stat_type, stat_group)
stat_object = Stat(group=stat_group, type=stat_type,
totalsplits=total_splits, splits=split_data)
totalSplits=total_splits, splits=split_data)
else:
continue

if stat_group not in stats:
stats[stat_group] = {}

stats[stat_group][stat_type.lower()] = stat_object
stats[stat_group][stat_type] = stat_object

return stats

Expand All @@ -137,26 +137,25 @@ def get_stat_attributes(stats) -> str:
-------
(stat_type, stat_group)
"""
if 'type' in stats and 'displayname' in stats['type']:
stat_type = stats['type']['displayname']
if 'type' in stats and 'displayName' in stats['type']:
stat_type = stats['type']['displayName']
else:
stat_type = 'gameLog'

# default to stats if no group returned
if 'group' in stats and 'displayname' in stats['group']:
stat_group = stats['group']['displayname']
if 'group' in stats and 'displayName' in stats['group']:
stat_group = stats['group']['displayName']
else:
# if stat_type is None return None
if stat_type:
stat_group = 'stats'
else:
stat_group = None

if 'totalsplits' in stats:
total_splits = stats['totalsplits']
if 'totalSplits' in stats:
total_splits = stats['totalSplits']
else:
total_splits = len(stats['splits'])

return (stat_type, stat_group, total_splits)


2 changes: 1 addition & 1 deletion mlbstatsapi/models/attendances/attendance.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ class Attendance(MLBBaseModel):
aggregate_totals : AttendanceTotals
Attendance aggregate total numbers for query.
"""
aggregate_totals: AttendanceTotals = Field(alias="aggregatetotals")
aggregate_totals: AttendanceTotals = Field(alias="aggregateTotals")
records: List[AttendanceRecords] = []
70 changes: 35 additions & 35 deletions mlbstatsapi/models/attendances/attributes.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ class AttendanceHighLowGame(MLBBaseModel):
day_night : str
Time of day for game (day or night).
"""
game_pk: int = Field(alias="gamepk")
game_pk: int = Field(alias="gamePk")
link: str
content: AttendanceHighLowGameContent
day_night: str = Field(alias="daynight")
day_night: str = Field(alias="dayNight")


class AttendanceGameType(MLBBaseModel):
Expand Down Expand Up @@ -105,29 +105,29 @@ class AttendanceRecords(MLBBaseModel):
team : Team
Team.
"""
openings_total: int = Field(alias="openingstotal")
openings_total_away: int = Field(alias="openingstotalaway")
openings_total_home: int = Field(alias="openingstotalhome")
openings_total_lost: int = Field(alias="openingstotallost")
games_total: int = Field(alias="gamestotal")
games_away_total: int = Field(alias="gamesawaytotal")
games_home_total: int = Field(alias="gameshometotal")
openings_total: int = Field(alias="openingsTotal")
openings_total_away: int = Field(alias="openingsTotalAway")
openings_total_home: int = Field(alias="openingsTotalHome")
openings_total_lost: int = Field(alias="openingsTotalLost")
games_total: int = Field(alias="gamesTotal")
games_away_total: int = Field(alias="gamesAwayTotal")
games_home_total: int = Field(alias="gamesHomeTotal")
year: str
attendance_average_ytd: int = Field(alias="attendanceaverageytd")
game_type: AttendanceGameType = Field(alias="gametype")
attendance_average_ytd: int = Field(alias="attendanceAverageYtd")
game_type: AttendanceGameType = Field(alias="gameType")
team: Team
attendance_total: Optional[int] = Field(default=None, alias="attendancetotal")
attendance_average_away: Optional[int] = Field(default=None, alias="attendanceaverageaway")
attendance_average_home: Optional[int] = Field(default=None, alias="attendanceaveragehome")
attendance_high: Optional[int] = Field(default=None, alias="attendancehigh")
attendance_high_date: Optional[str] = Field(default=None, alias="attendancehighdate")
attendance_high_game: Optional[AttendanceHighLowGame] = Field(default=None, alias="attendancehighgame")
attendance_low: Optional[int] = Field(default=None, alias="attendancelow")
attendance_low_date: Optional[str] = Field(default=None, alias="attendancelowdate")
attendance_low_game: Optional[AttendanceHighLowGame] = Field(default=None, alias="attendancelowgame")
attendance_total_away: Optional[int] = Field(default=None, alias="attendancetotalaway")
attendance_total_home: Optional[int] = Field(default=None, alias="attendancetotalhome")
attendance_opening_average: Optional[int] = Field(default=None, alias="attendanceopeningaverage")
attendance_total: Optional[int] = Field(default=None, alias="attendanceTotal")
attendance_average_away: Optional[int] = Field(default=None, alias="attendanceAverageAway")
attendance_average_home: Optional[int] = Field(default=None, alias="attendanceAverageHome")
attendance_high: Optional[int] = Field(default=None, alias="attendanceHigh")
attendance_high_date: Optional[str] = Field(default=None, alias="attendanceHighDate")
attendance_high_game: Optional[AttendanceHighLowGame] = Field(default=None, alias="attendanceHighGame")
attendance_low: Optional[int] = Field(default=None, alias="attendanceLow")
attendance_low_date: Optional[str] = Field(default=None, alias="attendanceLowDate")
attendance_low_game: Optional[AttendanceHighLowGame] = Field(default=None, alias="attendanceLowGame")
attendance_total_away: Optional[int] = Field(default=None, alias="attendanceTotalAway")
attendance_total_home: Optional[int] = Field(default=None, alias="attendanceTotalHome")
attendance_opening_average: Optional[int] = Field(default=None, alias="attendanceOpeningAverage")


class AttendanceTotals(MLBBaseModel):
Expand Down Expand Up @@ -161,15 +161,15 @@ class AttendanceTotals(MLBBaseModel):
attendance_total_home : int
Attendance total home.
"""
openings_total_away: int = Field(alias="openingstotalaway")
openings_total_home: int = Field(alias="openingstotalhome")
openings_total_lost: int = Field(alias="openingstotallost")
openings_total_ytd: int = Field(alias="openingstotalytd")
attendance_average_ytd: int = Field(alias="attendanceaverageytd")
attendance_high: int = Field(alias="attendancehigh")
attendance_high_date: str = Field(alias="attendancehighdate")
attendance_total: int = Field(alias="attendancetotal")
attendance_total_away: int = Field(alias="attendancetotalaway")
attendance_total_home: int = Field(alias="attendancetotalhome")
attendance_average_away: Optional[int] = Field(default=None, alias="attendanceaverageaway")
attendance_average_home: Optional[int] = Field(default=None, alias="attendanceaveragehome")
openings_total_away: int = Field(alias="openingsTotalAway")
openings_total_home: int = Field(alias="openingsTotalHome")
openings_total_lost: int = Field(alias="openingsTotalLost")
openings_total_ytd: int = Field(alias="openingsTotalYtd")
attendance_average_ytd: int = Field(alias="attendanceAverageYtd")
attendance_high: int = Field(alias="attendanceHigh")
attendance_high_date: str = Field(alias="attendanceHighDate")
attendance_total: int = Field(alias="attendanceTotal")
attendance_total_away: int = Field(alias="attendanceTotalAway")
attendance_total_home: int = Field(alias="attendanceTotalHome")
attendance_average_away: Optional[int] = Field(default=None, alias="attendanceAverageAway")
attendance_average_home: Optional[int] = Field(default=None, alias="attendanceAverageHome")
Loading