diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 7f447d1..46a640b 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -26,6 +26,6 @@ jobs: run: | python -m pip install --upgrade pip make deps - - name: Run unit tests + - name: Run tests run: | - make test + make test-all diff --git a/.gitignore b/.gitignore index 1f00741..6a74b57 100644 --- a/.gitignore +++ b/.gitignore @@ -81,9 +81,6 @@ target/ profile_default/ ipython_config.py -# pyenv -.python-version - # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies @@ -130,4 +127,8 @@ dmypy.json # all files with "_dnm." in them like foo_dnm.py (dnm = do not merge) *_dnm.* +*_dnc.* + +.DS_Store + diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..1445aee --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.10.14 diff --git a/CHANGELOG.md b/CHANGELOG.md index 53bf6f9..13b914b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +- Removed all custom modeling +- Removed all enums +- All functions are available via import from `sleeper.api` - Replaced kwargs with optional, named keyword arguments +- Updated package requirements ## [1.7.3] @@ -73,33 +77,18 @@ All notable changes to this project will be documented in this file. ### Initial Release [Unreleased]: https://github.com/joeyagreco/sleeper/compare/v1.7.3...HEAD - [1.7.3]: https://github.com/joeyagreco/sleeper/releases/tag/v1.7.3 - [1.7.2]: https://github.com/joeyagreco/sleeper/releases/tag/v1.7.2 - [1.7.1]: https://github.com/joeyagreco/sleeper/releases/tag/v1.7.1 - [1.7.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.7.0 - [1.6.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.6.0 - [1.5.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.5.0 - [1.4.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.4.0 - [1.3.4]: https://github.com/joeyagreco/sleeper/releases/tag/v1.3.4 - [1.3.3]: https://github.com/joeyagreco/sleeper/releases/tag/v1.3.3 - [1.3.1]: https://github.com/joeyagreco/sleeper/releases/tag/v1.3.1 - [1.3.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.3.0 - [1.2.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.2.0 - [1.1.1]: https://github.com/joeyagreco/sleeper/releases/tag/v1.1.1 - [1.0.1]: https://github.com/joeyagreco/sleeper/releases/tag/v1.0.1 - [1.0.0]: https://github.com/joeyagreco/sleeper/releases/tag/v1.0.0 diff --git a/MANIFEST.in b/MANIFEST.in index a44dcd6..f9bd145 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1 @@ -include sleeper/app.properties -include requirements.txt \ No newline at end of file +include requirements.txt diff --git a/Makefile b/Makefile index 172aca0..8bd1e90 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,43 @@ +PYTEST_ARGS= + .PHONY: deps deps: - @python3 -m pip install -r requirements.dev.txt - @python3 -m pip install -r requirements.txt + @python -m pip install -r requirements.dev.txt + @python -m pip install -r requirements.txt .PHONY: fmt fmt: - @black --config=pyproject.toml . - @autoflake --config=pyproject.toml . - @isort . + @ruff check --fix + @ruff format .PHONY: fmt-check fmt-check: - @black --config=pyproject.toml --check . - @autoflake --config=pyproject.toml --check . - @isort --check-only . + @ruff check + @ruff format --check + +.PHONY: test-all +test-all: + @make test-unit $(PYTEST_ARGS) + @make test-integration $(PYTEST_ARGS) -.PHONY: test -test: - @pytest test/ +.PHONY: test-unit +test-unit: + @pytest test/unit $(PYTEST_ARGS) -.PHONY: up-reqs -up-reqs: - @pipreqs --force --mode no-pin +.PHONY: test-integration +test-integration: + @pytest test/integration $(PYTEST_ARGS) .PHONY: pkg-build pkg-build: @rm -rf build @rm -rf dist - @python3 setup.py sdist bdist_wheel + @python setup.py sdist bdist_wheel .PHONY: pkg-test -pkg-test: - @python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* +pkg-test: pkg-build + @python -m twine upload --repository testpypi dist/* .PHONY: pkg-prod -pkg-prod: - @python3 -m twine upload dist/* +pkg-prod: pkg-build + @python -m twine upload dist/* diff --git a/README.md b/README.md index 83b4070..61b0eb0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-sleeper logo +sleeper logo A Python wrapper for the Sleeper API. diff --git a/example/avatar_example.py b/example/avatar_example.py index 67dd369..975d36e 100644 --- a/example/avatar_example.py +++ b/example/avatar_example.py @@ -1,12 +1,18 @@ -from sleeper.api import AvatarAPIClient +from sleeper.api import get_avatar if __name__ == "__main__": - # get avatar by ID and save locally - AvatarAPIClient.get_avatar( - avatar_id="my_avatar_id", save_to_path="C:\\Desktop\\avatar\\my_avatar.png" - ) + # get avatar by ID + avatar_bytes = get_avatar(avatar_id="my_avatar_id") + + # save locally + with open( + "my_avatar.png", + "wb", + ) as file: + file.write(avatar_bytes) # can pass in the "thumbnail" parameter to get a smaller-sized avatar - AvatarAPIClient.get_avatar( - avatar_id="my_avatar_id", save_to_path="C:\\Desktop\\avatar\\my_avatar.png", thumbnail=True + get_avatar( + avatar_id="my_avatar_id", + as_thumbnail=True, ) diff --git a/example/draft_example.py b/example/draft_example.py index 635d0a6..9fec9f7 100644 --- a/example/draft_example.py +++ b/example/draft_example.py @@ -1,25 +1,25 @@ -from sleeper.api import DraftAPIClient -from sleeper.enum import Sport -from sleeper.model import Draft, DraftPick, PlayerDraftPick +from sleeper.api import ( + get_draft, + get_drafts_in_league, + get_player_draft_picks, + get_traded_draft_picks, + get_user_drafts_for_year, +) if __name__ == "__main__": - # get all drafts that a user was in for a particular year - user_drafts: list[Draft] = DraftAPIClient.get_user_drafts_for_year( - user_id="my_user_id", sport=Sport.NFL, year="2020" - ) + # get all drafts that a user was in for a year + user_drafts = get_user_drafts_for_year(user_id="my_user_id", sport="nfl", year=2020) - # get all drafts for a particular league - league_drafts: list[Draft] = DraftAPIClient.get_drafts_in_league(league_id="my_league_id") + # get all drafts for a league + league_drafts = get_drafts_in_league(league_id="my_league_id") # get a draft by its ID - draft: Draft = DraftAPIClient.get_draft(draft_id="my_draft_id") + draft = get_draft(draft_id="my_draft_id") - # get all draft picks for a particular draft - draft_picks: list[PlayerDraftPick] = DraftAPIClient.get_player_draft_picks( - draft_id="my_draft_id", sport=Sport.NFL + # get all draft picks for a draft + draft_picks = get_player_draft_picks( + draft_id="my_draft_id", ) - # get all traded draft picks for a particular draft - traded_draft_picks: list[DraftPick] = DraftAPIClient.get_traded_draft_picks( - draft_id="my_draft_id" - ) + # get all traded draft picks for a draft + traded_draft_picks = get_traded_draft_picks(draft_id="my_draft_id") diff --git a/example/league_example.py b/example/league_example.py index a9d4f6e..0df9df2 100644 --- a/example/league_example.py +++ b/example/league_example.py @@ -1,53 +1,45 @@ -from sleeper.api import LeagueAPIClient -from sleeper.enum import Sport -from sleeper.model import ( - League, - Matchup, - PlayoffMatchup, - Roster, - SportState, - TradedPick, - Transaction, - User, +from sleeper.api import ( + get_league, + get_losers_bracket, + get_matchups_for_week, + get_rosters, + get_sport_state, + get_traded_picks, + get_transactions, + get_user_leagues_for_year, + get_users_in_league, + get_winners_bracket, ) if __name__ == "__main__": # get a league by its ID - league: League = LeagueAPIClient.get_league(league_id="my_league_id") + league = get_league(league_id="my_league_id") - # get all leagues for a user by its ID in a particular year - user_leagues: list[League] = LeagueAPIClient.get_user_leagues_for_year( - user_id="my_user_id", sport=Sport.NFL, year="2020" + # get all leagues for a user by its ID in a year + user_leagues = get_user_leagues_for_year( + user_id="my_user_id", sport="nfl", year=2023 ) - # get all rosters in a particular league - league_rosters: list[Roster] = LeagueAPIClient.get_rosters(league_id="my_league_id") + # get all rosters in a league + league_rosters = get_rosters(league_id="my_league_id") - # get all users in a particular league - league_users: list[User] = LeagueAPIClient.get_users_in_league(league_id="my_league_id") + # get all users in a league + league_users = get_users_in_league(league_id="my_league_id") - # get all matchups in a week for a particular league - week_1_matchups: list[Matchup] = LeagueAPIClient.get_matchups_for_week( - league_id="my_league_id", week=1 - ) + # get all matchups in a week for a league + week_1_matchups = get_matchups_for_week(league_id="my_league_id", week=1) - # get the winners bracket for a particular league - winners_bracket: list[PlayoffMatchup] = LeagueAPIClient.get_winners_bracket( - league_id="my_league_id" - ) + # get the winners bracket for a league + winners_bracket = get_winners_bracket(league_id="my_league_id") - # get the losers bracket for a particular league - losers_bracket: list[PlayoffMatchup] = LeagueAPIClient.get_losers_bracket( - league_id="my_league_id" - ) + # get the losers bracket for a league + losers_bracket = get_losers_bracket(league_id="my_league_id") - # get all transactions in a week for a particular league - week_1_transactions: list[Transaction] = LeagueAPIClient.get_transactions( - league_id="my_league_id", week=1 - ) + # get all transactions in a week for a league + week_1_transactions = get_transactions(league_id="my_league_id", week=1) - # get all traded picks for a particular league - traded_picks: list[TradedPick] = LeagueAPIClient.get_traded_picks(league_id="my_league_id") + # get all traded picks for a league + traded_picks = get_traded_picks(league_id="my_league_id") - # get the state of a particular sport - nfl_state: SportState = LeagueAPIClient.get_sport_state(sport=Sport.NFL) + # get the state of a sport + nfl_state = get_sport_state(sport="nfl") diff --git a/example/player_example.py b/example/player_example.py index 788281b..14ad862 100644 --- a/example/player_example.py +++ b/example/player_example.py @@ -1,17 +1,11 @@ -from sleeper.api import PlayerAPIClient -from sleeper.enum import Sport, TrendType -from sleeper.model import Player, PlayerTrend +from sleeper.api import get_all_players, get_trending_players if __name__ == "__main__": - # get all players in a particular sport - nfl_players: dict[str, Player] = PlayerAPIClient.get_all_players(sport=Sport.NFL) + # get all players in a sport + nfl_players = get_all_players(sport="nfl") - # get all trending players that were added for a particular sport - nfl_added_trending_players: list[PlayerTrend] = PlayerAPIClient.get_trending_players( - sport=Sport.NFL, trend_type=TrendType.ADD - ) + # get players that are trending up in a sport + nfl_trending_up_players = get_trending_players(sport="nfl", trend_type="add") - # get all trending players that were dropped for a particular sport - nfl_dropped_trending_players: list[PlayerTrend] = PlayerAPIClient.get_trending_players( - sport=Sport.NFL, trend_type=TrendType.DROP - ) + # get players that are trending down in a sport + nfl_trending_down_players = get_trending_players(sport="nfl", trend_type="drop") diff --git a/example/unofficial/player_example.py b/example/unofficial/player_example.py deleted file mode 100644 index f4bf608..0000000 --- a/example/unofficial/player_example.py +++ /dev/null @@ -1,51 +0,0 @@ -from sleeper.api.unofficial import UPlayerAPIClient -from sleeper.enum import Sport -from sleeper.enum.nfl import NFLPosition -from sleeper.model import PlayerStats - -if __name__ == "__main__": - # get player stats for a player for a particular sport, week, and season - player_stats_week: PlayerStats = UPlayerAPIClient.get_player_stats( - sport=Sport.NFL, player_id="1234", season="2020", week=1 - ) - - # get player stats for a player for the entire season in a particular sport and season - player_stats_season: PlayerStats = UPlayerAPIClient.get_player_stats( - sport=Sport.NFL, player_id="1234", season="2020" - ) - - # get player projections for a player for a particular sport, week, and season - player_projections_week: PlayerStats = UPlayerAPIClient.get_player_projections( - sport=Sport.NFL, player_id="1234", season="2020", week=1 - ) - - # get player projections for a player for the entire season in a particular sport and season - player_projections_season: PlayerStats = UPlayerAPIClient.get_player_projections( - sport=Sport.NFL, player_id="1234", season="2020" - ) - - # get all player stats for a particular sport, season, and week - all_player_stats: list[PlayerStats] = UPlayerAPIClient.get_all_player_stats( - sport=Sport.NFL, season="2020", week=1 - ) - - # get all player stats for QBs and RBs for a particular sport, season, and week - all_player_stats_qbs_rbs: list[PlayerStats] = UPlayerAPIClient.get_all_player_stats( - sport=Sport.NFL, season="2020", week=1, positions=[NFLPosition.QB, NFLPosition.RB] - ) - - # get all player projections for a particular sport, season, and week - all_player_projections: list[PlayerStats] = UPlayerAPIClient.get_all_player_projections( - sport=Sport.NFL, season="2020", week=1 - ) - - # get all player projections for QBs and RBs for a particular sport, season, and week - all_player_projections_qbs_rbs: list[PlayerStats] = UPlayerAPIClient.get_all_player_projections( - sport=Sport.NFL, season="2020", week=1, positions=[NFLPosition.QB, NFLPosition.RB] - ) - - # get a player's headshot and save locally - # the file path should save to a file that has the extension '.png' - UPlayerAPIClient.get_player_head_shot( - sport=Sport.NFL, player_id="1234", save_to_path="C:\\Desktop\\avatar\\my_headshot.png" - ) diff --git a/example/unofficial/sport_example.py b/example/unofficial/sport_example.py deleted file mode 100644 index e1b2499..0000000 --- a/example/unofficial/sport_example.py +++ /dev/null @@ -1,9 +0,0 @@ -from sleeper.api.unofficial import USportAPIClient -from sleeper.enum import Sport -from sleeper.model import Game - -if __name__ == "__main__": - # get regular season schedule for a particular sport and season - regular_season: list[Game] = USportAPIClient.get_regular_season_schedule( - sport=Sport.NFL, season="2020" - ) diff --git a/example/unofficial/team_example.py b/example/unofficial/team_example.py deleted file mode 100644 index c5b2510..0000000 --- a/example/unofficial/team_example.py +++ /dev/null @@ -1,8 +0,0 @@ -from sleeper.api.unofficial import UTeamAPIClient -from sleeper.enum import Sport -from sleeper.enum.nfl import NFLTeam -from sleeper.model import DepthChart - -if __name__ == "__main__": - # get depth chart for a particular sport and team - depth_chart: DepthChart = UTeamAPIClient.get_team_depth_chart(sport=Sport.NFL, team=NFLTeam.GB) diff --git a/example/user_example.py b/example/user_example.py index c71a08c..418b71d 100644 --- a/example/user_example.py +++ b/example/user_example.py @@ -1,9 +1,8 @@ -from sleeper.api import UserAPIClient -from sleeper.model import User +from sleeper.api import get_user if __name__ == "__main__": # get a user by username - user_1: User = UserAPIClient.get_user(username="my_username") + user_1 = get_user(identifier="my_username") # get a user by ID - user_2: User = UserAPIClient.get_user(user_id="my_user_id") + user_2 = get_user(identifier="my_user_id") diff --git a/img/sleeper.png b/img/sleeper.png new file mode 100644 index 0000000..2ccef46 Binary files /dev/null and b/img/sleeper.png differ diff --git a/pyproject.toml b/pyproject.toml index 115d291..e4dfe47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,15 +1,2 @@ -[tool.black] -line-length = 100 -skip-magic-trailing-comma = true -include = '\.py$' -quiet = true - -[tool.isort] -profile = "black" -line_length = 100 - -[autoflake] -ignore_init_module_imports = true -in_place = true -recursive = true -remove_all_unused_imports = true \ No newline at end of file +[tool.ruff.lint] +select = [ "I001", "F401" ] diff --git a/requirements.dev.txt b/requirements.dev.txt index f60ecc3..d1b3f44 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -1,6 +1,4 @@ -black==23.3.0 -autoflake==2.1.1 -isort==5.12.0 -pytest==7.4.3 -twine==4.0.2 -wheel==0.42.0 \ No newline at end of file +pytest==8.3.3 +twine==5.1.1 +wheel==0.44.0 +ruff~=0.6.7 diff --git a/requirements.txt b/requirements.txt index 014492b..dcab5d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1 @@ -Pillow -Pillow -Requests -setuptools +requests~=2.32.3 diff --git a/setup.py b/setup.py index d113dbe..a98c0f1 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ license="MIT", url="https://github.com/joeyagreco/sleeper", include_package_data=True, - packages=setuptools.find_packages(exclude=("test", "docs")), + packages=setuptools.find_packages(exclude=("test",)), install_requires=required_packages, python_requires=f">={minimum_python_version_required}", keywords="nfl football sleeper sleeper-api sleeper-fantasy-football fantasy-football wrapper wrapper-api", diff --git a/sleeper/_version.py b/sleeper/_version.py index b359ecf..856644b 100644 --- a/sleeper/_version.py +++ b/sleeper/_version.py @@ -1,4 +1,4 @@ -__version__ = "1.7.3" +__version__ = "2.0.0" # minimum supported Python version __version_minimum_python__ = "3.10" diff --git a/sleeper/api/AvatarAPIClient.py b/sleeper/api/AvatarAPIClient.py deleted file mode 100644 index a573e1f..0000000 --- a/sleeper/api/AvatarAPIClient.py +++ /dev/null @@ -1,14 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient - - -class AvatarAPIClient(SleeperAPIClient): - @classmethod - def get_avatar(cls, *, avatar_id: str, save_to_path: str, thumbnail: bool = False) -> None: - if thumbnail: - url = cls._build_route( - cls._SLEEPER_CDN_BASE_URL, None, cls._AVATARS_ROUTE, cls._THUMBS_ROUTE, avatar_id - ) - else: - url = cls._build_route(cls._SLEEPER_CDN_BASE_URL, None, cls._AVATARS_ROUTE, avatar_id) - image_file = cls._get_image_file(url) - image_file.save(save_to_path) diff --git a/sleeper/api/DraftAPIClient.py b/sleeper/api/DraftAPIClient.py deleted file mode 100644 index 3ddb22a..0000000 --- a/sleeper/api/DraftAPIClient.py +++ /dev/null @@ -1,69 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.enum.Sport import Sport -from sleeper.model.Draft import Draft -from sleeper.model.DraftPick import DraftPick -from sleeper.model.PlayerDraftPick import PlayerDraftPick - - -class DraftAPIClient(SleeperAPIClient): - @classmethod - def get_user_drafts_for_year(cls, *, user_id: str, sport: Sport, year: str) -> list[Draft]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._USER_ROUTE, - user_id, - cls._DRAFTS_ROUTE, - sport.name.lower(), - year, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError( - f"Could not get Drafts for user_id '{user_id}', sport '{sport.name}', and year '{year}'." - ) - return Draft.from_dict_list(response_list) - - @classmethod - def get_drafts_in_league(cls, *, league_id: str) -> list[Draft]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._LEAGUE_ROUTE, league_id, cls._DRAFTS_ROUTE - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get Drafts for league_id '{league_id}'.") - return Draft.from_dict_list(cls._get(url)) - - @classmethod - def get_draft(cls, *, draft_id: str) -> Draft: - url = cls._build_route(cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._DRAFT_ROUTE, draft_id) - response_dict = cls._get(url) - if response_dict is None: - raise ValueError(f"Could not get Draft with draft_id '{draft_id}'.") - return Draft.from_dict(cls._get(url)) - - @classmethod - def get_player_draft_picks(cls, *, draft_id: str, sport: Sport) -> list[PlayerDraftPick]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._DRAFT_ROUTE, draft_id, cls._PICKS_ROUTE - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError( - f"Could not get PlayerDraftPicks with draft_id '{draft_id}' and sport '{sport.name}'." - ) - return PlayerDraftPick.from_dict_list(cls._get(url), sport) - - @classmethod - def get_traded_draft_picks(cls, *, draft_id: str) -> list[DraftPick]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._DRAFT_ROUTE, - draft_id, - cls._TRADED_PICKS_ROUTE, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get traded DraftPicks with draft_id '{draft_id}'.") - return DraftPick.from_dict_list(cls._get(url)) diff --git a/sleeper/api/LeagueAPIClient.py b/sleeper/api/LeagueAPIClient.py deleted file mode 100644 index 0af3c82..0000000 --- a/sleeper/api/LeagueAPIClient.py +++ /dev/null @@ -1,150 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.enum.Sport import Sport -from sleeper.model.League import League -from sleeper.model.Matchup import Matchup -from sleeper.model.PlayoffMatchup import PlayoffMatchup -from sleeper.model.Roster import Roster -from sleeper.model.SportState import SportState -from sleeper.model.TradedPick import TradedPick -from sleeper.model.Transaction import Transaction -from sleeper.model.User import User - - -class LeagueAPIClient(SleeperAPIClient): - @classmethod - def get_league(cls, *, league_id: str) -> League: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._LEAGUE_ROUTE, league_id - ) - response_dict = cls._get(url) - if response_dict is None: - raise ValueError(f"Could not get League with league_id '{league_id}'.") - return League.from_dict(response_dict) - - @classmethod - def get_user_leagues_for_year(cls, *, user_id: str, sport: Sport, year: str) -> list[League]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._USER_ROUTE, - user_id, - cls._LEAGUES_ROUTE, - sport.value.lower(), - year, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError( - f"Could not get user Leagues for user_id '{user_id}', sport '{sport.name}', and year '{year}'." - ) - return League.from_dict_list(response_list) - - @classmethod - def get_rosters(cls, *, league_id: str) -> list[Roster]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._LEAGUE_ROUTE, - league_id, - cls._ROSTERS_ROUTE, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get Rosters for league_id '{league_id}'.") - return Roster.from_dict_list(response_list) - - @classmethod - def get_users_in_league(cls, *, league_id: str) -> list[User]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._LEAGUE_ROUTE, league_id, cls._USERS_ROUTE - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get Users for league_id '{league_id}'.") - return User.from_dict_list(response_list) - - @classmethod - def get_matchups_for_week(cls, *, league_id: str, week: int) -> list[Matchup]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._LEAGUE_ROUTE, - league_id, - cls._MATCHUPS_ROUTE, - week, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError( - f"Could not get Matchups for league_id '{league_id}' and week '{week}'." - ) - return Matchup.from_dict_list(response_list) - - @classmethod - def get_winners_bracket(cls, *, league_id: str) -> list[PlayoffMatchup]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._LEAGUE_ROUTE, - league_id, - cls._WINNERS_BRACKET_ROUTE, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get PlayoffMatchups for league_id '{league_id}'.") - return PlayoffMatchup.from_dict_str(response_list) - - @classmethod - def get_losers_bracket(cls, *, league_id: str) -> list[PlayoffMatchup]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._LEAGUE_ROUTE, - league_id, - cls._LOSERS_BRACKET_ROUTE, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get PlayoffMatchups for league_id '{league_id}'.") - return PlayoffMatchup.from_dict_str(response_list) - - @classmethod - def get_transactions(cls, *, league_id: str, week: int) -> list[Transaction]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._LEAGUE_ROUTE, - league_id, - cls._TRANSACTIONS_ROUTE, - week, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError( - f"Could not get Transactions for league_id '{league_id}' and week '{week}'." - ) - return Transaction.from_dict_list(response_list) - - @classmethod - def get_traded_picks(cls, *, league_id: str) -> list[TradedPick]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._LEAGUE_ROUTE, - league_id, - cls._TRADED_PICKS_ROUTE, - ) - response_list = cls._get(url) - if response_list is None: - raise ValueError(f"Could not get TradedPicks for league_id '{league_id}'.") - return TradedPick.from_dict_list(response_list) - - @classmethod - def get_sport_state(cls, *, sport: Sport) -> SportState: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._STATE_ROUTE, sport.value.lower() - ) - response_dict = cls._get(url) - if response_dict is None: - raise ValueError(f"Could not get SportState for sport '{sport.name}'.") - return SportState.from_dict(response_dict) diff --git a/sleeper/api/PlayerAPIClient.py b/sleeper/api/PlayerAPIClient.py deleted file mode 100644 index 94d138d..0000000 --- a/sleeper/api/PlayerAPIClient.py +++ /dev/null @@ -1,42 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.enum.Sport import Sport -from sleeper.enum.TrendType import TrendType -from sleeper.model.Player import Player -from sleeper.model.PlayerTrend import PlayerTrend - - -class PlayerAPIClient(SleeperAPIClient): - __DEFAULT_TRENDING_PLAYERS_LOOKBACK_HOURS = 24 - __DEFAULT_TRENDING_PLAYERS_LIMIT = 25 - - @classmethod - def get_all_players(cls, *, sport: Sport) -> dict[str, Player]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._PLAYERS_ROUTE, sport.name.lower() - ) - response_dict = cls._get(url) - if response_dict is None: - raise ValueError(f"Could not get Players for sport: '{sport.name}'.") - return Player.dict_by_id(response_dict, sport) - - @classmethod - def get_trending_players( - cls, *, sport: Sport, trend_type: TrendType, lookback_hours: int = None, limit: int = None - ) -> list[PlayerTrend]: - if lookback_hours is None: - lookback_hours = cls.__DEFAULT_TRENDING_PLAYERS_LOOKBACK_HOURS - if limit is None: - limit = cls.__DEFAULT_TRENDING_PLAYERS_LIMIT - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - cls._VERSION, - cls._PLAYERS_ROUTE, - sport.name.lower(), - cls._TRENDING_ROUTE, - trend_type.name.lower(), - ) - url = cls._add_filters(url, ("lookback_hours", lookback_hours), ("limit", limit)) - response_dict = cls._get(url) - if response_dict is None: - raise ValueError(f"Could not get PlayerTrends.") - return PlayerTrend.from_dict_list(response_dict) diff --git a/sleeper/api/SleeperAPIClient.py b/sleeper/api/SleeperAPIClient.py deleted file mode 100644 index 5b1b915..0000000 --- a/sleeper/api/SleeperAPIClient.py +++ /dev/null @@ -1,85 +0,0 @@ -import io -from abc import ABC -from typing import Optional - -import requests -from PIL import Image - -from sleeper.exception.SleeperAPIException import SleeperAPIException -from sleeper.util.ConfigReader import ConfigReader - - -class SleeperAPIClient(ABC): - """ - Should be inherited by all API Clients. - - Sleeper API Documentation: https://docs.sleeper.app/ - """ - - _SLEEPER_APP_BASE_URL = ConfigReader.get("api", "sleeper_app_base_url") - _SLEEPER_CDN_BASE_URL = ConfigReader.get("api", "sleeper_cdn_base_url") - _VERSION = ConfigReader.get("api", "version") - - # ROUTES - _AVATARS_ROUTE = ConfigReader.get("api", "avatars_route") - _CONTENT_ROUTE = ConfigReader.get("api", "content_route") - _DEPTH_CHART_ROUTE = ConfigReader.get("api", "depth_chart_route") - _DRAFT_ROUTE = ConfigReader.get("api", "draft_route") - _DRAFTS_ROUTE = ConfigReader.get("api", "drafts_route") - _LEAGUE_ROUTE = ConfigReader.get("api", "league_route") - _LEAGUES_ROUTE = ConfigReader.get("api", "leagues_route") - _LOSERS_BRACKET_ROUTE = ConfigReader.get("api", "losers_bracket_route") - _MATCHUPS_ROUTE = ConfigReader.get("api", "matchups_route") - _PICKS_ROUTE = ConfigReader.get("api", "picks_route") - _PLAYER_ROUTE = ConfigReader.get("api", "player_route") - _PLAYERS_ROUTE = ConfigReader.get("api", "players_route") - _PROJECTIONS_ROUTE = ConfigReader.get("api", "projections_route") - _ROSTERS_ROUTE = ConfigReader.get("api", "rosters_route") - _SCHEDULE_ROUTE = ConfigReader.get("api", "schedule_route") - _STATE_ROUTE = ConfigReader.get("api", "state_route") - _STATS_ROUTE = ConfigReader.get("api", "stats_route") - _THUMBS_ROUTE = ConfigReader.get("api", "thumbs_route") - _TRADED_PICKS_ROUTE = ConfigReader.get("api", "traded_picks_route") - _TRANSACTIONS_ROUTE = ConfigReader.get("api", "transactions_route") - _TRENDING_ROUTE = ConfigReader.get("api", "trending_route") - _USER_ROUTE = ConfigReader.get("api", "user_route") - _USERS_ROUTE = ConfigReader.get("api", "users_route") - _WINNERS_BRACKET_ROUTE = ConfigReader.get("api", "winners_bracket_route") - - @classmethod - def _build_route(cls, base_url: str, version: Optional[str], *args) -> str: - args = (str(arg).replace("/", "") for arg in args) - if version is not None: - return f"{base_url}/{version}/{'/'.join(args)}" - else: - return f"{base_url}/{'/'.join(args)}" - - @classmethod - def _add_filters(cls, url: str, *args) -> str: - """ - Adds filters to the given url. - """ - if len(args) > 0: - symbol = "?" - for i, arg in enumerate(args): - if i > 0: - symbol = "&" - if arg[0] is not None and arg[1] is not None: - url = f"{url}{symbol}{arg[0]}={arg[1]}" - return url - - @staticmethod - def _get(url: str) -> Optional[dict | list]: - response = requests.get(url) - response.raise_for_status() - return response.json() - - @staticmethod - def _get_image_file(url: str) -> Image: - response = requests.get(url) - response.raise_for_status() - image_bytes = response.content - if image_bytes is None: - raise SleeperAPIException(f"No image found.") - image_stream = io.BytesIO(image_bytes) - return Image.open(image_stream) diff --git a/sleeper/api/UserAPIClient.py b/sleeper/api/UserAPIClient.py deleted file mode 100644 index 0b8a418..0000000 --- a/sleeper/api/UserAPIClient.py +++ /dev/null @@ -1,17 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.model.User import User - - -class UserAPIClient(SleeperAPIClient): - @classmethod - def get_user(cls, *, username: str = None, user_id: str = None) -> User: - if username is None and user_id is None: - raise ValueError("'username' and 'user_id' cannot both be None.") - user_arg = username if username is not None else user_id - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, cls._VERSION, cls._USER_ROUTE, f"{user_arg}" - ) - response_dict = cls._get(url) - if response_dict is None: - raise ValueError(f"Could not find User for username/user_id: '{user_arg}'.") - return User.from_dict(response_dict) diff --git a/sleeper/api/__init__.py b/sleeper/api/__init__.py index cfaf7d9..7a74b52 100644 --- a/sleeper/api/__init__.py +++ b/sleeper/api/__init__.py @@ -1,5 +1,5 @@ -from .AvatarAPIClient import AvatarAPIClient -from .DraftAPIClient import DraftAPIClient -from .LeagueAPIClient import LeagueAPIClient -from .PlayerAPIClient import PlayerAPIClient -from .UserAPIClient import UserAPIClient +from sleeper.api.avatar import * # noqa +from sleeper.api.draft import * # noqa +from sleeper.api.league import * # noqa +from sleeper.api.player import * # noqa +from sleeper.api.user import * # noqa diff --git a/sleeper/api/_constants.py b/sleeper/api/_constants.py new file mode 100644 index 0000000..be2bd79 --- /dev/null +++ b/sleeper/api/_constants.py @@ -0,0 +1,29 @@ +SLEEPER_APP_BASE_URL = "https://api.sleeper.app" +SLEEPER_CDN_BASE_URL = "https://sleepercdn.com" +VERSION = "v1" + +# ROUTES +AVATARS_ROUTE = "/avatars" +CONTENT_ROUTE = "/content" +DEPTH_CHART_ROUTE = "/depth-chart" +DRAFT_ROUTE = "/draft" +DRAFTS_ROUTE = "/drafts" +LEAGUE_ROUTE = "/league" +LEAGUES_ROUTE = "/leagues" +LOSERS_BRACKET_ROUTE = "/losers_bracket" +MATCHUPS_ROUTE = "/matchups" +PICKS_ROUTE = "/picks" +PLAYER_ROUTE = "/player" +PLAYERS_ROUTE = "/players" +PROJECTIONS_ROUTE = "/projections" +ROSTERS_ROUTE = "/rosters" +SCHEDULE_ROUTE = "/schedule" +STATE_ROUTE = "/state" +STATS_ROUTE = "/stats" +THUMBS_ROUTE = "/thumbs" +TRADED_PICKS_ROUTE = "/traded_picks" +TRANSACTIONS_ROUTE = "/transactions" +TRENDING_ROUTE = "/trending" +USER_ROUTE = "/user" +USERS_ROUTE = "/users" +WINNERS_BRACKET_ROUTE = "/winners_bracket" diff --git a/sleeper/api/_types.py b/sleeper/api/_types.py new file mode 100644 index 0000000..d1767d1 --- /dev/null +++ b/sleeper/api/_types.py @@ -0,0 +1,4 @@ +from typing import Literal + +Sport = Literal["lcs", "nba", "nfl"] +TrendType = Literal["add", "drop"] diff --git a/sleeper/api/_utils.py b/sleeper/api/_utils.py new file mode 100644 index 0000000..3a9a6f0 --- /dev/null +++ b/sleeper/api/_utils.py @@ -0,0 +1,37 @@ +from typing import Any + +import requests + + +def build_route(base_url: str, *paths: str | int) -> str: + if base_url.endswith("/"): + base_url = base_url[:-1] + + paths = tuple(str(p).strip("/") for p in paths) + url = f"{base_url}/{'/'.join(paths)}" + return url.strip("/") + + +def add_filters(url: str, *args: tuple[str, Any]) -> str: + """ + Adds filters to the given url. + """ + symbol = "?" + if "?" in url: + symbol = "&" + for arg in args: + url = f"{url}{symbol}{arg[0]}={arg[1]}" + symbol = "&" + return url + + +def get(url: str) -> Any: + response = requests.get(url) + response.raise_for_status() + return response.json() + + +def get_content(url: str) -> bytes: + response = requests.get(url) + response.raise_for_status() + return response.content diff --git a/sleeper/api/avatar.py b/sleeper/api/avatar.py new file mode 100644 index 0000000..71e28c0 --- /dev/null +++ b/sleeper/api/avatar.py @@ -0,0 +1,16 @@ +from sleeper.api._constants import AVATARS_ROUTE, SLEEPER_CDN_BASE_URL, THUMBS_ROUTE +from sleeper.api._utils import build_route, get_content + + +def get_avatar(*, avatar_id: str, as_thumbnail: bool = False) -> bytes: + if as_thumbnail: + url = build_route( + SLEEPER_CDN_BASE_URL, + AVATARS_ROUTE, + THUMBS_ROUTE, + avatar_id, + ) + else: + url = build_route(SLEEPER_CDN_BASE_URL, AVATARS_ROUTE, avatar_id) + + return get_content(url) diff --git a/sleeper/api/draft.py b/sleeper/api/draft.py new file mode 100644 index 0000000..337c06a --- /dev/null +++ b/sleeper/api/draft.py @@ -0,0 +1,66 @@ +from sleeper.api._constants import ( + DRAFT_ROUTE, + DRAFTS_ROUTE, + LEAGUE_ROUTE, + PICKS_ROUTE, + SLEEPER_APP_BASE_URL, + TRADED_PICKS_ROUTE, + USER_ROUTE, + VERSION, +) +from sleeper.api._types import Sport +from sleeper.api._utils import build_route, get + + +def get_user_drafts_for_year(*, user_id: str, sport: Sport, year: int) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + USER_ROUTE, + user_id, + DRAFTS_ROUTE, + sport, + year, + ) + ) + + +def get_drafts_in_league(*, league_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + DRAFTS_ROUTE, + ) + ) + + +def get_draft(*, draft_id: str) -> dict: + return get(build_route(SLEEPER_APP_BASE_URL, VERSION, DRAFT_ROUTE, draft_id)) + + +def get_player_draft_picks(*, draft_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + DRAFT_ROUTE, + draft_id, + PICKS_ROUTE, + ) + ) + + +def get_traded_draft_picks(*, draft_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + DRAFT_ROUTE, + draft_id, + TRADED_PICKS_ROUTE, + ) + ) diff --git a/sleeper/api/league.py b/sleeper/api/league.py new file mode 100644 index 0000000..eb6b6b9 --- /dev/null +++ b/sleeper/api/league.py @@ -0,0 +1,125 @@ +from sleeper.api._constants import ( + LEAGUE_ROUTE, + LEAGUES_ROUTE, + LOSERS_BRACKET_ROUTE, + MATCHUPS_ROUTE, + ROSTERS_ROUTE, + SLEEPER_APP_BASE_URL, + STATE_ROUTE, + TRADED_PICKS_ROUTE, + TRANSACTIONS_ROUTE, + USER_ROUTE, + USERS_ROUTE, + VERSION, + WINNERS_BRACKET_ROUTE, +) +from sleeper.api._types import Sport +from sleeper.api._utils import build_route, get + + +def get_league(*, league_id: str) -> dict: + return get(build_route(SLEEPER_APP_BASE_URL, VERSION, LEAGUE_ROUTE, league_id)) + + +def get_user_leagues_for_year(*, user_id: str, sport: Sport, year: int) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + USER_ROUTE, + user_id, + LEAGUES_ROUTE, + sport, + year, + ) + ) + + +def get_rosters(*, league_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + ROSTERS_ROUTE, + ) + ) + + +def get_users_in_league(*, league_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + USERS_ROUTE, + ) + ) + + +def get_matchups_for_week(*, league_id: str, week: int) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + MATCHUPS_ROUTE, + week, + ) + ) + + +def get_winners_bracket(*, league_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + WINNERS_BRACKET_ROUTE, + ) + ) + + +def get_losers_bracket(*, league_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + LOSERS_BRACKET_ROUTE, + ) + ) + + +def get_transactions(*, league_id: str, week: int) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + TRANSACTIONS_ROUTE, + week, + ) + ) + + +def get_traded_picks(*, league_id: str) -> list[dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + LEAGUE_ROUTE, + league_id, + TRADED_PICKS_ROUTE, + ) + ) + + +def get_sport_state(sport: Sport) -> dict: + return get(build_route(SLEEPER_APP_BASE_URL, VERSION, STATE_ROUTE, sport)) diff --git a/sleeper/api/player.py b/sleeper/api/player.py new file mode 100644 index 0000000..252b708 --- /dev/null +++ b/sleeper/api/player.py @@ -0,0 +1,43 @@ +from typing import Optional + +from sleeper.api._constants import ( + PLAYERS_ROUTE, + SLEEPER_APP_BASE_URL, + TRENDING_ROUTE, + VERSION, +) +from sleeper.api._types import Sport, TrendType +from sleeper.api._utils import add_filters, build_route, get + + +def get_all_players(*, sport: Sport) -> dict[str, dict]: + return get( + build_route( + SLEEPER_APP_BASE_URL, + VERSION, + PLAYERS_ROUTE, + sport, + ) + ) + + +def get_trending_players( + *, + sport: Sport, + trend_type: TrendType, + lookback_hours: Optional[int] = None, + limit: Optional[int] = None, +) -> list[dict]: + url = build_route( + SLEEPER_APP_BASE_URL, + VERSION, + PLAYERS_ROUTE, + sport, + TRENDING_ROUTE, + trend_type, + ) + if lookback_hours is not None: + url = add_filters(url, ("lookback_hours", lookback_hours)) + if limit is not None: + url = add_filters(url, ("limit", limit)) + return get(url) diff --git a/sleeper/api/unofficial/UPlayerAPIClient.py b/sleeper/api/unofficial/UPlayerAPIClient.py deleted file mode 100644 index 5a2f33f..0000000 --- a/sleeper/api/unofficial/UPlayerAPIClient.py +++ /dev/null @@ -1,165 +0,0 @@ -from typing import Any, Optional - -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.enum import SeasonType -from sleeper.enum.Sport import Sport -from sleeper.model.PlayerStats import PlayerStats - - -class UPlayerAPIClient(SleeperAPIClient): - @classmethod - def get_player_stats( - cls, - *, - sport: Sport, - player_id: str, - season: str, - season_type: SeasonType = SeasonType.REGULAR, - week: Optional[int] = None, - ) -> PlayerStats: - """ - Gets player stats for the given season OR just the given week. - """ - - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - None, - cls._STATS_ROUTE, - sport.name.lower(), - cls._PLAYER_ROUTE, - player_id, - ) - url = cls._add_filters( - url, ("season_type", season_type.name.lower()), ("season", season), ("week", week) - ) - - response_dict = cls._get(url) - if response_dict is None: - error_message = f"Could not get PlayerStats for sport: '{sport.name}', player_id: '{player_id}', season_type: '{season_type}', season: '{season}'" - if week is not None: - error_message += f", week: '{week}'" - error_message += "." - raise ValueError(error_message) - return PlayerStats.from_dict(response_dict) - - @classmethod - def get_player_projections( - cls, - *, - sport: Sport, - player_id: str, - season: str, - season_type: SeasonType = SeasonType.REGULAR, - week: Optional[int] = None, - ) -> PlayerStats: - """ - Gets player projections for the given season OR just the given week. - """ - - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - None, - cls._PROJECTIONS_ROUTE, - sport.name.lower(), - cls._PLAYER_ROUTE, - player_id, - ) - url = cls._add_filters( - url, ("season_type", season_type.name.lower()), ("season", season), ("week", week) - ) - - response_dict = cls._get(url) - if response_dict is None: - error_message = f"Could not get PlayerStats for sport: '{sport.name}', player_id: '{player_id}', season_type: '{season_type}', season: '{season}'" - if week is not None: - error_message += f", week: '{week}'" - error_message += "." - raise ValueError(error_message) - return PlayerStats.from_dict(response_dict) - - @classmethod - def get_all_player_stats( - cls, - *, - sport: Sport, - season: str, - week: int, - season_type: SeasonType = SeasonType.REGULAR, - positions: list[str] = None, - ) -> list[PlayerStats]: - if positions == None: - positions = [] - - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, None, cls._STATS_ROUTE, sport.name.lower(), season, week - ) - filters: list[tuple[str, Any]] = [("season_type", season_type.name.lower())] - for position in positions: - filters.append(("position[]", position.name.upper())) - url = cls._add_filters(url, *filters) - - response_list = cls._get(url) - if response_list is None: - error_message = f"Could not get PlayerStats list for sport: '{sport.name}', season_type: '{season_type}', season: '{season}', week: '{week}'" - if week is not None: - error_message += f", week: '{week}'" - if len(positions) > 0: - error_message += f", positions: '{positions}'" - error_message += "." - raise ValueError(error_message) - return PlayerStats.from_dict_list(response_list) - - @classmethod - def get_all_player_projections( - cls, - *, - sport: Sport, - season: str, - week: int, - season_type: SeasonType = SeasonType.REGULAR, - positions: list[str] = None, - ) -> list[PlayerStats]: - if positions == None: - positions = [] - - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - None, - cls._PROJECTIONS_ROUTE, - sport.name.lower(), - season, - week, - ) - filters: list[tuple[str, Any]] = [("season_type", season_type.name.lower())] - for position in positions: - filters.append(("position[]", position.name.upper())) - url = cls._add_filters(url, *filters) - - response_list = cls._get(url) - if response_list is None: - error_message = f"Could not get PlayerStats list for sport: '{sport.name}', season_type: '{season_type}', season: '{season}', week: '{week}'" - if week is not None: - error_message += f", week: '{week}'" - if len(positions) > 0: - error_message += f", positions: '{positions}'" - error_message += "." - raise ValueError(error_message) - return PlayerStats.from_dict_list(response_list) - - @classmethod - def get_player_head_shot(cls, *, sport: Sport, player_id: str, save_to_path: str) -> None: - """ - save_to_path should end in ".png". - """ - - url = cls._build_route( - cls._SLEEPER_CDN_BASE_URL, - None, - cls._CONTENT_ROUTE, - sport.name.lower(), - cls._PLAYERS_ROUTE, - player_id, - ) - url += ".jpg" - image_file = cls._get_image_file(url) - image_file.save(save_to_path) diff --git a/sleeper/api/unofficial/USportAPIClient.py b/sleeper/api/unofficial/USportAPIClient.py deleted file mode 100644 index 87de598..0000000 --- a/sleeper/api/unofficial/USportAPIClient.py +++ /dev/null @@ -1,26 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.enum import SeasonType -from sleeper.enum.Sport import Sport -from sleeper.model.Game import Game - - -class USportAPIClient(SleeperAPIClient): - @classmethod - def get_regular_season_schedule( - cls, *, sport: Sport, season: str, season_type: SeasonType = SeasonType.REGULAR - ) -> list[Game]: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - None, - cls._SCHEDULE_ROUTE, - sport.name.lower(), - season_type.name.lower(), - season, - ) - - response_list = cls._get(url) - if response_list is None: - raise ValueError( - f"Could not get Game list for sport: '{sport.name}', season: '{season}', season_type: '{season_type.name}'." - ) - return Game.from_dict_list(response_list, sport) diff --git a/sleeper/api/unofficial/UTeamAPIClient.py b/sleeper/api/unofficial/UTeamAPIClient.py deleted file mode 100644 index 379be93..0000000 --- a/sleeper/api/unofficial/UTeamAPIClient.py +++ /dev/null @@ -1,24 +0,0 @@ -from sleeper.api.SleeperAPIClient import SleeperAPIClient -from sleeper.enum import SportTeam -from sleeper.enum.Sport import Sport -from sleeper.model.DepthChart import DepthChart - - -class UTeamAPIClient(SleeperAPIClient): - @classmethod - def get_team_depth_chart(cls, *, sport: Sport, team: SportTeam) -> DepthChart: - url = cls._build_route( - cls._SLEEPER_APP_BASE_URL, - None, - cls._PLAYERS_ROUTE, - sport.name.lower(), - team.name.lower(), - cls._DEPTH_CHART_ROUTE, - ) - - response_dict = cls._get(url) - if response_dict is None: - raise ValueError( - f"Could not get DepthChart for sport: '{sport.name}', team: '{team.name}'" - ) - return DepthChart.model(sport).from_dict(response_dict) diff --git a/sleeper/api/unofficial/__init__.py b/sleeper/api/unofficial/__init__.py deleted file mode 100644 index d0f8232..0000000 --- a/sleeper/api/unofficial/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .UPlayerAPIClient import UPlayerAPIClient -from .USportAPIClient import USportAPIClient -from .UTeamAPIClient import UTeamAPIClient diff --git a/sleeper/api/user.py b/sleeper/api/user.py new file mode 100644 index 0000000..51c51a5 --- /dev/null +++ b/sleeper/api/user.py @@ -0,0 +1,7 @@ +from sleeper.api._constants import SLEEPER_APP_BASE_URL, USER_ROUTE, VERSION +from sleeper.api._utils import build_route, get + + +def get_user(*, identifier: str) -> dict: + # identifier can be username or user id + return get(build_route(SLEEPER_APP_BASE_URL, VERSION, USER_ROUTE, f"{identifier}")) diff --git a/sleeper/app.properties b/sleeper/app.properties deleted file mode 100644 index 3c0a6c8..0000000 --- a/sleeper/app.properties +++ /dev/null @@ -1,29 +0,0 @@ -[api] -sleeper_app_base_url=https://api.sleeper.app -sleeper_cdn_base_url=https://sleepercdn.com -version=v1 -# ROUTES -avatars_route=/avatars -content_route=/content -depth_chart_route=/depth_chart -draft_route=/draft -drafts_route=/drafts -league_route=/league -leagues_route=/leagues -losers_bracket_route=/losers_bracket -matchups_route=/matchups -picks_route=/picks -player_route=/player -players_route=/players -projections_route=/projections -rosters_route=/rosters -schedule_route=/schedule -state_route=/state -stats_route=/stats -thumbs_route=/thumbs -traded_picks_route=/traded_picks -transactions_route=/transactions -trending_route=/trending -user_route=/user -users_route=/users -winners_bracket_route=/winners_bracket \ No newline at end of file diff --git a/sleeper/enum/Category.py b/sleeper/enum/Category.py deleted file mode 100644 index 59f4ff8..0000000 --- a/sleeper/enum/Category.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class Category(ModelEnum): - PROJ = "PROJ" - STAT = "STAT" - - @classmethod - def from_str(cls, s: str) -> Category: - if s.upper() == "PROJ": - return Category.PROJ - elif s.upper() == "STAT": - return Category.STAT - else: - cls._handle_unknown_value(Category, s) diff --git a/sleeper/enum/Company.py b/sleeper/enum/Company.py deleted file mode 100644 index 9926451..0000000 --- a/sleeper/enum/Company.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class Company(ModelEnum): - ROTOWIRE = "ROTOWIRE" - SPORTRADAR = "SPORTRADAR" - - @classmethod - def from_str(cls, s: str) -> Company: - if s.upper() == "ROTOWIRE": - return Company.ROTOWIRE - elif s.upper() == "SPORTRADAR": - return Company.SPORTRADAR - else: - cls._handle_unknown_value(Company, s) diff --git a/sleeper/enum/DraftStatus.py b/sleeper/enum/DraftStatus.py deleted file mode 100644 index f26bc34..0000000 --- a/sleeper/enum/DraftStatus.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class DraftStatus(ModelEnum): - COMPLETE = "COMPLETE" - PRE_DRAFT = "PRE_DRAFT" - - @classmethod - def from_str(cls, s: str) -> DraftStatus: - if s.upper() == "COMPLETE": - return DraftStatus.COMPLETE - elif s.upper() == "PRE_DRAFT": - return DraftStatus.PRE_DRAFT - else: - cls._handle_unknown_value(DraftStatus, s) diff --git a/sleeper/enum/DraftType.py b/sleeper/enum/DraftType.py deleted file mode 100644 index e8d67ec..0000000 --- a/sleeper/enum/DraftType.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class DraftType(ModelEnum): - AUCTION = "AUCTION" - LINEAR = "LINEAR" - SNAKE = "SNAKE" - - @classmethod - def from_str(cls, s: str) -> DraftType: - if s.upper() == "AUCTION": - return DraftType.AUCTION - elif s.upper() == "LINEAR": - return DraftType.LINEAR - elif s.upper() == "SNAKE": - return DraftType.SNAKE - else: - cls._handle_unknown_value(DraftType, s) diff --git a/sleeper/enum/InjuryStatus.py b/sleeper/enum/InjuryStatus.py deleted file mode 100644 index 873cc6b..0000000 --- a/sleeper/enum/InjuryStatus.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from enum import unique -from typing import Optional - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class InjuryStatus(ModelEnum): - COV = "COV" - DNR = "DNR" - DOUBTFUL = "DOUBTFUL" - IR = "IR" - NA = "NA" - OUT = "OUT" - PUP = "PUP" - QUESTIONABLE = "QUESTIONABLE" - SUS = "SUS" - - @classmethod - def from_str(cls, s: Optional[str]) -> InjuryStatus: - if s is None or s.upper() in ("NA", ""): - return InjuryStatus.NA - elif s.upper() == "COV": - return InjuryStatus.COV - elif s.upper() == "DOUBTFUL": - return InjuryStatus.DOUBTFUL - elif s.upper() == "DNR": - return InjuryStatus.DNR - elif s.upper() == "IR": - return InjuryStatus.IR - elif s.upper() == "OUT": - return InjuryStatus.OUT - elif s.upper() == "PUP": - return InjuryStatus.PUP - elif s.upper() == "QUESTIONABLE": - return InjuryStatus.QUESTIONABLE - elif s.upper() == "SUS": - return InjuryStatus.SUS - else: - cls._handle_unknown_value(InjuryStatus, s) diff --git a/sleeper/enum/ModelEnum.py b/sleeper/enum/ModelEnum.py deleted file mode 100644 index ad80d85..0000000 --- a/sleeper/enum/ModelEnum.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from enum import Enum, unique - -from sleeper.util.CustomLogger import CustomLogger - - -@unique -class ModelEnum(Enum): - """ - Should be inherited by all model enums. - """ - - ... - - @staticmethod - def _handle_unknown_value(enum_class: ModelEnum, value: str) -> None: - CustomLogger.getLogger().warning(f"Unknown value for {enum_class.__name__}: '{value}'.") diff --git a/sleeper/enum/PlayerPosition.py b/sleeper/enum/PlayerPosition.py deleted file mode 100644 index 0897e30..0000000 --- a/sleeper/enum/PlayerPosition.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from enum import Enum, unique - -from sleeper.enum.Sport import Sport - - -@unique -class PlayerPosition(Enum): - """ - Parent for all Enum positions for each sport. - """ - - ... - - @classmethod - @abstractmethod - def from_str(cls, s: str) -> PlayerPosition: - ... - - @staticmethod - def enum(sport: Sport) -> PlayerPosition: - from sleeper.enum.nfl.NFLPosition import NFLPosition - - if sport == Sport.NFL: - return NFLPosition - else: - raise ValueError(f"Cannot find PlayerPosition for sport: '{sport.name}'.") diff --git a/sleeper/enum/PlayerStatus.py b/sleeper/enum/PlayerStatus.py deleted file mode 100644 index 5483c01..0000000 --- a/sleeper/enum/PlayerStatus.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from enum import Enum, unique - -from sleeper.enum.Sport import Sport - - -@unique -class PlayerStatus(Enum): - """ - Parent for all Enum statuses for each sport. - """ - - ... - - @classmethod - @abstractmethod - def from_str(cls, s: str) -> PlayerStatus: - ... - - @staticmethod - def enum(sport: Sport) -> PlayerStatus: - from sleeper.enum.nfl.NFLPlayerStatus import NFLPlayerStatus - - if sport == Sport.NFL: - return NFLPlayerStatus - else: - raise ValueError(f"Cannot find PlayerStatus for sport: '{sport.name}'.") diff --git a/sleeper/enum/PlayoffRoundType.py b/sleeper/enum/PlayoffRoundType.py deleted file mode 100644 index cc91835..0000000 --- a/sleeper/enum/PlayoffRoundType.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class PlayoffRoundType(ModelEnum): - ONE_WEEK_PER_ROUND = "ONE_WEEK_PER_ROUND" # each round of playoffs is one week - TWO_WEEK_CHAMPIONSHIP_ROUND = "TWO_WEEK_CHAMPIONSHIP_ROUND" # each round of playoffs is one week, while the championship spans two weeks - TWO_WEEKS_PER_ROUND = "TWO_WEEKS_PER_ROUND" # each round of playoffs spans two weeks - - @classmethod - def from_int(cls, val: int) -> PlayoffRoundType: - if val == 0: - return PlayoffRoundType.ONE_WEEK_PER_ROUND - elif val == 1: - return PlayoffRoundType.TWO_WEEK_CHAMPIONSHIP_ROUND - elif val == 2: - return PlayoffRoundType.TWO_WEEKS_PER_ROUND - else: - cls._handle_unknown_value(PlayoffRoundType, str(val)) diff --git a/sleeper/enum/PracticeParticipation.py b/sleeper/enum/PracticeParticipation.py deleted file mode 100644 index eaf5101..0000000 --- a/sleeper/enum/PracticeParticipation.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -from enum import unique -from typing import Optional - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class PracticeParticipation(ModelEnum): - NA = "NA" - OUT = "OUT" - - @classmethod - def from_str(cls, s: Optional[str]) -> PracticeParticipation: - if s is None: - return PracticeParticipation.NA - elif s.upper() == "OUT": - return PracticeParticipation.OUT - else: - cls._handle_unknown_value(PracticeParticipation, s) diff --git a/sleeper/enum/RosterPosition.py b/sleeper/enum/RosterPosition.py deleted file mode 100644 index d1eec64..0000000 --- a/sleeper/enum/RosterPosition.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from enum import Enum, unique - -from sleeper.enum.nfl.NFLRosterPosition import NFLRosterPosition -from sleeper.enum.Sport import Sport - - -@unique -class RosterPosition(Enum): - """ - Parent for all Enum roster positions for each sport. - """ - - ... - - @classmethod - @abstractmethod - def from_str(cls, s: str) -> RosterPosition: - ... - - @staticmethod - def enum(sport: Sport) -> RosterPosition: - if sport == Sport.NFL: - return NFLRosterPosition - else: - raise ValueError(f"Cannot find RosterPosition for sport: '{sport.name}'.") diff --git a/sleeper/enum/ScoringType.py b/sleeper/enum/ScoringType.py deleted file mode 100644 index df64265..0000000 --- a/sleeper/enum/ScoringType.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class ScoringType(ModelEnum): - DYNASTY = "DYNASTY" - DYNASTY_PPR = "DYNASTY_PPR" - DYNASTY_TWO_QB = "DYNASTY_2QB" - HALF_PPR = "HALF_PPR" - PPR = "PPR" - STD = "STD" - TWO_QB = "2QB" - - @classmethod - def from_str(cls, s: str) -> ScoringType: - if s.upper() == "DYNASTY": - return ScoringType.DYNASTY - elif s.upper() == "DYNASTY_PPR": - return ScoringType.DYNASTY_PPR - elif s.upper() == "DYNASTY_2QB": - return ScoringType.DYNASTY_TWO_QB - elif s.upper() == "HALF_PPR": - return ScoringType.HALF_PPR - elif s.upper() == "PPR": - return ScoringType.PPR - elif s.upper() == "STD": - return ScoringType.STD - elif s.upper() == "2QB": - return ScoringType.TWO_QB - else: - cls._handle_unknown_value(ScoringType, s) diff --git a/sleeper/enum/SeasonStatus.py b/sleeper/enum/SeasonStatus.py deleted file mode 100644 index 0d08c9e..0000000 --- a/sleeper/enum/SeasonStatus.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class SeasonStatus(ModelEnum): - COMPLETE = "COMPLETE" - DRAFTING = "DRAFTING" - IN_SEASON = "IN_SEASON" - POSTPONED = "POSTPONED" - POST_SEASON = "POST_SEASON" - PRE_DRAFT = "PRE_DRAFT" - - @classmethod - def from_str(cls, s: str) -> SeasonStatus: - if s.upper() == "COMPLETE": - return SeasonStatus.COMPLETE - elif s.upper() == "DRAFTING": - return SeasonStatus.DRAFTING - elif s.upper() == "IN_SEASON": - return SeasonStatus.IN_SEASON - elif s.upper() == "POSTPONED": - return SeasonStatus.POSTPONED - elif s.upper() == "POST_SEASON": - return SeasonStatus.POST_SEASON - elif s.upper() == "PRE_DRAFT": - return SeasonStatus.PRE_DRAFT - else: - cls._handle_unknown_value(SeasonStatus, s) diff --git a/sleeper/enum/SeasonType.py b/sleeper/enum/SeasonType.py deleted file mode 100644 index 6615479..0000000 --- a/sleeper/enum/SeasonType.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class SeasonType(ModelEnum): - OFF = "OFF" - POST = "POST" - PRE = "PRE" - REGULAR = "REGULAR" - - @classmethod - def from_str(cls, s: str) -> SeasonType: - if s.upper() == "OFF": - return SeasonType.OFF - elif s.upper() == "POST": - return SeasonType.POST - elif s.upper() == "PRE": - return SeasonType.PRE - elif s.upper() == "REGULAR": - return SeasonType.REGULAR - else: - cls._handle_unknown_value(SeasonType, s) diff --git a/sleeper/enum/Sport.py b/sleeper/enum/Sport.py deleted file mode 100644 index 75fee66..0000000 --- a/sleeper/enum/Sport.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class Sport(ModelEnum): - LCS = "LCS" - NBA = "NBA" - NFL = "NFL" - - @classmethod - def from_str(cls, s: str) -> Sport: - if s.upper() == "LCS": - return Sport.LCS - elif s.upper() == "NBA": - return Sport.NBA - elif s.upper() == "NFL": - return Sport.NFL - else: - cls._handle_unknown_value(Sport, s) diff --git a/sleeper/enum/SportTeam.py b/sleeper/enum/SportTeam.py deleted file mode 100644 index 96c757e..0000000 --- a/sleeper/enum/SportTeam.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from enum import Enum, unique - -from sleeper.enum.Sport import Sport - - -@unique -class SportTeam(Enum): - """ - Parent for all Enum teams for each sport. - """ - - ... - - @classmethod - @abstractmethod - def from_str(cls, s: str) -> SportTeam: - ... - - @staticmethod - def enum(sport: Sport) -> SportTeam: - from sleeper.enum.nfl.NFLTeam import NFLTeam - - if sport == Sport.NFL: - return NFLTeam - else: - raise ValueError(f"Cannot find SportTeam for sport: '{sport.name}'.") diff --git a/sleeper/enum/TransactionStatus.py b/sleeper/enum/TransactionStatus.py deleted file mode 100644 index 13c49e5..0000000 --- a/sleeper/enum/TransactionStatus.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class TransactionStatus(ModelEnum): - COMPLETE = "COMPLETE" - FAILED = "FAILED" - - @classmethod - def from_str(cls, s: str) -> TransactionStatus: - if s.upper() == "COMPLETE": - return TransactionStatus.COMPLETE - elif s.upper() == "FAILED": - return TransactionStatus.FAILED - else: - cls._handle_unknown_value(TransactionStatus, s) diff --git a/sleeper/enum/TransactionType.py b/sleeper/enum/TransactionType.py deleted file mode 100644 index 49c8a5e..0000000 --- a/sleeper/enum/TransactionType.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class TransactionType(ModelEnum): - FREE_AGENT = "FREE_AGENT" - TRADE = "TRADE" - WAIVER = "WAIVER" - - @classmethod - def from_str(cls, s: str) -> TransactionType: - if s.upper() == "FREE_AGENT": - return TransactionType.FREE_AGENT - elif s.upper() == "TRADE": - return TransactionType.TRADE - elif s.upper() == "WAIVER": - return TransactionType.WAIVER - else: - cls._handle_unknown_value(TransactionType, s) diff --git a/sleeper/enum/TrendType.py b/sleeper/enum/TrendType.py deleted file mode 100644 index 0f662e1..0000000 --- a/sleeper/enum/TrendType.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class TrendType(ModelEnum): - ADD = "ADD" - DROP = "DROP" - - @classmethod - def from_str(cls, s: str) -> TrendType: - if s.upper() == "ADD": - return TrendType.ADD - elif s.upper() == "DROP": - return TrendType.DROP - else: - cls._handle_unknown_value(TrendType, s) diff --git a/sleeper/enum/__init__.py b/sleeper/enum/__init__.py deleted file mode 100644 index f59aaf8..0000000 --- a/sleeper/enum/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from .Category import Category -from .Company import Company -from .DraftStatus import DraftStatus -from .DraftType import DraftType -from .InjuryStatus import InjuryStatus -from .ModelEnum import ModelEnum -from .PlayerPosition import PlayerPosition -from .PlayerStatus import PlayerStatus -from .PlayoffRoundType import PlayoffRoundType -from .PracticeParticipation import PracticeParticipation -from .RosterPosition import RosterPosition -from .ScoringType import ScoringType -from .SeasonStatus import SeasonStatus -from .SeasonType import SeasonType -from .Sport import Sport -from .SportTeam import SportTeam -from .TransactionStatus import TransactionStatus -from .TransactionType import TransactionType -from .TrendType import TrendType diff --git a/sleeper/enum/nfl/NFLPlayerStatus.py b/sleeper/enum/nfl/NFLPlayerStatus.py deleted file mode 100644 index ccfaacf..0000000 --- a/sleeper/enum/nfl/NFLPlayerStatus.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from enum import unique -from typing import Optional - -from sleeper.enum.ModelEnum import ModelEnum -from sleeper.enum.PlayerStatus import PlayerStatus - - -@unique -class NFLPlayerStatus(PlayerStatus, ModelEnum): - ACTIVE = "ACTIVE" - INACTIVE = "INACTIVE" - INJURED_RESERVE = "INJURED_RESERVE" - NA = "NA" - NON_FOOTBALL_INJURY = "NON_FOOTBALL_INJURY" - PHYSICALLY_UNABLE_TO_PERFORM = "PHYSICALLY_UNABLE_TO_PERFORM" - PRACTICE_SQUAD = "PRACTICE_SQUAD" - - @classmethod - def from_str(cls, s: Optional[str]) -> NFLPlayerStatus: - if s is None: - return NFLPlayerStatus.NA - if s.upper() == "ACTIVE": - return NFLPlayerStatus.ACTIVE - elif s.upper() == "INACTIVE": - return NFLPlayerStatus.INACTIVE - elif s.upper() == "INJURED RESERVE": - return NFLPlayerStatus.INJURED_RESERVE - elif s.upper() == "NON FOOTBALL INJURY": - return NFLPlayerStatus.NON_FOOTBALL_INJURY - elif s.upper() == "PHYSICALLY UNABLE TO PERFORM": - return NFLPlayerStatus.PHYSICALLY_UNABLE_TO_PERFORM - elif s.upper() == "PRACTICE SQUAD": - return NFLPlayerStatus.PRACTICE_SQUAD - else: - cls._handle_unknown_value(NFLPlayerStatus, s) diff --git a/sleeper/enum/nfl/NFLPosition.py b/sleeper/enum/nfl/NFLPosition.py deleted file mode 100644 index 7f02f6a..0000000 --- a/sleeper/enum/nfl/NFLPosition.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import annotations - -from enum import unique -from typing import Optional - -from sleeper.enum.ModelEnum import ModelEnum -from sleeper.enum.PlayerPosition import PlayerPosition - - -@unique -class NFLPosition(PlayerPosition, ModelEnum): - C = "C" - CB = "CB" - DB = "DB" - DE = "DE" - DEF = "DEF" - DL = "DL" - DT = "DT" - FB = "FB" - FS = "FS" - G = "G" - ILB = "ILB" - K = "K" - LB = "LB" - LEO = "LEO" - LS = "LS" - NA = "NA" - NT = "NT" - OG = "OG" - OL = "OL" - OLB = "OLB" - OT = "OT" - P = "P" - QB = "QB" - RB = "RB" - S = "S" - SS = "SS" - T = "T" - TE = "TE" - TEAM = "TEAM" - WR = "WR" - - @classmethod - def from_str(cls, s: Optional[str]) -> NFLPosition: - if s is None: - return NFLPosition.NA - elif s.upper() == "C": - return NFLPosition.C - elif s.upper() == "CB": - return NFLPosition.CB - elif s.upper() == "DB": - return NFLPosition.DB - elif s.upper() == "DE": - return NFLPosition.DE - elif s.upper() == "DEF": - return NFLPosition.DEF - elif s.upper() == "DL": - return NFLPosition.DL - elif s.upper() == "DT": - return NFLPosition.DT - elif s.upper() == "FB": - return NFLPosition.FB - elif s.upper() == "FS": - return NFLPosition.FS - elif s.upper() == "G": - return NFLPosition.G - elif s.upper() == "ILB": - return NFLPosition.ILB - elif s.upper() == "K": - return NFLPosition.K - elif s.upper() == "LB": - return NFLPosition.LB - elif s.upper() == "LEO": - return NFLPosition.LEO - elif s.upper() == "LS": - return NFLPosition.LS - elif s.upper() == "NT": - return NFLPosition.NT - elif s.upper() == "OG": - return NFLPosition.OG - elif s.upper() == "OL": - return NFLPosition.OL - elif s.upper() == "OLB": - return NFLPosition.OLB - elif s.upper() == "OT": - return NFLPosition.OT - elif s.upper() == "P": - return NFLPosition.P - elif s.upper() == "QB": - return NFLPosition.QB - elif s.upper() == "RB": - return NFLPosition.RB - elif s.upper() == "S": - return NFLPosition.S - elif s.upper() == "SS": - return NFLPosition.SS - elif s.upper() == "T": - return NFLPosition.T - elif s.upper() == "TE": - return NFLPosition.TE - elif s.upper() == "TEAM": - return NFLPosition.TEAM - elif s.upper() == "WR": - return NFLPosition.WR - else: - cls._handle_unknown_value(NFLPosition, s) diff --git a/sleeper/enum/nfl/NFLRosterPosition.py b/sleeper/enum/nfl/NFLRosterPosition.py deleted file mode 100644 index e2d522c..0000000 --- a/sleeper/enum/nfl/NFLRosterPosition.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -from enum import unique - -from sleeper.enum.ModelEnum import ModelEnum - - -@unique -class NFLRosterPosition(ModelEnum): - BN = "BN" - DEF = "DEF" - FLEX = "FLEX" - K = "K" - QB = "QB" - RB = "RB" - SUPER_FLEX = "SUPER_FLEX" - TE = "TE" - WR = "WR" - - @classmethod - def from_str(cls, s: str) -> NFLRosterPosition: - if s.upper() == "BN": - return NFLRosterPosition.BN - elif s.upper() == "DEF": - return NFLRosterPosition.DEF - elif s.upper() == "FLEX": - return NFLRosterPosition.FLEX - elif s.upper() == "K": - return NFLRosterPosition.K - elif s.upper() == "QB": - return NFLRosterPosition.QB - elif s.upper() == "RB": - return NFLRosterPosition.RB - elif s.upper() == "SUPER_FLEX": - return NFLRosterPosition.SUPER_FLEX - elif s.upper() == "TE": - return NFLRosterPosition.TE - elif s.upper() == "WR": - return NFLRosterPosition.WR - else: - cls._handle_unknown_value(NFLRosterPosition, s) diff --git a/sleeper/enum/nfl/NFLTeam.py b/sleeper/enum/nfl/NFLTeam.py deleted file mode 100644 index c394890..0000000 --- a/sleeper/enum/nfl/NFLTeam.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import annotations - -from enum import unique -from typing import Optional - -from sleeper.enum.ModelEnum import ModelEnum -from sleeper.enum.SportTeam import SportTeam - - -@unique -class NFLTeam(SportTeam, ModelEnum): - ARI = "ARI" - ATL = "ATL" - BAL = "BAL" - BUF = "BUF" - CAR = "CAR" - CHI = "CHI" - CIN = "CIN" - CLE = "CLE" - DAL = "DAL" - DEN = "DEN" - DET = "DET" - GB = "GB" - HOU = "HOU" - IND = "IND" - OAK = "OAK" - JAX = "JAX" - KC = "KC" - LV = "LV" - LAC = "LAC" - LAR = "LAR" - MIA = "MIA" - MIN = "MIN" - NA = "NA" - NE = "NE" - NO = "NO" - NYG = "NYG" - NYJ = "NYJ" - PHI = "PHI" - PIT = "PIT" - SF = "SF" - SEA = "SEA" - TB = "TB" - TEN = "TEN" - WAS = "WAS" - - @classmethod - def from_str(cls, s: Optional[str]) -> NFLTeam: - if s is None: - return NFLTeam.NA - elif s.upper() == "ARI": - return NFLTeam.ARI - elif s.upper() == "ATL": - return NFLTeam.ATL - elif s.upper() == "BAL": - return NFLTeam.BAL - elif s.upper() == "BUF": - return NFLTeam.BUF - elif s.upper() == "CAR": - return NFLTeam.CAR - elif s.upper() == "CHI": - return NFLTeam.CHI - elif s.upper() == "CIN": - return NFLTeam.CIN - elif s.upper() == "CLE": - return NFLTeam.CLE - elif s.upper() == "DAL": - return NFLTeam.DAL - elif s.upper() == "DEN": - return NFLTeam.DEN - elif s.upper() == "DET": - return NFLTeam.DET - elif s.upper() == "GB": - return NFLTeam.GB - elif s.upper() == "HOU": - return NFLTeam.HOU - elif s.upper() == "IND": - return NFLTeam.IND - elif s.upper() == "JAX": - return NFLTeam.JAX - elif s.upper() == "KC": - return NFLTeam.KC - elif s.upper() == "LV": - return NFLTeam.LV - elif s.upper() == "LAC": - return NFLTeam.LAC - elif s.upper() == "LAR": - return NFLTeam.LAR - elif s.upper() == "MIA": - return NFLTeam.MIA - elif s.upper() == "MIN": - return NFLTeam.MIN - elif s.upper() == "NE": - return NFLTeam.NE - elif s.upper() == "NO": - return NFLTeam.NO - elif s.upper() == "NYG": - return NFLTeam.NYG - elif s.upper() == "NYJ": - return NFLTeam.NYJ - elif s.upper() == "OAK": - return NFLTeam.OAK - elif s.upper() == "PHI": - return NFLTeam.PHI - elif s.upper() == "PIT": - return NFLTeam.PIT - elif s.upper() == "SF": - return NFLTeam.SF - elif s.upper() == "SEA": - return NFLTeam.SEA - elif s.upper() == "TB": - return NFLTeam.TB - elif s.upper() == "TEN": - return NFLTeam.TEN - elif s.upper() == "WAS": - return NFLTeam.WAS - else: - cls._handle_unknown_value(NFLTeam, s) diff --git a/sleeper/enum/nfl/__init__.py b/sleeper/enum/nfl/__init__.py deleted file mode 100644 index 638fc80..0000000 --- a/sleeper/enum/nfl/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .NFLPlayerStatus import NFLPlayerStatus -from .NFLPosition import NFLPosition -from .NFLRosterPosition import NFLRosterPosition -from .NFLTeam import NFLTeam diff --git a/sleeper/exception/SleeperAPIException.py b/sleeper/exception/SleeperAPIException.py deleted file mode 100644 index 3ba869f..0000000 --- a/sleeper/exception/SleeperAPIException.py +++ /dev/null @@ -1,6 +0,0 @@ -class SleeperAPIException(Exception): - """ - Raised when there is an error with the Sleeper API. - """ - - ... diff --git a/sleeper/exception/__init__.py b/sleeper/exception/__init__.py deleted file mode 100644 index ed23c90..0000000 --- a/sleeper/exception/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .SleeperAPIException import SleeperAPIException diff --git a/sleeper/model/DepthChart.py b/sleeper/model/DepthChart.py deleted file mode 100644 index 979c111..0000000 --- a/sleeper/model/DepthChart.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from dataclasses import dataclass - -from sleeper.enum import Sport - - -@dataclass(kw_only=True) -class DepthChart: - """ - Parent for all DepthChart models for each sport. - """ - - ... - - @staticmethod - def model(sport: Sport) -> DepthChart: - from sleeper.model.nfl.NFLDepthChart import NFLDepthChart - - if sport == Sport.NFL: - return NFLDepthChart - else: - raise ValueError(f"Cannot find DepthChart for sport: '{sport.name}'.") - - @staticmethod - @abstractmethod - def from_dict(d: dict) -> DepthChart: - ... diff --git a/sleeper/model/Draft.py b/sleeper/model/Draft.py deleted file mode 100644 index e5f4d17..0000000 --- a/sleeper/model/Draft.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.enum.DraftStatus import DraftStatus -from sleeper.enum.DraftType import DraftType -from sleeper.enum.SeasonType import SeasonType -from sleeper.enum.Sport import Sport -from sleeper.model.DraftMetadata import DraftMetadata -from sleeper.model.DraftSettings import DraftSettings - - -@dataclass(kw_only=True) -class Draft: - created: int - creators: list[str] - draft_id: str - draft_order: dict[str, int] - last_message_id: str - last_message_time: int - last_picked: int - league_id: str - metadata: DraftMetadata - season: str - season_type: SeasonType - settings: DraftSettings - slot_to_roster_id: dict[str, int] - sport: Sport - start_time: int - status: DraftStatus - type: DraftType - - @staticmethod - def from_dict(draft_dict: dict) -> Draft: - return Draft( - type=DraftType.from_str(draft_dict.get("type")), - status=DraftStatus.from_str(draft_dict.get("status")), - start_time=draft_dict.get("start_time"), - sport=Sport.from_str(draft_dict.get("sport")), - settings=DraftSettings.from_dict(draft_dict.get("settings")), - season_type=SeasonType.from_str(draft_dict.get("season_type")), - season=draft_dict.get("season"), - metadata=DraftMetadata.from_dict(draft_dict.get("metadata")), - league_id=draft_dict.get("league_id"), - last_picked=draft_dict.get("last_picked"), - last_message_time=draft_dict.get("last_message_time"), - last_message_id=draft_dict.get("last_message_id"), - draft_order=draft_dict.get("draft_order"), - slot_to_roster_id=draft_dict.get("slot_to_roster_id"), - draft_id=draft_dict.get("draft_id"), - creators=draft_dict.get("creators"), - created=draft_dict.get("created"), - ) - - @staticmethod - def from_dict_list(draft_dict_list: list) -> list[Draft]: - drafts = list() - for draft_dict in draft_dict_list: - drafts.append(Draft.from_dict(draft_dict)) - return drafts diff --git a/sleeper/model/DraftMetadata.py b/sleeper/model/DraftMetadata.py deleted file mode 100644 index cd25586..0000000 --- a/sleeper/model/DraftMetadata.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.enum.ScoringType import ScoringType - - -@dataclass(kw_only=True) -class DraftMetadata: - description: str - name: str - scoring_type: ScoringType - - @staticmethod - def from_dict(draft_metadata_dict: dict) -> DraftMetadata: - return DraftMetadata( - scoring_type=ScoringType.from_str(draft_metadata_dict.get("scoring_type")), - name=draft_metadata_dict.get("name"), - description=draft_metadata_dict.get("description"), - ) diff --git a/sleeper/model/DraftPick.py b/sleeper/model/DraftPick.py deleted file mode 100644 index 5f36368..0000000 --- a/sleeper/model/DraftPick.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class DraftPick: - draft_id: int - owner_id: int - previous_owner_id: int - roster_id: int - round: int - season: str - - @staticmethod - def from_dict(draft_pick_dict: dict) -> DraftPick: - return DraftPick( - season=draft_pick_dict.get("season"), - round=draft_pick_dict.get("round"), - roster_id=draft_pick_dict.get("roster_id"), - previous_owner_id=draft_pick_dict.get("previous_owner_id"), - owner_id=draft_pick_dict.get("owner_id"), - draft_id=draft_pick_dict.get("draft_id"), - ) - - @classmethod - def from_dict_list(cls, draft_pick_dict_list: list) -> list[DraftPick]: - draft_picks = list() - for draft_pick_dict in draft_pick_dict_list: - draft_picks.append(DraftPick.from_dict(draft_pick_dict)) - return draft_picks diff --git a/sleeper/model/DraftSettings.py b/sleeper/model/DraftSettings.py deleted file mode 100644 index 276e9be..0000000 --- a/sleeper/model/DraftSettings.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class DraftSettings: - alpha_sort: int - cpu_autopick: int - enforce_position_limits: int - nomination_timer: int - pick_timer: int - player_type: int - reversal_round: int - rounds: int - slots_bn: int - slots_flex: int - slots_qb: int - slots_rb: int - slots_super_flex: int - slots_te: int - slots_wr: int - teams: int - - @staticmethod - def from_dict(draft_settings_dict: dict) -> DraftSettings: - return DraftSettings( - teams=draft_settings_dict.get("teams"), - slots_wr=draft_settings_dict.get("slots_wr"), - slots_te=draft_settings_dict.get("slots_te"), - slots_rb=draft_settings_dict.get("slots_rb"), - slots_qb=draft_settings_dict.get("slots_qb"), - slots_flex=draft_settings_dict.get("slots_flex"), - slots_super_flex=draft_settings_dict.get("slots_super_flex"), - slots_bn=draft_settings_dict.get("slots_bn"), - rounds=draft_settings_dict.get("rounds"), - pick_timer=draft_settings_dict.get("pick_timer"), - reversal_round=draft_settings_dict.get("reversal_round"), - player_type=draft_settings_dict.get("player_type"), - nomination_timer=draft_settings_dict.get("nomination_timer"), - enforce_position_limits=draft_settings_dict.get("enforce_position_limits"), - cpu_autopick=draft_settings_dict.get("cpu_autopick"), - alpha_sort=draft_settings_dict.get("alpha_sort"), - ) diff --git a/sleeper/model/FAABTransaction.py b/sleeper/model/FAABTransaction.py deleted file mode 100644 index 2db6ef7..0000000 --- a/sleeper/model/FAABTransaction.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class FAABTransaction: - amount: int - receiver: int - sender: int - - @staticmethod - def from_dict(faab_transaction_dict: dict) -> FAABTransaction: - return FAABTransaction( - sender=faab_transaction_dict.get("sender"), - receiver=faab_transaction_dict.get("receiver"), - amount=faab_transaction_dict.get("amount"), - ) - - @staticmethod - def from_dict_list(faab_transaction_dict_list: list) -> list[FAABTransaction]: - faab_transactions = list() - for faab_transaction_dict in faab_transaction_dict_list: - faab_transactions.append(FAABTransaction.from_dict(faab_transaction_dict)) - return faab_transactions diff --git a/sleeper/model/FromPlayoffMatchup.py b/sleeper/model/FromPlayoffMatchup.py deleted file mode 100644 index 2a605c2..0000000 --- a/sleeper/model/FromPlayoffMatchup.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Optional - - -@dataclass(kw_only=True) -class FromPlayoffMatchup: - lost_matchup_id: int - won_matchup_id: int - - @staticmethod - def from_dict(from_playoff_matchup_object: Optional[dict]) -> Optional[FromPlayoffMatchup]: - if from_playoff_matchup_object is None: - return None - return FromPlayoffMatchup( - won_matchup_id=from_playoff_matchup_object.get("w"), - lost_matchup_id=from_playoff_matchup_object.get("l"), - ) diff --git a/sleeper/model/Game.py b/sleeper/model/Game.py deleted file mode 100644 index bcf8b65..0000000 --- a/sleeper/model/Game.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -import datetime -from dataclasses import dataclass - -from sleeper.enum import Sport, SportTeam -from sleeper.enum.SeasonStatus import SeasonStatus - - -@dataclass(kw_only=True) -class Game: - away: SportTeam - date: date - game_id: str - home: SportTeam - status: SeasonStatus - week: int - - @staticmethod - def from_dict_list(game_dict_list: list, sport: Sport) -> list[Game]: - game_list = list() - for game_dict in game_dict_list: - game_list.append(Game.from_dict(game_dict, sport)) - return game_list - - @staticmethod - def from_dict(game_dict: dict, sport: Sport) -> Game: - return Game( - week=game_dict.get("week"), - status=SeasonStatus.from_str(game_dict.get("status")), - home=SportTeam.enum(sport).from_str(game_dict.get("home")), - game_id=game_dict.get("game_id"), - date=datetime.datetime.strptime(game_dict.get("date"), "%Y-%m-%d").date(), - away=SportTeam.enum(sport).from_str(game_dict.get("away")), - ) diff --git a/sleeper/model/League.py b/sleeper/model/League.py deleted file mode 100644 index a1fb682..0000000 --- a/sleeper/model/League.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.enum.RosterPosition import RosterPosition -from sleeper.enum.SeasonStatus import SeasonStatus -from sleeper.enum.SeasonType import SeasonType -from sleeper.enum.Sport import Sport -from sleeper.model.LeagueMetadata import LeagueMetadata -from sleeper.model.LeagueSettings import LeagueSettings -from sleeper.model.ScoringSettings import ScoringSettings - - -@dataclass(kw_only=True) -class League: - avatar: str - bracket_id: int - draft_id: str - league_id: str - metadata: LeagueMetadata - name: str - previous_league_id: str - roster_positions: list[RosterPosition] - scoring_settings: ScoringSettings - season: str - season_type: SeasonType - settings: LeagueSettings - shard: int - sport: Sport - status: SeasonStatus - total_rosters: int - - @staticmethod - def from_dict(league_dict: dict) -> League: - sport = Sport.from_str(league_dict.get("sport")) - - return League( - total_rosters=league_dict.get("total_rosters"), - status=SeasonStatus.from_str(league_dict.get("status")), - sport=sport, - settings=LeagueSettings.from_dict(league_dict.get("settings")), - shard=league_dict.get("shard"), - season_type=SeasonType.from_str(league_dict.get("season_type")), - season=league_dict.get("season"), - scoring_settings=ScoringSettings.from_dict(league_dict.get("scoring_settings")), - roster_positions=[ - RosterPosition.enum(sport).from_str(roster_position) - for roster_position in league_dict.get("roster_positions") - ], - previous_league_id=league_dict.get("previous_league_id"), - name=league_dict.get("name"), - league_id=league_dict.get("league_id"), - metadata=LeagueMetadata.from_dict(league_dict.get("metadata")), - draft_id=league_dict.get("draft_id"), - avatar=league_dict.get("avatar"), - bracket_id=league_dict.get("bracket_id"), - ) - - @staticmethod - def from_dict_list(league_dict_list: list) -> list[League]: - leagues = list() - for league_dict in league_dict_list: - leagues.append(League.from_dict(league_dict)) - return leagues diff --git a/sleeper/model/LeagueMetadata.py b/sleeper/model/LeagueMetadata.py deleted file mode 100644 index d57d4b4..0000000 --- a/sleeper/model/LeagueMetadata.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class LeagueMetadata: - auto_continue: str - # this pattern for divisions is weird - # putting 8 to be safe/cover most (hopefully all) cases - division_1: str - division_1_avatar: str - division_2: str - division_2_avatar: str - division_3: str - division_3_avatar: str - division_4: str - division_4_avatar: str - division_5: str - division_5_avatar: str - division_6: str - division_6_avatar: str - division_7: str - division_7_avatar: str - division_8: str - division_8_avatar: str - keeper_deadline: str - latest_league_winner_roster_id: str - - @staticmethod - def from_dict(metadata_dict: dict) -> LeagueMetadata: - return LeagueMetadata( - auto_continue=metadata_dict.get("auto_continue"), - division_1=metadata_dict.get("division_1"), - division_1_avatar=metadata_dict.get("division_1_avatar"), - division_2=metadata_dict.get("division_2"), - division_2_avatar=metadata_dict.get("division_2_avatar"), - division_3=metadata_dict.get("division_3"), - division_3_avatar=metadata_dict.get("division_3_avatar"), - division_4=metadata_dict.get("division_4"), - division_4_avatar=metadata_dict.get("division_4_avatar"), - division_5=metadata_dict.get("division_5"), - division_5_avatar=metadata_dict.get("division_5_avatar"), - division_6=metadata_dict.get("division_6"), - division_6_avatar=metadata_dict.get("division_6_avatar"), - division_7=metadata_dict.get("division_7"), - division_7_avatar=metadata_dict.get("division_7_avatar"), - division_8=metadata_dict.get("division_8"), - division_8_avatar=metadata_dict.get("division_8_avatar"), - keeper_deadline=metadata_dict.get("keeper_deadline"), - latest_league_winner_roster_id=metadata_dict.get("latest_league_winner_roster_id"), - ) diff --git a/sleeper/model/LeagueSettings.py b/sleeper/model/LeagueSettings.py deleted file mode 100644 index 857fb12..0000000 --- a/sleeper/model/LeagueSettings.py +++ /dev/null @@ -1,110 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.enum.PlayoffRoundType import PlayoffRoundType - - -@dataclass(kw_only=True) -class LeagueSettings: - bench_lock: int - best_ball: int - capacity_override: int - commissioner_direct_invite: int - daily_waivers: int - daily_waivers_days: int - daily_waivers_hour: int - daily_waivers_last_ran: int - disable_adds: int - disable_trades: int - divisions: int - draft_rounds: int - last_report: int - last_scored_leg: int - league_average_match: int - leg: int - max_keepers: int - num_teams: int - offseason_adds: int - pick_trading: int - playoff_round_type: int - playoff_round_type_enum: PlayoffRoundType # a more clear representation of the "playoff_round_type" field - playoff_seed_type: int - playoff_teams: int - playoff_type: int - playoff_week_start: int - reserve_allow_cov: int - reserve_allow_dnr: int - reserve_allow_na: int - reserve_allow_out: int - reserve_allow_sus: int - reserve_slots: int - start_week: int - taxi_allow_vets: int - taxi_slots: int - taxi_years: int - trade_deadline: int - trade_review_days: int - type: int - waiver_bid_min: int - waiver_budget: int - waiver_clear_days: int - waiver_day_of_week: int - waiver_type: int - - @staticmethod - def from_dict(settings_dict: dict) -> LeagueSettings: - # NOTE: it seems older sleeper leagues use "playoff_type" instead of "playoff_round_type". - # if "playoff_round_type" is not present, we can use "playoff_type" to populate the enum. - playff_round_type = settings_dict.get("playoff_round_type") - playoff_type = settings_dict.get("playoff_type") - raw_playoff_round_type = ( - playff_round_type if playff_round_type is not None else playoff_type - ) - playoff_round_type_enum = PlayoffRoundType.from_int(raw_playoff_round_type) - return LeagueSettings( - waiver_type=settings_dict.get("waiver_type"), - waiver_day_of_week=settings_dict.get("waiver_day_of_week"), - waiver_clear_days=settings_dict.get("waiver_clear_days"), - waiver_budget=settings_dict.get("waiver_budget"), - type=settings_dict.get("type"), - trade_review_days=settings_dict.get("trade_review_days"), - trade_deadline=settings_dict.get("trade_deadline"), - start_week=settings_dict.get("start_week"), - reserve_slots=settings_dict.get("reserve_slots"), - reserve_allow_out=settings_dict.get("reserve_allow_out"), - playoff_week_start=settings_dict.get("playoff_week_start"), - playoff_teams=settings_dict.get("playoff_teams"), - pick_trading=settings_dict.get("pick_trading"), - offseason_adds=settings_dict.get("offseason_adds"), - num_teams=settings_dict.get("num_teams"), - max_keepers=settings_dict.get("max_keepers"), - leg=settings_dict.get("leg"), - last_scored_leg=settings_dict.get("last_scored_leg"), - last_report=settings_dict.get("last_report"), - draft_rounds=settings_dict.get("draft_rounds"), - bench_lock=settings_dict.get("bench_lock"), - best_ball=settings_dict.get("best_ball"), - capacity_override=settings_dict.get("capacity_override"), - commissioner_direct_invite=settings_dict.get("commissioner_direct_invite"), - daily_waivers=settings_dict.get("daily_waivers"), - daily_waivers_days=settings_dict.get("daily_waivers_days"), - daily_waivers_hour=settings_dict.get("daily_waivers_hour"), - daily_waivers_last_ran=settings_dict.get("daily_waivers_last_ran"), - disable_adds=settings_dict.get("disable_adds"), - disable_trades=settings_dict.get("disable_trades"), - divisions=settings_dict.get("divisions"), - league_average_match=settings_dict.get("league_average_match"), - playoff_round_type=playff_round_type, - playoff_round_type_enum=playoff_round_type_enum, - playoff_seed_type=settings_dict.get("playoff_seed_type"), - playoff_type=playoff_type, - reserve_allow_cov=settings_dict.get("reserve_allow_cov"), - reserve_allow_dnr=settings_dict.get("reserve_allow_dnr"), - reserve_allow_na=settings_dict.get("reserve_allow_na"), - reserve_allow_sus=settings_dict.get("reserve_allow_sus"), - taxi_allow_vets=settings_dict.get("taxi_allow_vets"), - taxi_slots=settings_dict.get("taxi_slots"), - taxi_years=settings_dict.get("taxi_years"), - waiver_bid_min=settings_dict.get("waiver_bid_min"), - ) diff --git a/sleeper/model/Matchup.py b/sleeper/model/Matchup.py deleted file mode 100644 index 87e80e8..0000000 --- a/sleeper/model/Matchup.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Any - - -@dataclass(kw_only=True) -class Matchup: - custom_points: Any # not sure what this is - matchup_id: int - players: list[str] - players_points: dict[str, float] - points: float - roster_id: int - starters: list[str] - starters_points: list[float] - - @staticmethod - def from_dict(matchup_object_dict: dict) -> Matchup: - return Matchup( - starters=matchup_object_dict.get("starters"), - roster_id=matchup_object_dict.get("roster_id"), - players=matchup_object_dict.get("players"), - matchup_id=matchup_object_dict.get("matchup_id"), - points=matchup_object_dict.get("points"), - custom_points=matchup_object_dict.get("custom_points"), - players_points=matchup_object_dict.get("players_points"), - starters_points=matchup_object_dict.get("starters_points"), - ) - - @staticmethod - def from_dict_list(matchup_dict_list: list) -> list[Matchup]: - matchups = list() - for matchup_dict in matchup_dict_list: - matchups.append(Matchup.from_dict(matchup_dict)) - return matchups diff --git a/sleeper/model/Player.py b/sleeper/model/Player.py deleted file mode 100644 index f923aac..0000000 --- a/sleeper/model/Player.py +++ /dev/null @@ -1,136 +0,0 @@ -from __future__ import annotations - -import datetime -from dataclasses import dataclass -from datetime import date -from typing import Any, Optional - -from sleeper.enum.InjuryStatus import InjuryStatus -from sleeper.enum.PlayerPosition import PlayerPosition -from sleeper.enum.PlayerStatus import PlayerStatus -from sleeper.enum.PracticeParticipation import PracticeParticipation -from sleeper.enum.Sport import Sport -from sleeper.enum.SportTeam import SportTeam - - -@dataclass(kw_only=True) -class Player: - active: bool - age: int - birth_city: str - birth_country: str - birth_date: date - birth_state: str - college: str - depth_chart_order: int - depth_chart_position: int - espn_id: str - fantasy_data_id: int - fantasy_positions: list[PlayerPosition] - first_name: str - gsis_id: str - hashtag: str - height: str - high_school: str - injury_body_part: str - injury_notes: str - injury_start_date: str - injury_status: InjuryStatus - last_name: str - metadata: dict[str, Any] - news_updated: int - number: int - pandascore_id: str - player_id: str - position: PlayerPosition - practice_description: str - practice_participation: PracticeParticipation - rotowire_id: int - rotoworld_id: int - search_first_name: str - search_full_name: str - search_last_name: str - search_rank: int - sport: Sport - sportradar_id: str - stats_id: str - status: PlayerStatus - swish_id: int - team: SportTeam - weight: str - yahoo_id: str - years_exp: int - - @staticmethod - def from_dict(player_dict: dict, sport: Sport) -> Optional[Player]: - if player_dict is None: - return None - given_fantasy_positions = player_dict.get("fantasy_positions") - fantasy_positions = ( - [PlayerPosition.enum(sport).from_str(pos) for pos in given_fantasy_positions] - if given_fantasy_positions is not None - else None - ) - - birth_date = ( - None - if player_dict.get("birth_date") is None - else datetime.datetime.strptime(player_dict.get("birth_date"), "%Y-%m-%d").date() - ) - - return Player( - hashtag=player_dict.get("hashtag"), - depth_chart_position=player_dict.get("depth_chart_position"), - status=PlayerStatus.enum(sport).from_str(player_dict.get("status")), - sport=sport, - fantasy_positions=fantasy_positions, - number=player_dict.get("number"), - search_last_name=player_dict.get("search_last_name"), - injury_start_date=player_dict.get("injury_start_date"), - weight=player_dict.get("weight"), - position=PlayerPosition.enum(sport).from_str(player_dict.get("position")), - practice_participation=PracticeParticipation.from_str( - player_dict.get("practice_participation") - ), - sportradar_id=player_dict.get("sportradar_id"), - team=SportTeam.enum(sport).from_str(player_dict.get("team")), - last_name=player_dict.get("last_name"), - college=player_dict.get("college"), - fantasy_data_id=player_dict.get("fantasy_data_id"), - injury_status=InjuryStatus.from_str(player_dict.get("injury_status")), - player_id=player_dict.get("player_id"), - height=player_dict.get("height"), - search_full_name=player_dict.get("search_full_name"), - age=player_dict.get("age"), - stats_id=player_dict.get("stats_id"), - birth_country=player_dict.get("birth_country"), - espn_id=player_dict.get("espn_id"), - search_rank=player_dict.get("search_rank"), - first_name=player_dict.get("first_name"), - depth_chart_order=player_dict.get("depth_chart_order"), - years_exp=player_dict.get("years_exp"), - rotowire_id=player_dict.get("rotowire_id"), - rotoworld_id=player_dict.get("rotoworld_id"), - search_first_name=player_dict.get("search_first_name"), - yahoo_id=player_dict.get("yahoo_id"), - swish_id=player_dict.get("swish_id"), - birth_city=player_dict.get("birth_city"), - injury_notes=player_dict.get("injury_notes"), - gsis_id=player_dict.get("gsis_id"), - birth_state=player_dict.get("birth_state"), - practice_description=player_dict.get("practice_description"), - pandascore_id=player_dict.get("pandascore_id"), - high_school=player_dict.get("high_school"), - news_updated=player_dict.get("news_updated"), - metadata=player_dict.get("metadata"), - injury_body_part=player_dict.get("injury_body_part"), - birth_date=birth_date, - active=player_dict.get("active"), - ) - - @staticmethod - def dict_by_id(player_dict_list: list, sport: Sport) -> dict[str, Player]: - players_by_id = dict() - for player_id in player_dict_list: - players_by_id[player_id] = Player.from_dict(player_dict_list[player_id], sport) - return players_by_id diff --git a/sleeper/model/PlayerDraftPick.py b/sleeper/model/PlayerDraftPick.py deleted file mode 100644 index 2867ad2..0000000 --- a/sleeper/model/PlayerDraftPick.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.enum.Sport import Sport -from sleeper.model.PlayerDraftPickMetadata import PlayerDraftPickMetadata - - -@dataclass(kw_only=True) -class PlayerDraftPick: - draft_id: str - draft_slot: int - is_keeper: bool - metadata: PlayerDraftPickMetadata - pick_no: int - picked_by: str - player_id: str - roster_id: str - round: int - - @staticmethod - def from_dict(player_draft_pick_dict: dict, sport: Sport) -> PlayerDraftPick: - return PlayerDraftPick( - player_id=player_draft_pick_dict.get("player_id"), - picked_by=player_draft_pick_dict.get("picked_by"), - roster_id=player_draft_pick_dict.get("roster_id"), - round=player_draft_pick_dict.get("round"), - draft_slot=player_draft_pick_dict.get("draft_slot"), - pick_no=player_draft_pick_dict.get("pick_no"), - metadata=PlayerDraftPickMetadata.from_dict( - player_draft_pick_dict.get("metadata"), sport - ), - is_keeper=player_draft_pick_dict.get("is_keeper", False), - draft_id=player_draft_pick_dict.get("draft_id"), - ) - - @staticmethod - def from_dict_list(player_draft_pick_dict_list: list, sport: Sport) -> list[PlayerDraftPick]: - player_draft_picks = list() - for player_draft_pick in player_draft_pick_dict_list: - player_draft_picks.append(PlayerDraftPick.from_dict(player_draft_pick, sport)) - return player_draft_picks diff --git a/sleeper/model/PlayerDraftPickMetadata.py b/sleeper/model/PlayerDraftPickMetadata.py deleted file mode 100644 index 6782cc6..0000000 --- a/sleeper/model/PlayerDraftPickMetadata.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.enum.InjuryStatus import InjuryStatus -from sleeper.enum.PlayerPosition import PlayerPosition -from sleeper.enum.PlayerStatus import PlayerStatus -from sleeper.enum.Sport import Sport -from sleeper.enum.SportTeam import SportTeam - - -@dataclass(kw_only=True) -class PlayerDraftPickMetadata: - first_name: str - injury_status: InjuryStatus - last_name: str - news_updated: str - number: str - player_id: str - position: PlayerPosition - sport: Sport - status: PlayerStatus - team: SportTeam - - @staticmethod - def from_dict(player_draft_pick_metadata_dict: dict, sport: Sport) -> PlayerDraftPickMetadata: - return PlayerDraftPickMetadata( - team=SportTeam.enum(sport).from_str(player_draft_pick_metadata_dict.get("team")), - status=PlayerStatus.enum(sport).from_str(player_draft_pick_metadata_dict.get("status")), - sport=Sport.from_str(player_draft_pick_metadata_dict.get("sport")), - position=PlayerPosition.enum(sport).from_str( - player_draft_pick_metadata_dict.get("position") - ), - player_id=player_draft_pick_metadata_dict.get("player_id"), - number=player_draft_pick_metadata_dict.get("number"), - news_updated=player_draft_pick_metadata_dict.get("news_updated"), - first_name=player_draft_pick_metadata_dict.get("first_name"), - last_name=player_draft_pick_metadata_dict.get("last_name"), - injury_status=InjuryStatus.from_str( - player_draft_pick_metadata_dict.get("injury_status") - ), - ) diff --git a/sleeper/model/PlayerStats.py b/sleeper/model/PlayerStats.py deleted file mode 100644 index b5e0b9b..0000000 --- a/sleeper/model/PlayerStats.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import annotations - -import datetime -from dataclasses import dataclass - -from sleeper.enum import SeasonType, Sport, SportTeam -from sleeper.enum.Category import Category -from sleeper.enum.Company import Company -from sleeper.model import Player -from sleeper.model.Stats import Stats - - -@dataclass(kw_only=True) -class PlayerStats: - category: Category - company: Company - date: date - game_id: str - opponent: SportTeam - player: Player - player_id: str - season: str - season_type: SeasonType - sport: Sport - stats: Stats - team: SportTeam - week: int - - @staticmethod - def from_dict_list(player_stats_dict_list: list) -> list[PlayerStats]: - player_stats_list = list() - for player_stats_dict in player_stats_dict_list: - player_stats_list.append(PlayerStats.from_dict(player_stats_dict)) - return player_stats_list - - @staticmethod - def from_dict(player_stats_dict: dict) -> PlayerStats: - sport = Sport.from_str(player_stats_dict.get("sport")) - date_ = ( - None - if player_stats_dict.get("date") is None - else datetime.datetime.strptime(player_stats_dict.get("date"), "%Y-%m-%d").date() - ) - return PlayerStats( - category=Category.from_str(player_stats_dict.get("category")), - company=Company.from_str(player_stats_dict.get("company")), - date=date_, - game_id=player_stats_dict.get("game_id"), - opponent=SportTeam.enum(sport).from_str(player_stats_dict.get("opponent")), - player=Player.from_dict(player_stats_dict.get("player"), sport), - player_id=player_stats_dict.get("player_id"), - season=player_stats_dict.get("season"), - season_type=SeasonType.from_str(player_stats_dict.get("season_type")), - sport=sport, - stats=Stats.model(sport).from_dict(player_stats_dict.get("stats")), - team=SportTeam.enum(sport).from_str(player_stats_dict.get("team")), - week=player_stats_dict.get("week"), - ) diff --git a/sleeper/model/PlayerTrend.py b/sleeper/model/PlayerTrend.py deleted file mode 100644 index 38adef2..0000000 --- a/sleeper/model/PlayerTrend.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class PlayerTrend: - count: int - player_id: str - - @staticmethod - def from_dict(player_trend_dict: dict) -> PlayerTrend: - return PlayerTrend( - player_id=player_trend_dict.get("player_id"), count=player_trend_dict.get("count") - ) - - @staticmethod - def from_dict_list(player_trend_dict_list: list) -> list[PlayerTrend]: - player_trends = list() - for player_trend_dict in player_trend_dict_list: - player_trends.append(PlayerTrend.from_dict(player_trend_dict)) - return player_trends diff --git a/sleeper/model/PlayoffMatchup.py b/sleeper/model/PlayoffMatchup.py deleted file mode 100644 index 0e09004..0000000 --- a/sleeper/model/PlayoffMatchup.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.model.FromPlayoffMatchup import FromPlayoffMatchup - - -@dataclass(kw_only=True) -class PlayoffMatchup: - losing_roster_id: int - matchup_id: int - round: int - team_1_from: FromPlayoffMatchup - team_1_roster_id: int - team_2_from: FromPlayoffMatchup - team_2_roster_id: int - winning_roster_id: int - p: int # no documentation on what this field means - - @staticmethod - def from_dict(playoff_matchup_object: dict) -> PlayoffMatchup: - return PlayoffMatchup( - round=playoff_matchup_object.get("r"), - matchup_id=playoff_matchup_object.get("m"), - team_1_roster_id=playoff_matchup_object.get("t1"), - team_2_roster_id=playoff_matchup_object.get("t2"), - winning_roster_id=playoff_matchup_object.get("w"), - losing_roster_id=playoff_matchup_object.get("l"), - team_1_from=FromPlayoffMatchup.from_dict(playoff_matchup_object.get("t1_from")), - team_2_from=FromPlayoffMatchup.from_dict(playoff_matchup_object.get("t2_from")), - p=playoff_matchup_object.get("p"), - ) - - @staticmethod - def from_dict_str(playoff_matchup_dict_list: list) -> list[PlayoffMatchup]: - playoff_matchups = list() - for playoff_matchup_dict in playoff_matchup_dict_list: - playoff_matchups.append(PlayoffMatchup.from_dict(playoff_matchup_dict)) - return playoff_matchups diff --git a/sleeper/model/Roster.py b/sleeper/model/Roster.py deleted file mode 100644 index 97f4960..0000000 --- a/sleeper/model/Roster.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Any - -from sleeper.model.RosterSettings import RosterSettings - - -@dataclass(kw_only=True) -class Roster: - co_owners: Any # not sure what this is - league_id: str - metadata: dict[str, Any] # not sure what this is - owner_id: str - players: list[str] - player_map: Any # not sure what this is - reserve: list - roster_id: int - settings: RosterSettings - starters: list[str] - taxi: Any # not sure what this is - - @staticmethod - def from_dict(roster_dict: dict) -> Roster: - return Roster( - starters=roster_dict.get("starters"), - settings=RosterSettings.from_dict(roster_dict.get("settings")), - roster_id=roster_dict.get("roster_id"), - reserve=roster_dict.get("reserve"), - players=roster_dict.get("players"), - owner_id=roster_dict.get("owner_id"), - league_id=roster_dict.get("league_id"), - co_owners=roster_dict.get("co_owners"), - metadata=roster_dict.get("metadata"), - player_map=roster_dict.get("player_map"), - taxi=roster_dict.get("taxi"), - ) - - @staticmethod - def from_dict_list(roster_dict_list: list) -> list[Roster]: - rosters = list() - for roster_dict in roster_dict_list: - rosters.append(Roster.from_dict(roster_dict)) - return rosters diff --git a/sleeper/model/RosterSettings.py b/sleeper/model/RosterSettings.py deleted file mode 100644 index ee7d123..0000000 --- a/sleeper/model/RosterSettings.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class RosterSettings: - division: int - fpts: int - fpts_against: int - fpts_against_decimal: int - fpts_decimal: int - losses: int - ppts: int - ppts_decimal: int - ties: int - total_moves: int - waiver_adjusted: int - waiver_budget_used: int - waiver_position: int - wins: int - - @classmethod - def from_dict(cls, roster_settings_dict: dict) -> RosterSettings: - return RosterSettings( - division=roster_settings_dict.get("division"), - wins=roster_settings_dict.get("wins"), - waiver_position=roster_settings_dict.get("waiver_position"), - waiver_budget_used=roster_settings_dict.get("waiver_budget_used"), - total_moves=roster_settings_dict.get("total_moves"), - ties=roster_settings_dict.get("ties"), - losses=roster_settings_dict.get("losses"), - fpts_decimal=roster_settings_dict.get("fpts_decimal"), - fpts_against_decimal=roster_settings_dict.get("fpts_against_decimal"), - fpts_against=roster_settings_dict.get("fpts_against"), - fpts=roster_settings_dict.get("fpts"), - ppts_decimal=roster_settings_dict.get("ppts_decimal"), - ppts=roster_settings_dict.get("ppts"), - waiver_adjusted=roster_settings_dict.get("waiver_adjusted"), - ) diff --git a/sleeper/model/ScoringSettings.py b/sleeper/model/ScoringSettings.py deleted file mode 100644 index f0dd1d5..0000000 --- a/sleeper/model/ScoringSettings.py +++ /dev/null @@ -1,208 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class ScoringSettings: - blk_kick: float - blk_kick_ret_yd: float - bonus_pass_yd_300: float - bonus_pass_yd_400: float - bonus_rec_yd_100: float - bonus_rec_yd_200: float - bonus_rush_yd_100: float - bonus_rush_yd_200: float - def_2pt: float - def_pass_def: float - def_st_ff: float - def_st_fum_rec: float - def_st_td: float - def_td: float - ff: float - fg_ret_yd: float - fgm: float - fgm_0_19: float - fgm_20_29: float - fgm_30_39: float - fgm_40_49: float - fgm_50p: float - fgmiss: float - fgmiss_0_19: float - fgmiss_20_29: float - fgmiss_30_39: float - fgmiss_40_49: float - fgmiss_50p: float - fum: float - fum_lost: float - fum_rec: float - fum_ret_yd: float - idp_blk_kick: float - idp_def_td: float - idp_ff: float - idp_fum_rec: float - idp_int: float - idp_pass_def: float - idp_sack: float - idp_safe: float - idp_tkl: float - idp_tkl_ast: float - idp_tkl_solo: float - int: float - int_ret_yd: float - kr_td: float - kr_yd: float - pass_2pt: float - pass_att: float - pass_cmp: float - pass_cmp_40p: float - pass_inc: float - pass_int: float - pass_sack: float - pass_td: float - pass_yd: float - pr_td: float - pr_yd: float - pts_allow_0: float - pts_allow_14_20: float - pts_allow_1_6: float - pts_allow_21_27: float - pts_allow_28_34: float - pts_allow_35p: float - pts_allow_7_13: float - qb_hit: float - rec: float - rec_2pt: float - rec_40p: float - rec_td: float - rec_yd: float - rush_2pt: float - rush_40p: float - rush_att: float - rush_td: float - rush_yd: float - sack: float - sack_yd: float - safe: float - st_ff: float - st_fum_rec: float - st_td: float - st_tkl_solo: float - tkl: float - tkl_ast: float - tkl_loss: float - tkl_solo: float - xpm: float - xpmiss: float - yds_allow_0_100: float - yds_allow_100_199: float - yds_allow_200_299: float - yds_allow_300_349: float - yds_allow_350_399: float - yds_allow_400_449: float - yds_allow_450_499: float - yds_allow_500_549: float - yds_allow_550p: float - - @staticmethod - def from_dict(scoring_settings_dict: dict) -> ScoringSettings: - return ScoringSettings( - yds_allow_0_100=scoring_settings_dict.get("yds_allow_0_100"), - yds_allow_100_199=scoring_settings_dict.get("yds_allow_100_199"), - yds_allow_200_299=scoring_settings_dict.get("yds_allow_200_299"), - yds_allow_300_349=scoring_settings_dict.get("yds_allow_300_349"), - yds_allow_350_399=scoring_settings_dict.get("yds_allow_350_399"), - yds_allow_400_449=scoring_settings_dict.get("yds_allow_400_449"), - yds_allow_450_499=scoring_settings_dict.get("yds_allow_450_499"), - yds_allow_500_549=scoring_settings_dict.get("yds_allow_500_549"), - yds_allow_550p=scoring_settings_dict.get("yds_allow_550p"), - fgm=scoring_settings_dict.get("fgm"), - fgm_0_19=scoring_settings_dict.get("fgm_0_19"), - fgm_20_29=scoring_settings_dict.get("fgm_20_29"), - fgm_30_39=scoring_settings_dict.get("fgm_30_39"), - fgm_40_49=scoring_settings_dict.get("fgm_40_49"), - fgm_50p=scoring_settings_dict.get("fgm_50p"), - fgmiss=scoring_settings_dict.get("fgmiss"), - fgmiss_0_19=scoring_settings_dict.get("fgmiss_0_19"), - fgmiss_20_29=scoring_settings_dict.get("fgmiss_20_29"), - fgmiss_30_39=scoring_settings_dict.get("fgmiss_30_39"), - fgmiss_40_49=scoring_settings_dict.get("fgmiss_40_49"), - fgmiss_50p=scoring_settings_dict.get("fgmiss_50p"), - fg_ret_yd=scoring_settings_dict.get("fg_ret_yd"), - pass_2pt=scoring_settings_dict.get("pass_2pt"), - pass_int=scoring_settings_dict.get("pass_int"), - pass_sack=scoring_settings_dict.get("pass_sack"), - pass_cmp=scoring_settings_dict.get("pass_cmp"), - pass_cmp_40p=scoring_settings_dict.get("pass_cmp_40p"), - pass_inc=scoring_settings_dict.get("pass_inc"), - pass_att=scoring_settings_dict.get("pass_att"), - pass_yd=scoring_settings_dict.get("pass_yd"), - pass_td=scoring_settings_dict.get("pass_td"), - def_pass_def=scoring_settings_dict.get("def_pass_def"), - def_td=scoring_settings_dict.get("def_td"), - def_st_fum_rec=scoring_settings_dict.get("def_st_fum_rec"), - def_st_td=scoring_settings_dict.get("def_st_td"), - def_st_ff=scoring_settings_dict.get("def_st_ff"), - def_2pt=scoring_settings_dict.get("def_2pt"), - st_fum_rec=scoring_settings_dict.get("st_fum_rec"), - st_ff=scoring_settings_dict.get("st_ff"), - st_tkl_solo=scoring_settings_dict.get("st_tkl_solo"), - st_td=scoring_settings_dict.get("st_td"), - fum_rec=scoring_settings_dict.get("fum_rec"), - fum_lost=scoring_settings_dict.get("fum_lost"), - fum=scoring_settings_dict.get("fum"), - fum_ret_yd=scoring_settings_dict.get("fum_ret_yd"), - idp_safe=scoring_settings_dict.get("idp_safe"), - idp_ff=scoring_settings_dict.get("idp_ff"), - idp_blk_kick=scoring_settings_dict.get("idp_blk_kick"), - idp_int=scoring_settings_dict.get("idp_int"), - idp_tkl=scoring_settings_dict.get("idp_tkl"), - idp_def_td=scoring_settings_dict.get("idp_def_td"), - idp_pass_def=scoring_settings_dict.get("idp_pass_def"), - idp_fum_rec=scoring_settings_dict.get("idp_fum_rec"), - idp_sack=scoring_settings_dict.get("idp_sack"), - idp_tkl_ast=scoring_settings_dict.get("idp_tkl_ast"), - idp_tkl_solo=scoring_settings_dict.get("idp_tkl_solo"), - rush_att=scoring_settings_dict.get("rush_att"), - pts_allow_0=scoring_settings_dict.get("pts_allow_0"), - pts_allow_1_6=scoring_settings_dict.get("pts_allow_1_6"), - pts_allow_7_13=scoring_settings_dict.get("pts_allow_7_13"), - pts_allow_14_20=scoring_settings_dict.get("pts_allow_14_20"), - pts_allow_21_27=scoring_settings_dict.get("pts_allow_21_27"), - pts_allow_28_34=scoring_settings_dict.get("pts_allow_28_34"), - pts_allow_35p=scoring_settings_dict.get("pts_allow_35p"), - rush_40p=scoring_settings_dict.get("rush_40p"), - rush_2pt=scoring_settings_dict.get("rush_2pt"), - rush_yd=scoring_settings_dict.get("rush_yd"), - rush_td=scoring_settings_dict.get("rush_td"), - bonus_rush_yd_100=scoring_settings_dict.get("bonus_rush_yd_100"), - bonus_rush_yd_200=scoring_settings_dict.get("bonus_rush_yd_200"), - bonus_rec_yd_100=scoring_settings_dict.get("bonus_rec_yd_100"), - bonus_rec_yd_200=scoring_settings_dict.get("bonus_rec_yd_200"), - bonus_pass_yd_300=scoring_settings_dict.get("bonus_pass_yd_300"), - bonus_pass_yd_400=scoring_settings_dict.get("bonus_pass_yd_400"), - rec_yd=scoring_settings_dict.get("rec_yd"), - rec_2pt=scoring_settings_dict.get("rec_2pt"), - rec=scoring_settings_dict.get("rec"), - rec_td=scoring_settings_dict.get("rec_td"), - rec_40p=scoring_settings_dict.get("rec_40p"), - tkl=scoring_settings_dict.get("tkl"), - tkl_loss=scoring_settings_dict.get("tkl_loss"), - tkl_solo=scoring_settings_dict.get("tkl_solo"), - tkl_ast=scoring_settings_dict.get("tkl_ast"), - int_ret_yd=scoring_settings_dict.get("int_ret_yd"), - int=scoring_settings_dict.get("int"), - pr_td=scoring_settings_dict.get("pr_td"), - pr_yd=scoring_settings_dict.get("pr_yd"), - sack_yd=scoring_settings_dict.get("sack_yd"), - sack=scoring_settings_dict.get("sack"), - kr_yd=scoring_settings_dict.get("kr_yd"), - kr_td=scoring_settings_dict.get("kr_td"), - blk_kick=scoring_settings_dict.get("blk_kick"), - blk_kick_ret_yd=scoring_settings_dict.get("blk_kick_ret_yd"), - xpmiss=scoring_settings_dict.get("xpmiss"), - ff=scoring_settings_dict.get("ff"), - qb_hit=scoring_settings_dict.get("qb_hit"), - xpm=scoring_settings_dict.get("xpm"), - safe=scoring_settings_dict.get("safe"), - ) diff --git a/sleeper/model/SportState.py b/sleeper/model/SportState.py deleted file mode 100644 index a16a6e1..0000000 --- a/sleeper/model/SportState.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -import datetime -from dataclasses import dataclass -from datetime import date - -from sleeper.enum.SeasonType import SeasonType - - -@dataclass(kw_only=True) -class SportState: - display_week: int - league_create_season: str - league_season: str - leg: int - previous_season: str - season: str - season_start_date: date - season_type: SeasonType - week: int - - @staticmethod - def from_dict(sport_state_dict) -> SportState: - season_start_date = ( - None - if sport_state_dict.get("season_start_date") is None - else datetime.datetime.strptime( - sport_state_dict.get("season_start_date"), "%Y-%m-%d" - ).date() - ) - return SportState( - week=sport_state_dict.get("week"), - season_type=SeasonType.from_str(sport_state_dict.get("season_type")), - season_start_date=season_start_date, - season=sport_state_dict.get("season"), - previous_season=sport_state_dict.get("previous_season"), - leg=sport_state_dict.get("leg"), - league_season=sport_state_dict.get("league_season"), - league_create_season=sport_state_dict.get("league_create_season"), - display_week=sport_state_dict.get("display_week"), - ) diff --git a/sleeper/model/Stats.py b/sleeper/model/Stats.py deleted file mode 100644 index f580226..0000000 --- a/sleeper/model/Stats.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from dataclasses import dataclass - -from sleeper.enum import Sport - - -@dataclass(kw_only=True) -class Stats: - """ - Parent for all Stat models for each sport. - """ - - ... - - @staticmethod - def model(sport: Sport) -> Stats: - from sleeper.model.nfl.NFLStats import NFLStats - - if sport == Sport.NFL: - return NFLStats - else: - raise ValueError(f"Cannot find Stats for sport: '{sport.name}'.") - - @staticmethod - @abstractmethod - def from_dict(d: dict) -> Stats: - ... - - @abstractmethod - def get_populated_stats(self) -> dict: - ... diff --git a/sleeper/model/TradedPick.py b/sleeper/model/TradedPick.py deleted file mode 100644 index 050bba6..0000000 --- a/sleeper/model/TradedPick.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(kw_only=True) -class TradedPick: - owner_id: int - previous_owner_id: int - roster_id: int - round: int - season: str - - @staticmethod - def from_dict(traded_pick_dict: dict) -> TradedPick: - return TradedPick( - season=traded_pick_dict.get("season"), - round=traded_pick_dict.get("round"), - roster_id=traded_pick_dict.get("roster_id"), - previous_owner_id=traded_pick_dict.get("previous_owner_id"), - owner_id=traded_pick_dict.get("owner_id"), - ) - - @staticmethod - def from_dict_list(traded_pick_dict_list: list) -> list[TradedPick]: - traded_picks = list() - for traded_pick_dict in traded_pick_dict_list: - traded_picks.append(TradedPick.from_dict(traded_pick_dict)) - return traded_picks diff --git a/sleeper/model/Transaction.py b/sleeper/model/Transaction.py deleted file mode 100644 index 5e24734..0000000 --- a/sleeper/model/Transaction.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Any - -from sleeper.enum.TransactionStatus import TransactionStatus -from sleeper.enum.TransactionType import TransactionType -from sleeper.model.DraftPick import DraftPick -from sleeper.model.FAABTransaction import FAABTransaction -from sleeper.model.TransactionSettings import TransactionSettings - - -@dataclass(kw_only=True) -class Transaction: - adds: list[dict[str, int]] - consenter_ids: list[int] - created: int - creator: str - draft_picks: list[DraftPick] - drops: list[dict[str, int]] - roster_ids: list[int] - settings: TransactionSettings - status: TransactionStatus - status_updated: int - transaction_id: str - type: TransactionType - waiver_budget: list[FAABTransaction] - leg: int - metadata: Any # not sure what this is - - @staticmethod - def from_dict(transaction_dict: dict) -> Transaction: - return Transaction( - type=TransactionType.from_str(transaction_dict.get("type")), - transaction_id=transaction_dict.get("transaction_id"), - status_updated=transaction_dict.get("status_updated"), - status=TransactionStatus.from_str(transaction_dict.get("status")), - settings=TransactionSettings.from_dict(transaction_dict.get("settings")), - roster_ids=transaction_dict.get("roster_ids"), - leg=transaction_dict.get("leg"), - adds=transaction_dict.get("adds"), - drops=transaction_dict.get("drops"), - draft_picks=DraftPick.from_dict_list(transaction_dict.get("draft_picks")), - creator=transaction_dict.get("creator"), - created=transaction_dict.get("created"), - consenter_ids=transaction_dict.get("consenter_ids"), - waiver_budget=FAABTransaction.from_dict_list(transaction_dict.get("waiver_budget")), - metadata=transaction_dict.get("metadata"), - ) - - @staticmethod - def from_dict_list(transaction_dict_list: list) -> list[Transaction]: - transactions = list() - for transaction_dict in transaction_dict_list: - transactions.append(Transaction.from_dict(transaction_dict)) - return transactions diff --git a/sleeper/model/TransactionSettings.py b/sleeper/model/TransactionSettings.py deleted file mode 100644 index 08ec62a..0000000 --- a/sleeper/model/TransactionSettings.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Optional - - -@dataclass(kw_only=True) -class TransactionSettings: - seq: int - waiver_bid: int - - @classmethod - def from_dict(cls, transaction_settings_dict: Optional[dict]) -> Optional[TransactionSettings]: - if transaction_settings_dict is None: - return None - return TransactionSettings( - waiver_bid=transaction_settings_dict.get("waiver_bid"), - seq=transaction_settings_dict.get("seq"), - ) diff --git a/sleeper/model/User.py b/sleeper/model/User.py deleted file mode 100644 index f8adf7c..0000000 --- a/sleeper/model/User.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Any - - -@dataclass(kw_only=True) -class User: - avatar: str - cookies: Any # not sure what this is - created: Any # not sure what this is - currencies: Any # not sure what this is - data_updated: Any # not sure what this is - deleted: Any # not sure what this is - display_name: str - email: str - is_bot: bool - is_owner: bool - league_id: str - metadata: Any # not sure what this is - notifications: Any # not sure what this is - pending: Any # not sure what this is - phone: str - real_name: str - solicitable: Any # not sure what this is - summoner_region: Any # not sure what this is - token: str - user_id: str - username: str - verification: Any # not sure what this is - - @staticmethod - def from_dict(user_dict: dict) -> User: - return User( - username=user_dict.get("username"), - user_id=user_dict.get("user_id"), - display_name=user_dict.get("display_name"), - avatar=user_dict.get("avatar"), - is_owner=user_dict.get("is_owner", False), - is_bot=user_dict.get("is_bot", False), - league_id=user_dict.get("league_id"), - cookies=user_dict.get("cookies"), - created=user_dict.get("created"), - currencies=user_dict.get("currencies"), - data_updated=user_dict.get("data_updated"), - deleted=user_dict.get("deleted"), - email=user_dict.get("email"), - metadata=user_dict.get("metadata"), - notifications=user_dict.get("notifications"), - pending=user_dict.get("pending"), - phone=user_dict.get("phone"), - real_name=user_dict.get("real_name"), - solicitable=user_dict.get("solicitable"), - summoner_region=user_dict.get("summoner_region"), - token=user_dict.get("token"), - verification=user_dict.get("verification"), - ) - - @staticmethod - def from_dict_list(user_dict_list: list) -> list[User]: - users = list() - for user_dict in user_dict_list: - users.append(User.from_dict(user_dict)) - return users diff --git a/sleeper/model/__init__.py b/sleeper/model/__init__.py deleted file mode 100644 index d49893f..0000000 --- a/sleeper/model/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from .DepthChart import DepthChart -from .Draft import Draft -from .DraftMetadata import DraftMetadata -from .DraftPick import DraftPick -from .DraftSettings import DraftSettings -from .FAABTransaction import FAABTransaction -from .FromPlayoffMatchup import FromPlayoffMatchup -from .Game import Game -from .League import League -from .LeagueSettings import LeagueSettings -from .Matchup import Matchup -from .Player import Player -from .PlayerDraftPick import PlayerDraftPick -from .PlayerDraftPickMetadata import PlayerDraftPickMetadata -from .PlayerStats import PlayerStats -from .PlayerTrend import PlayerTrend -from .PlayoffMatchup import PlayoffMatchup -from .Roster import Roster -from .RosterSettings import RosterSettings -from .ScoringSettings import ScoringSettings -from .SportState import SportState -from .TradedPick import TradedPick -from .Transaction import Transaction -from .TransactionSettings import TransactionSettings -from .User import User diff --git a/sleeper/model/nfl/NFLDepthChart.py b/sleeper/model/nfl/NFLDepthChart.py deleted file mode 100644 index 64cb313..0000000 --- a/sleeper/model/nfl/NFLDepthChart.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.model.DepthChart import DepthChart - - -@dataclass(kw_only=True) -class NFLDepthChart(DepthChart): - C: list[str] - FS: list[str] - LCB: list[str] - LDE: list[str] - LG: list[str] - LILB: list[str] - LOLB: list[str] - LT: list[str] - NB: list[str] - NT: list[str] - PK: list[str] - QB: list[str] - RB: list[str] - RCB: list[str] - RDE: list[str] - RG: list[str] - RILB: list[str] - ROLB: list[str] - RT: list[str] - SS: list[str] - TE: list[str] - WR1: list[str] - WR2: list[str] - WR3: list[str] - - @staticmethod - def from_dict(nfl_depth_chart_dict: dict) -> NFLDepthChart: - return NFLDepthChart( - C=nfl_depth_chart_dict.get("C"), - FS=nfl_depth_chart_dict.get("FS"), - LCB=nfl_depth_chart_dict.get("LCB"), - LDE=nfl_depth_chart_dict.get("LDE"), - LG=nfl_depth_chart_dict.get("LG"), - LILB=nfl_depth_chart_dict.get("LILB"), - LOLB=nfl_depth_chart_dict.get("LOLB"), - LT=nfl_depth_chart_dict.get("LT"), - NB=nfl_depth_chart_dict.get("NB"), - NT=nfl_depth_chart_dict.get("NT"), - PK=nfl_depth_chart_dict.get("PK"), - QB=nfl_depth_chart_dict.get("QB"), - RB=nfl_depth_chart_dict.get("RB"), - RCB=nfl_depth_chart_dict.get("RCB"), - RDE=nfl_depth_chart_dict.get("RDE"), - RG=nfl_depth_chart_dict.get("RG"), - RILB=nfl_depth_chart_dict.get("RILB"), - ROLB=nfl_depth_chart_dict.get("ROLB"), - RT=nfl_depth_chart_dict.get("RT"), - SS=nfl_depth_chart_dict.get("SS"), - TE=nfl_depth_chart_dict.get("TE"), - WR1=nfl_depth_chart_dict.get("WR1"), - WR2=nfl_depth_chart_dict.get("WR2"), - WR3=nfl_depth_chart_dict.get("WR3"), - ) diff --git a/sleeper/model/nfl/NFLStats.py b/sleeper/model/nfl/NFLStats.py deleted file mode 100644 index d7c5462..0000000 --- a/sleeper/model/nfl/NFLStats.py +++ /dev/null @@ -1,391 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - -from sleeper.model.Stats import Stats - - -@dataclass(kw_only=True) -class NFLStats(Stats): - blk_kick: float - blk_kick_ret_yd: float - bonus_pass_cmp_25: float - bonus_pass_yd_300: float - bonus_pass_yd_400: float - bonus_rec_rb: float - bonus_rec_te: float - bonus_rec_wr: float - bonus_rec_yd_100: float - bonus_rush_att_20: float - bonus_rush_rec_yd_100: float - bonus_rush_rec_yd_200: float - bonus_rush_yd_100: float - bonus_sack_2p: float - bonus_tkl_10p: float - cmp_pct: float - def_3_and_out: float - def_4_and_stop: float - def_forced_punts: float - def_kr: float - def_kr_lng: float - def_kr_yd: float - def_kr_ypa: float - def_pass_def: float - def_pr: float - def_pr_lng: float - def_pr_yd: float - def_pr_ypa: float - def_snp: float - def_st_td: float - def_st_tkl_solo: float - def_td: float - fan_pts_allow: float - fan_pts_allow_k: float - fan_pts_allow_qb: float - fan_pts_allow_rb: float - fan_pts_allow_te: float - fan_pts_allow_wr: float - ff: float - fga: float - fgm: float - fgm_20_29: float - fgm_30_39: float - fgm_40_49: float - fgm_50p: float - fgm_lng: float - fgm_pct: float - fgm_yds: float - fgm_yds_over_30: float - fgmiss: float - fgmiss_30_39: float - fgmiss_40_49: float - fgmiss_50p: float - fum: float - fum_lost: float - fum_rec: float - fum_ret_yd: float - gms_active: float - gp: float - gs: float - idp_blk_kick: float - idp_def_td: float - idp_ff: float - idp_fum_rec: float - idp_fum_ret_yd: float - idp_int: float - idp_int_ret_yd: float - idp_pass_def: float - idp_qb_hit: float - idp_sack: float - idp_sack_yd: float - idp_tkl: float - idp_tkl_ast: float - idp_tkl_loss: float - idp_tkl_solo: float - int_: float - int_ret_yd: float - kr: float - kr_lng: float - kr_yd: float - kr_ypa: float - off_snp: float - pass_2pt: float - pass_air_yd: float - pass_att: float - pass_cmp: float - pass_cmp_40p: float - pass_fd: float - pass_inc: float - pass_int: float - pass_int_td: float - pass_lng: float - pass_rtg: float - pass_rz_att: float - pass_sack: float - pass_sack_yds: float - pass_td: float - pass_td_40p: float - pass_td_50p: float - pass_td_lng: float - pass_yd: float - pass_ypa: float - penalty: float - penalty_yd: float - pr: float - pr_lng: float - pr_yd: float - pr_ypa: float - pts_allow: float - pts_allow_14_20: float - pts_allow_1_6: float - pts_allow_21_27: float - pts_allow_28_34: float - pts_allow_35p: float - pts_allow_7_13: float - pts_half_ppr: float - pts_ppr: float - pts_std: float - punt_blkd: float - punt_in_20: float - punt_net_yd: float - punt_tb: float - punt_yds: float - punts: float - qb_hit: float - rec: float - rec_0_4: float - rec_10_19: float - rec_20_29: float - rec_2pt: float - rec_30_39: float - rec_40p: float - rec_5_9: float - rec_air_yd: float - rec_drop: float - rec_fd: float - rec_lng: float - rec_rz_tgt: float - rec_td: float - rec_td_40p: float - rec_td_50p: float - rec_td_lng: float - rec_tgt: float - rec_yar: float - rec_yd: float - rec_ypr: float - rec_ypt: float - rush_2pt: float - rush_40p: float - rush_att: float - rush_btkl: float - rush_fd: float - rush_lng: float - rush_rz_att: float - rush_td: float - rush_td_40p: float - rush_td_50p: float - rush_td_lng: float - rush_tkl_loss: float - rush_tkl_loss_yd: float - rush_yac: float - rush_yd: float - rush_ypa: float - sack: float - sack_yd: float - st_snp: float - st_td: float - st_tkl_solo: float - td: float - tkl: float - tkl_ast: float - tkl_ast_misc: float - tkl_loss: float - tkl_solo: float - tkl_solo_misc: float - tm_def_snp: float - tm_off_snp: float - tm_st_snp: float - xpa: float - xpm: float - xpmiss: float - yds_allow: float - yds_allow_200_299: float - yds_allow_300_349: float - yds_allow_350_399: float - yds_allow_400_449: float - yds_allow_450_499: float - - def get_populated_stats(self) -> dict: - return {k: v for (k, v) in vars(self).items() if v is not None} - - @staticmethod - def from_dict(nfl_stats_dict: dict) -> NFLStats: - return NFLStats( - blk_kick=nfl_stats_dict.get("blk_kick"), - blk_kick_ret_yd=nfl_stats_dict.get("blk_kick_ret_yd"), - bonus_pass_cmp_25=nfl_stats_dict.get("bonus_pass_cmp_25"), - bonus_pass_yd_300=nfl_stats_dict.get("bonus_pass_yd_300"), - bonus_pass_yd_400=nfl_stats_dict.get("bonus_pass_yd_400"), - bonus_rec_rb=nfl_stats_dict.get("bonus_rec_rb"), - bonus_rec_te=nfl_stats_dict.get("bonus_rec_te"), - bonus_rec_wr=nfl_stats_dict.get("bonus_rec_wr"), - bonus_rec_yd_100=nfl_stats_dict.get("bonus_rec_yd_100"), - bonus_rush_rec_yd_200=nfl_stats_dict.get("bonus_rush_rec_yd_200"), - bonus_rush_yd_100=nfl_stats_dict.get("bonus_rush_yd_100"), - bonus_rush_att_20=nfl_stats_dict.get("bonus_rush_att_20"), - bonus_rush_rec_yd_100=nfl_stats_dict.get("bonus_rush_rec_yd_100"), - bonus_sack_2p=nfl_stats_dict.get("bonus_sack_2p"), - bonus_tkl_10p=nfl_stats_dict.get("bonus_tkl_10p"), - cmp_pct=nfl_stats_dict.get("cmp_pct"), - def_3_and_out=nfl_stats_dict.get("def_3_and_out"), - def_4_and_stop=nfl_stats_dict.get("def_4_and_stop"), - def_forced_punts=nfl_stats_dict.get("def_forced_punts"), - def_kr=nfl_stats_dict.get("def_kr"), - def_kr_lng=nfl_stats_dict.get("def_kr_lng"), - def_kr_yd=nfl_stats_dict.get("def_kr_yd"), - def_kr_ypa=nfl_stats_dict.get("def_kr_ypa"), - def_pass_def=nfl_stats_dict.get("def_pass_def"), - def_pr=nfl_stats_dict.get("def_pr"), - def_pr_lng=nfl_stats_dict.get("def_pr_lng"), - def_pr_yd=nfl_stats_dict.get("def_pr_yd"), - def_pr_ypa=nfl_stats_dict.get("def_pr_ypa"), - def_snp=nfl_stats_dict.get("def_snp"), - def_st_td=nfl_stats_dict.get("def_st_td"), - def_st_tkl_solo=nfl_stats_dict.get("def_st_tkl_solo"), - def_td=nfl_stats_dict.get("def_td"), - fan_pts_allow=nfl_stats_dict.get("fan_pts_allow"), - fan_pts_allow_k=nfl_stats_dict.get("fan_pts_allow_k"), - fan_pts_allow_qb=nfl_stats_dict.get("fan_pts_allow_qb"), - fan_pts_allow_rb=nfl_stats_dict.get("fan_pts_allow_rb"), - fan_pts_allow_te=nfl_stats_dict.get("fan_pts_allow_te"), - fan_pts_allow_wr=nfl_stats_dict.get("fan_pts_allow_wr"), - ff=nfl_stats_dict.get("ff"), - fga=nfl_stats_dict.get("fga"), - fgm=nfl_stats_dict.get("fgm"), - fgm_20_29=nfl_stats_dict.get("fgm_20_29"), - fgm_30_39=nfl_stats_dict.get("fgm_30_39"), - fgm_40_49=nfl_stats_dict.get("fgm_40_49"), - fgm_50p=nfl_stats_dict.get("fgm_50p"), - fgm_lng=nfl_stats_dict.get("fgm_lng"), - fgm_pct=nfl_stats_dict.get("fgm_pct"), - fgm_yds=nfl_stats_dict.get("fgm_yds"), - fgm_yds_over_30=nfl_stats_dict.get("fgm_yds_over_30"), - fgmiss=nfl_stats_dict.get("fgmiss"), - fgmiss_30_39=nfl_stats_dict.get("fgmiss_30_39"), - fgmiss_40_49=nfl_stats_dict.get("fgmiss_40_49"), - fgmiss_50p=nfl_stats_dict.get("fgmiss_50p"), - fum=nfl_stats_dict.get("fum"), - fum_lost=nfl_stats_dict.get("fum_lost"), - fum_rec=nfl_stats_dict.get("fum_rec"), - fum_ret_yd=nfl_stats_dict.get("fum_ret_yd"), - gms_active=nfl_stats_dict.get("gms_active"), - gp=nfl_stats_dict.get("gp"), - idp_blk_kick=nfl_stats_dict.get("idp_blk_kick"), - idp_def_td=nfl_stats_dict.get("idp_def_td"), - idp_ff=nfl_stats_dict.get("idp_ff"), - idp_fum_rec=nfl_stats_dict.get("idp_fum_rec"), - idp_fum_ret_yd=nfl_stats_dict.get("idp_fum_ret_yd"), - idp_int=nfl_stats_dict.get("idp_int"), - idp_int_ret_yd=nfl_stats_dict.get("idp_int_ret_yd"), - idp_pass_def=nfl_stats_dict.get("idp_pass_def"), - idp_qb_hit=nfl_stats_dict.get("idp_qb_hit"), - idp_sack=nfl_stats_dict.get("idp_sack"), - idp_sack_yd=nfl_stats_dict.get("idp_sack_yd"), - idp_tkl=nfl_stats_dict.get("idp_tkl"), - idp_tkl_ast=nfl_stats_dict.get("idp_tkl_ast"), - idp_tkl_loss=nfl_stats_dict.get("idp_tkl_loss"), - idp_tkl_solo=nfl_stats_dict.get("idp_tkl_solo"), - int_=nfl_stats_dict.get("int"), - int_ret_yd=nfl_stats_dict.get("int_ret_yd"), - kr=nfl_stats_dict.get("kr"), - kr_lng=nfl_stats_dict.get("kr_lng"), - kr_yd=nfl_stats_dict.get("kr_yd"), - kr_ypa=nfl_stats_dict.get("kr_ypa"), - gs=nfl_stats_dict.get("gs"), - off_snp=nfl_stats_dict.get("off_snp"), - pass_2pt=nfl_stats_dict.get("pass_2pt"), - pass_air_yd=nfl_stats_dict.get("pass_air_yd"), - pass_att=nfl_stats_dict.get("pass_att"), - pass_cmp=nfl_stats_dict.get("pass_cmp"), - pass_cmp_40p=nfl_stats_dict.get("pass_cmp_40p"), - pass_fd=nfl_stats_dict.get("pass_fd"), - pass_inc=nfl_stats_dict.get("pass_inc"), - pass_int=nfl_stats_dict.get("pass_int"), - pass_int_td=nfl_stats_dict.get("pass_int_td"), - pass_lng=nfl_stats_dict.get("pass_lng"), - pass_rtg=nfl_stats_dict.get("pass_rtg"), - pass_rz_att=nfl_stats_dict.get("pass_rz_att"), - pass_sack=nfl_stats_dict.get("pass_sack"), - pass_sack_yds=nfl_stats_dict.get("pass_sack_yds"), - pass_td=nfl_stats_dict.get("pass_td"), - pass_td_40p=nfl_stats_dict.get("pass_td_40p"), - pass_td_50p=nfl_stats_dict.get("pass_td_50p"), - pass_td_lng=nfl_stats_dict.get("pass_td_lng"), - pass_yd=nfl_stats_dict.get("pass_yd"), - pass_ypa=nfl_stats_dict.get("pass_ypa"), - penalty=nfl_stats_dict.get("penalty"), - penalty_yd=nfl_stats_dict.get("penalty_yd"), - pr=nfl_stats_dict.get("pr"), - pr_lng=nfl_stats_dict.get("pr_lng"), - pr_yd=nfl_stats_dict.get("pr_yd"), - pr_ypa=nfl_stats_dict.get("pr_ypa"), - pts_allow=nfl_stats_dict.get("pts_allow"), - pts_allow_14_20=nfl_stats_dict.get("pts_allow_14_20"), - pts_allow_1_6=nfl_stats_dict.get("pts_allow_1_6"), - pts_allow_21_27=nfl_stats_dict.get("pts_allow_21_27"), - pts_allow_28_34=nfl_stats_dict.get("pts_allow_28_34"), - pts_allow_35p=nfl_stats_dict.get("pts_allow_35p"), - pts_allow_7_13=nfl_stats_dict.get("pts_allow_7_13"), - pts_half_ppr=nfl_stats_dict.get("pts_half_ppr"), - pts_ppr=nfl_stats_dict.get("pts_ppr"), - pts_std=nfl_stats_dict.get("pts_std"), - punt_blkd=nfl_stats_dict.get("punt_blkd"), - punt_in_20=nfl_stats_dict.get("punt_in_20"), - punt_net_yd=nfl_stats_dict.get("punt_net_yd"), - punt_tb=nfl_stats_dict.get("punt_tb"), - punt_yds=nfl_stats_dict.get("punt_yds"), - punts=nfl_stats_dict.get("punts"), - qb_hit=nfl_stats_dict.get("qb_hit"), - rec=nfl_stats_dict.get("rec"), - rec_0_4=nfl_stats_dict.get("rec_0_4"), - rec_10_19=nfl_stats_dict.get("rec_10_19"), - rec_20_29=nfl_stats_dict.get("rec_20_29"), - rec_2pt=nfl_stats_dict.get("rec_2pt"), - rec_30_39=nfl_stats_dict.get("rec_30_39"), - rec_40p=nfl_stats_dict.get("rec_40p"), - rec_5_9=nfl_stats_dict.get("rec_5_9"), - rec_air_yd=nfl_stats_dict.get("rec_air_yd"), - rec_drop=nfl_stats_dict.get("rec_drop"), - rec_fd=nfl_stats_dict.get("rec_fd"), - rec_lng=nfl_stats_dict.get("rec_lng"), - rec_rz_tgt=nfl_stats_dict.get("rec_rz_tgt"), - rec_td=nfl_stats_dict.get("rec_td"), - rec_td_40p=nfl_stats_dict.get("rec_td_40p"), - rec_td_50p=nfl_stats_dict.get("rec_td_50p"), - rec_td_lng=nfl_stats_dict.get("rec_td_lng"), - rec_tgt=nfl_stats_dict.get("rec_tgt"), - rec_yar=nfl_stats_dict.get("rec_yar"), - rec_yd=nfl_stats_dict.get("rec_yd"), - rec_ypr=nfl_stats_dict.get("rec_ypr"), - rec_ypt=nfl_stats_dict.get("rec_ypt"), - rush_2pt=nfl_stats_dict.get("rush_2pt"), - rush_40p=nfl_stats_dict.get("rush_40p"), - rush_att=nfl_stats_dict.get("rush_att"), - rush_btkl=nfl_stats_dict.get("rush_btkl"), - rush_fd=nfl_stats_dict.get("rush_fd"), - rush_lng=nfl_stats_dict.get("rush_lng"), - rush_rz_att=nfl_stats_dict.get("rush_rz_att"), - rush_td=nfl_stats_dict.get("rush_td"), - rush_td_40p=nfl_stats_dict.get("rush_td_40p"), - rush_td_50p=nfl_stats_dict.get("rush_td_50p"), - rush_td_lng=nfl_stats_dict.get("rush_td_lng"), - rush_tkl_loss=nfl_stats_dict.get("rush_tkl_loss"), - rush_tkl_loss_yd=nfl_stats_dict.get("rush_tkl_loss_yd"), - rush_yac=nfl_stats_dict.get("rush_yac"), - rush_yd=nfl_stats_dict.get("rush_yd"), - rush_ypa=nfl_stats_dict.get("rush_ypa"), - sack=nfl_stats_dict.get("sack"), - sack_yd=nfl_stats_dict.get("sack_yd"), - st_snp=nfl_stats_dict.get("st_snp"), - st_td=nfl_stats_dict.get("st_td"), - st_tkl_solo=nfl_stats_dict.get("st_tkl_solo"), - td=nfl_stats_dict.get("td"), - tkl=nfl_stats_dict.get("tkl"), - tkl_ast=nfl_stats_dict.get("tkl_ast"), - tkl_ast_misc=nfl_stats_dict.get("tkl_ast_misc"), - tkl_loss=nfl_stats_dict.get("tkl_loss"), - tkl_solo=nfl_stats_dict.get("tkl_solo"), - tkl_solo_misc=nfl_stats_dict.get("tkl_solo_misc"), - tm_def_snp=nfl_stats_dict.get("tm_def_snp"), - tm_off_snp=nfl_stats_dict.get("tm_off_snp"), - tm_st_snp=nfl_stats_dict.get("tm_st_snp"), - xpa=nfl_stats_dict.get("xpa"), - xpm=nfl_stats_dict.get("xpm"), - xpmiss=nfl_stats_dict.get("xpmiss"), - yds_allow=nfl_stats_dict.get("yds_allow"), - yds_allow_200_299=nfl_stats_dict.get("yds_allow_200_299"), - yds_allow_300_349=nfl_stats_dict.get("yds_allow_300_349"), - yds_allow_350_399=nfl_stats_dict.get("yds_allow_350_399"), - yds_allow_400_449=nfl_stats_dict.get("yds_allow_400_449"), - yds_allow_450_499=nfl_stats_dict.get("yds_allow_450_499"), - ) diff --git a/sleeper/model/nfl/__init__.py b/sleeper/model/nfl/__init__.py deleted file mode 100644 index 6dc6650..0000000 --- a/sleeper/model/nfl/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .NFLDepthChart import NFLDepthChart -from .NFLStats import NFLStats diff --git a/sleeper/util/ConfigReader.py b/sleeper/util/ConfigReader.py deleted file mode 100644 index 30342e3..0000000 --- a/sleeper/util/ConfigReader.py +++ /dev/null @@ -1,28 +0,0 @@ -import configparser -import os - - -class ConfigReader: - """ - Used to read from .properties files - """ - - __propertiesFileName = "app.properties" - - @classmethod - def get(cls, section: str, name: str, asType=None) -> str: - configParser = configparser.ConfigParser( - converters={"list": lambda x: [i.strip() for i in x.split(",")]} - ) - propertiesFilePath = os.path.abspath( - os.path.join( - os.path.dirname(os.path.realpath(__file__)), f"../{cls.__propertiesFileName}" - ) - ) - configParser.read(propertiesFilePath) - if asType == list: - return configParser.getlist(section, name) - elif asType is None: - return configParser[section][name] - else: - raise ValueError(f"Type conversion for '{asType}' not supported.") diff --git a/sleeper/util/CustomFormatter.py b/sleeper/util/CustomFormatter.py deleted file mode 100644 index b6f2c07..0000000 --- a/sleeper/util/CustomFormatter.py +++ /dev/null @@ -1,31 +0,0 @@ -import logging - - -class CustomFormatter(logging.Formatter): - """ - Logging colored formatter, adapted from https://stackoverflow.com/a/56944256/3638629 - """ - - grey = "\x1b[38;21m" - blue = "\x1b[38;5;39m" - yellow = "\x1b[38;5;226m" - red = "\x1b[38;5;196m" - bold_red = "\x1b[31;1m" - reset = "\x1b[0m" - - def __init__(self, formatStr: str, timeFormatStr: str): - super().__init__() - self.__formatStr = formatStr - self.__timeFormatStr = timeFormatStr - self.FORMATS = { - logging.DEBUG: self.grey + self.__formatStr + self.reset, - logging.INFO: self.blue + self.__formatStr + self.reset, - logging.WARNING: self.yellow + self.__formatStr + self.reset, - logging.ERROR: self.red + self.__formatStr + self.reset, - logging.CRITICAL: self.bold_red + self.__formatStr + self.reset, - } - - def format(self, record): - logFormat = self.FORMATS.get(record.levelno) - formatter = logging.Formatter(logFormat, self.__timeFormatStr) - return formatter.format(record) diff --git a/sleeper/util/CustomLogger.py b/sleeper/util/CustomLogger.py deleted file mode 100644 index 8fbf44d..0000000 --- a/sleeper/util/CustomLogger.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import annotations - -import logging -import sys - -from sleeper.util.CustomFormatter import CustomFormatter - - -class CustomLogger: - @staticmethod - def getLogger() -> logging.Logger: - # set up logging - # https://docs.python.org/3/howto/logging.html - logger = logging.getLogger("root") - logger.setLevel(logging.INFO) - if not logger.hasHandlers(): - # set up handler - handler = logging.StreamHandler() - handler.setLevel(logging.INFO) - handler.setStream(sys.stdout) - # set up formatter - formatter = CustomFormatter( - "%(asctime)-8s %(levelname)-8s %(message)s", "%Y-%m-%d %H:%M:%S" - ) - # set in each other - handler.setFormatter(formatter) - logger.addHandler(handler) - return logger diff --git a/test/files/api/test.png b/test/files/api/test.png deleted file mode 100644 index 18eefb5..0000000 Binary files a/test/files/api/test.png and /dev/null differ diff --git a/sleeper/util/__init__.py b/test/integration/__init__.py similarity index 100% rename from sleeper/util/__init__.py rename to test/integration/__init__.py diff --git a/test/test_api/__init__.py b/test/integration/test_api/__init__.py similarity index 100% rename from test/test_api/__init__.py rename to test/integration/test_api/__init__.py diff --git a/test/integration/test_api/constants.py b/test/integration/test_api/constants.py new file mode 100644 index 0000000..a1a7e06 --- /dev/null +++ b/test/integration/test_api/constants.py @@ -0,0 +1,1973 @@ +# USER A +USER_A_USER_ID = "852776903310966784" +USER_A_DRAFTS_2023 = [ + { + "created": 1693364455045, + "creators": None, + "draft_id": "1002446817038147585", + "draft_order": None, + "last_message_id": "1004576231221624832", + "last_message_time": 1693872146948, + "last_picked": 1693872146626, + "league_id": "1002446817038147584", + "metadata": {"description": "", "name": "Kick Picks", "scoring_type": "ppr"}, + "season": "2023", + "season_type": "regular", + "settings": { + "alpha_sort": 0, + "autopause_enabled": 0, + "autopause_end_time": 900, + "autopause_start_time": 180, + "autostart": 0, + "cpu_autopick": 1, + "enforce_position_limits": 1, + "nomination_timer": 60, + "pick_timer": 10, + "player_type": 0, + "reversal_round": 0, + "rounds": 4, + "slots_bn": 1, + "slots_k": 3, + "teams": 6, + }, + "sport": "nfl", + "start_time": 1693872027888, + "status": "complete", + "type": "snake", + }, + { + "created": 1690925274461, + "creators": None, + "draft_id": "992216152161718273", + "draft_order": None, + "last_message_id": "1002445448390471680", + "last_message_time": 1693364128733, + "last_picked": 1693364079930, + "league_id": "992216152161718272", + "metadata": { + "description": "", + "name": "RB's: We Have the Cleats", + "scoring_type": "std", + }, + "season": "2023", + "season_type": "regular", + "settings": { + "alpha_sort": 0, + "autopause_enabled": 0, + "autopause_end_time": 900, + "autopause_start_time": 180, + "autostart": 0, + "cpu_autopick": 1, + "enforce_position_limits": 1, + "nomination_timer": 60, + "pick_timer": 120, + "player_type": 0, + "reversal_round": 0, + "rounds": 15, + "slots_bn": 6, + "slots_flex": 2, + "slots_k": 1, + "slots_qb": 1, + "slots_rb": 2, + "slots_te": 1, + "slots_wr": 2, + "teams": 12, + }, + "sport": "nfl", + "start_time": 1693357205870, + "status": "complete", + "type": "snake", + }, + { + "created": 1688748150241, + "creators": None, + "draft_id": "983084631371177984", + "draft_order": None, + "last_message_id": "1003154743692197888", + "last_message_time": 1693533237911, + "last_picked": 1693533187890, + "league_id": "983084630964228096", + "metadata": { + "description": "", + "name": "PGA Golf 2023", + "scoring_type": "half_ppr", + }, + "season": "2023", + "season_type": "regular", + "settings": { + "alpha_sort": 0, + "autopause_enabled": 0, + "autopause_end_time": 900, + "autopause_start_time": 180, + "autostart": 0, + "cpu_autopick": 1, + "nomination_timer": 60, + "pick_timer": 60, + "player_type": 0, + "position_limit_def": 2, + "position_limit_k": 2, + "position_limit_qb": 2, + "position_limit_rb": 7, + "position_limit_te": 3, + "position_limit_wr": 7, + "reversal_round": 0, + "rounds": 16, + "slots_bn": 6, + "slots_def": 1, + "slots_flex": 1, + "slots_k": 1, + "slots_qb": 1, + "slots_rb": 2, + "slots_te": 1, + "slots_wr": 3, + "teams": 12, + }, + "sport": "nfl", + "start_time": 1693528271003, + "status": "complete", + "type": "snake", + }, + { + "created": 1673019161693, + "creators": None, + "draft_id": "917112471750574081", + "draft_order": None, + "last_message_id": "1004230995895123968", + "last_message_time": 1693789836432, + "last_picked": 1693789835957, + "league_id": "917112471750574080", + "metadata": { + "description": "", + "name": "Pizza Bitch League", + "scoring_type": "std", + }, + "season": "2023", + "season_type": "regular", + "settings": { + "alpha_sort": 0, + "autopause_enabled": 0, + "autopause_end_time": 900, + "autopause_start_time": 180, + "autostart": 0, + "cpu_autopick": 0, + "nomination_timer": 60, + "pick_timer": 3600, + "player_type": 0, + "reversal_round": 0, + "rounds": 19, + "slots_bn": 8, + "slots_def": 1, + "slots_flex": 3, + "slots_k": 1, + "slots_qb": 1, + "slots_rb": 2, + "slots_te": 1, + "slots_wr": 2, + "teams": 6, + }, + "sport": "nfl", + "start_time": 1693787007136, + "status": "complete", + "type": "snake", + }, +] +USER_A_DRAFT_PICKS_DRAFT_ID_1_2023 = [ + { + "draft_id": "874771855859945472", + "draft_slot": 1, + "is_keeper": None, + "metadata": { + "first_name": "Greg", + "injury_status": "", + "last_name": "Zuerlein", + "news_updated": "1662946258713", + "number": "14", + "player_id": "1266", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "NYJ", + "years_exp": "10", + }, + "pick_no": 1, + "picked_by": "729138469988884480", + "player_id": "1266", + "reactions": None, + "roster_id": 3, + "round": 1, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 2, + "is_keeper": None, + "metadata": { + "first_name": "Cairo", + "injury_status": "", + "last_name": "Santos", + "news_updated": "1662943558019", + "number": "2", + "player_id": "2020", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "CHI", + "years_exp": "8", + }, + "pick_no": 2, + "picked_by": "862555482408194048", + "player_id": "2020", + "reactions": None, + "roster_id": 6, + "round": 1, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 3, + "is_keeper": None, + "metadata": { + "first_name": "Evan", + "injury_status": "", + "last_name": "McPherson", + "news_updated": "1663001440930", + "number": "2", + "player_id": "7839", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "CIN", + "years_exp": "1", + }, + "pick_no": 3, + "picked_by": "869382250104578048", + "player_id": "7839", + "reactions": None, + "roster_id": 5, + "round": 1, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 4, + "is_keeper": None, + "metadata": { + "first_name": "Rodrigo", + "injury_status": "", + "last_name": "Blankenship", + "news_updated": "1663001741197", + "number": "3", + "player_id": "7062", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "IND", + "years_exp": "2", + }, + "pick_no": 4, + "picked_by": "861082899649261568", + "player_id": "7062", + "reactions": None, + "roster_id": 2, + "round": 1, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 5, + "is_keeper": None, + "metadata": { + "first_name": "Mason", + "injury_status": "", + "last_name": "Crosby", + "news_updated": "1662999640674", + "number": "2", + "player_id": "59", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "GB", + "years_exp": "15", + }, + "pick_no": 5, + "picked_by": "862871829390409728", + "player_id": "59", + "reactions": None, + "roster_id": 4, + "round": 1, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 6, + "is_keeper": None, + "metadata": { + "first_name": "Matt", + "injury_status": "", + "last_name": "Prater", + "news_updated": "1662956160040", + "number": "5", + "player_id": "17", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "ARI", + "years_exp": "16", + }, + "pick_no": 6, + "picked_by": "852776903310966784", + "player_id": "17", + "reactions": None, + "roster_id": 1, + "round": 1, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 6, + "is_keeper": None, + "metadata": { + "first_name": "Chris", + "injury_status": "", + "last_name": "Boswell", + "news_updated": "1662999940930", + "number": "9", + "player_id": "1945", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "PIT", + "years_exp": "8", + }, + "pick_no": 7, + "picked_by": "852776903310966784", + "player_id": "1945", + "reactions": None, + "roster_id": 1, + "round": 2, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 5, + "is_keeper": None, + "metadata": { + "first_name": "Jason", + "injury_status": "", + "last_name": "Sanders", + "news_updated": "1663017661737", + "number": "7", + "player_id": "5119", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "MIA", + "years_exp": "4", + }, + "pick_no": 8, + "picked_by": "862871829390409728", + "player_id": "5119", + "reactions": None, + "roster_id": 4, + "round": 2, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 4, + "is_keeper": None, + "metadata": { + "first_name": "Austin", + "injury_status": "", + "last_name": "Seibert", + "news_updated": "1662993941075", + "number": "19", + "player_id": "6219", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "DET", + "years_exp": "3", + }, + "pick_no": 9, + "picked_by": "861082899649261568", + "player_id": "6219", + "reactions": None, + "roster_id": 2, + "round": 2, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 3, + "is_keeper": None, + "metadata": { + "first_name": "Jason", + "injury_status": "", + "last_name": "Myers", + "news_updated": "1663044303724", + "number": "5", + "player_id": "2747", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "SEA", + "years_exp": "7", + }, + "pick_no": 10, + "picked_by": "869382250104578048", + "player_id": "2747", + "reactions": None, + "roster_id": 5, + "round": 2, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 2, + "is_keeper": None, + "metadata": { + "first_name": "Ka'imi", + "injury_status": "", + "last_name": "Fairbairn", + "news_updated": "1662990939819", + "number": "7", + "player_id": "3451", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "HOU", + "years_exp": "6", + }, + "pick_no": 11, + "picked_by": "862555482408194048", + "player_id": "3451", + "reactions": None, + "roster_id": 6, + "round": 2, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 1, + "is_keeper": None, + "metadata": { + "first_name": "Riley", + "injury_status": "", + "last_name": "Patterson", + "news_updated": "1663089907220", + "number": "10", + "player_id": "7922", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "JAX", + "years_exp": "1", + }, + "pick_no": 12, + "picked_by": "729138469988884480", + "player_id": "7922", + "reactions": None, + "roster_id": 3, + "round": 2, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 1, + "is_keeper": None, + "metadata": { + "first_name": "Randy", + "injury_status": "", + "last_name": "Bullock", + "news_updated": "1663003558707", + "number": "14", + "player_id": "1099", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "TEN", + "years_exp": "10", + }, + "pick_no": 13, + "picked_by": "729138469988884480", + "player_id": "1099", + "reactions": None, + "roster_id": 3, + "round": 3, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 2, + "is_keeper": None, + "metadata": { + "first_name": "Dustin", + "injury_status": "", + "last_name": "Hopkins", + "news_updated": "1663090507154", + "number": "6", + "player_id": "1348", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "LAC", + "years_exp": "9", + }, + "pick_no": 14, + "picked_by": "862555482408194048", + "player_id": "1348", + "reactions": None, + "roster_id": 6, + "round": 3, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 3, + "is_keeper": None, + "metadata": { + "first_name": "Eddy", + "injury_status": "", + "last_name": "Pineiro", + "news_updated": "1662992140120", + "number": "4", + "player_id": "5189", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "CAR", + "years_exp": "4", + }, + "pick_no": 15, + "picked_by": "869382250104578048", + "player_id": "5189", + "reactions": None, + "roster_id": 5, + "round": 3, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 4, + "is_keeper": None, + "metadata": { + "first_name": "Nick", + "injury_status": "", + "last_name": "Folk", + "news_updated": "1663003258469", + "number": "6", + "player_id": "650", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "NE", + "years_exp": "15", + }, + "pick_no": 16, + "picked_by": "861082899649261568", + "player_id": "650", + "reactions": None, + "roster_id": 2, + "round": 3, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 5, + "is_keeper": None, + "metadata": { + "first_name": "Greg", + "injury_status": "", + "last_name": "Joseph", + "news_updated": "1663002341081", + "number": "1", + "player_id": "5272", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "MIN", + "years_exp": "4", + }, + "pick_no": 17, + "picked_by": "862871829390409728", + "player_id": "5272", + "reactions": None, + "roster_id": 4, + "round": 3, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 6, + "is_keeper": None, + "metadata": { + "first_name": "Ryan", + "injury_status": "", + "last_name": "Succop", + "news_updated": "1663000240339", + "number": "3", + "player_id": "391", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "TB", + "years_exp": "13", + }, + "pick_no": 18, + "picked_by": "852776903310966784", + "player_id": "391", + "reactions": None, + "roster_id": 1, + "round": 3, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 6, + "is_keeper": None, + "metadata": { + "first_name": "Brandon", + "injury_status": "", + "last_name": "McManus", + "news_updated": "1663118110753", + "number": "8", + "player_id": "1433", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "DEN", + "years_exp": "9", + }, + "pick_no": 19, + "picked_by": "852776903310966784", + "player_id": "1433", + "reactions": None, + "roster_id": 1, + "round": 4, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 5, + "is_keeper": None, + "metadata": { + "first_name": "Graham", + "injury_status": "", + "last_name": "Gano", + "news_updated": "1662991540579", + "number": "9", + "player_id": "503", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "NYG", + "years_exp": "13", + }, + "pick_no": 20, + "picked_by": "862871829390409728", + "player_id": "503", + "reactions": None, + "roster_id": 4, + "round": 4, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 4, + "is_keeper": None, + "metadata": { + "first_name": "Joey", + "injury_status": "", + "last_name": "Slye", + "news_updated": "1663003558704", + "number": "6", + "player_id": "6528", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "WAS", + "years_exp": "3", + }, + "pick_no": 21, + "picked_by": "861082899649261568", + "player_id": "6528", + "reactions": None, + "roster_id": 2, + "round": 4, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 3, + "is_keeper": None, + "metadata": { + "first_name": "Cade", + "injury_status": "", + "last_name": "York", + "news_updated": "1662944758110", + "number": "3", + "player_id": "8258", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "CLE", + "years_exp": "0", + }, + "pick_no": 22, + "picked_by": "869382250104578048", + "player_id": "8258", + "reactions": None, + "roster_id": 5, + "round": 4, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 2, + "is_keeper": None, + "metadata": { + "first_name": "Wil", + "injury_status": "", + "last_name": "Lutz", + "news_updated": "1663020361515", + "number": "3", + "player_id": "3678", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "NO", + "years_exp": "6", + }, + "pick_no": 23, + "picked_by": "862555482408194048", + "player_id": "3678", + "reactions": None, + "roster_id": 6, + "round": 4, + }, + { + "draft_id": "874771855859945472", + "draft_slot": 1, + "is_keeper": None, + "metadata": { + "first_name": "Matt", + "injury_status": "", + "last_name": "Ammendola", + "news_updated": "1663180547464", + "number": "0", + "player_id": "7617", + "position": "K", + "sport": "nfl", + "status": "Active", + "team": "KC", + "years_exp": "1", + }, + "pick_no": 24, + "picked_by": "729138469988884480", + "player_id": "7617", + "reactions": None, + "roster_id": 3, + "round": 4, + }, +] +USER_A_LEAGUES_2022 = [ + { + "name": "test", + "status": "complete", + "metadata": None, + "settings": { + "waiver_budget": 100, + "disable_adds": 0, + "capacity_override": 0, + "waiver_bid_min": 0, + "taxi_deadline": 0, + "draft_rounds": 3, + "reserve_allow_na": 0, + "playoff_seed_type": 0, + "playoff_teams": 6, + "num_teams": 8, + "daily_waivers_hour": 0, + "playoff_type": 0, + "taxi_slots": 0, + "playoff_week_start": 15, + "waiver_clear_days": 2, + "reserve_allow_doubtful": 0, + "commissioner_direct_invite": 0, + "reserve_allow_dnr": 0, + "taxi_allow_vets": 0, + "waiver_day_of_week": 2, + "playoff_round_type": 0, + "reserve_allow_out": 0, + "reserve_allow_sus": 0, + "trade_deadline": 11, + "taxi_years": 0, + "daily_waivers": 0, + "pick_trading": 1, + "type": 0, + "max_keepers": 1, + "waiver_type": 0, + "league_average_match": 0, + "trade_review_days": 2, + "bench_lock": 0, + "offseason_adds": 0, + "leg": 1, + "reserve_slots": 0, + "was_auto_archived": 1, + "reserve_allow_cov": 0, + }, + "avatar": None, + "company_id": None, + "shard": 239, + "season": "2022", + "season_type": "regular", + "sport": "nfl", + "scoring_settings": { + "sack": 1.0, + "fgm_40_49": 4.0, + "pass_int": -1.0, + "pts_allow_0": 10.0, + "pass_2pt": 2.0, + "st_td": 6.0, + "rec_td": 6.0, + "fgm_30_39": 3.0, + "xpmiss": -1.0, + "rush_td": 6.0, + "rec_2pt": 2.0, + "st_fum_rec": 1.0, + "fgmiss": -1.0, + "ff": 1.0, + "rec": 1.0, + "pts_allow_14_20": 1.0, + "fgm_0_19": 3.0, + "int": 2.0, + "def_st_fum_rec": 1.0, + "fum_lost": -2.0, + "pts_allow_1_6": 7.0, + "fgm_20_29": 3.0, + "pts_allow_21_27": 0.0, + "xpm": 1.0, + "rush_2pt": 2.0, + "fum_rec": 2.0, + "def_st_td": 6.0, + "fgm_50p": 5.0, + "def_td": 6.0, + "safe": 2.0, + "pass_yd": 0.04, + "blk_kick": 2.0, + "pass_td": 4.0, + "rush_yd": 0.1, + "fum": 0.0, + "pts_allow_28_34": -1.0, + "pts_allow_35p": -4.0, + "fum_rec_td": 6.0, + "rec_yd": 0.1, + "def_st_ff": 1.0, + "pts_allow_7_13": 4.0, + "st_ff": 1.0, + }, + "last_message_id": "852776957778173952", + "display_order": -9999, + "last_author_avatar": None, + "last_author_display_name": None, + "last_author_id": None, + "last_author_is_bot": None, + "last_message_attachment": None, + "last_message_text_map": None, + "last_message_time": 1657680379865, + "last_pinned_message_id": None, + "draft_id": "852776958369591296", + "last_read_id": "852776957778173952", + "league_id": "852776957778173952", + "previous_league_id": None, + "group_id": None, + "last_transaction_id": None, + "roster_positions": [ + "QB", + "RB", + "RB", + "WR", + "WR", + "TE", + "FLEX", + "FLEX", + "K", + "DEF", + "BN", + "BN", + "BN", + "BN", + "BN", + ], + "bracket_id": None, + "loser_bracket_id": None, + "total_rosters": 8, + }, + { + "name": "Pizza Bitch League", + "status": "complete", + "metadata": { + "auto_continue": "on", + "continued": "yes", + "division_1": "Battle Buzzards", + "division_1_avatar": "https://sleepercdn.com/uploads/abcf9fe61ad5e6889e7d0c5c756e4974", + "division_2": "Angry Aardvarks", + "division_2_avatar": "https://sleepercdn.com/uploads/4136a82dfcf0aa2998f74c9ba004648d", + "keeper_deadline": "0", + "latest_league_winner_roster_id": "3", + "trophy_loser": "loser1", + "trophy_loser_background": "poop", + "trophy_loser_banner_text": "Pizza Bitch", + "trophy_winner": "winner2", + "trophy_winner_background": "fireworks", + "trophy_winner_banner_text": "Sausage Bowl IV", + }, + "settings": { + "best_ball": 0, + "last_report": 15, + "waiver_budget": 100, + "disable_adds": 0, + "divisions": 2, + "capacity_override": 0, + "waiver_bid_min": 0, + "taxi_deadline": 0, + "draft_rounds": 3, + "reserve_allow_na": 0, + "start_week": 1, + "playoff_seed_type": 0, + "playoff_teams": 4, + "veto_votes_needed": 3, + "num_teams": 6, + "daily_waivers_hour": 0, + "playoff_type": 0, + "taxi_slots": 0, + "last_scored_leg": 17, + "daily_waivers_days": 1024, + "playoff_week_start": 16, + "waiver_clear_days": 2, + "reserve_allow_doubtful": 0, + "commissioner_direct_invite": 1, + "veto_auto_poll": 0, + "reserve_allow_dnr": 0, + "taxi_allow_vets": 0, + "waiver_day_of_week": 2, + "playoff_round_type": 0, + "reserve_allow_out": 1, + "reserve_allow_sus": 1, + "veto_show_votes": 0, + "trade_deadline": 99, + "taxi_years": 0, + "daily_waivers": 1, + "disable_trades": 0, + "pick_trading": 1, + "type": 1, + "max_keepers": 2, + "waiver_type": 2, + "league_average_match": 0, + "trade_review_days": 2, + "bench_lock": 1, + "offseason_adds": 0, + "leg": 17, + "reserve_slots": 2, + "reserve_allow_cov": 1, + "daily_waivers_last_ran": 3, + }, + "avatar": "18476ac7f94576727c21a08344391481", + "company_id": None, + "shard": 181, + "season": "2022", + "season_type": "regular", + "sport": "nfl", + "scoring_settings": { + "sack": 1.0, + "fgm_40_49": 3.0, + "fgm_yds": 0.0, + "pass_int": -2.0, + "fgmiss_50p": 0.0, + "pts_allow_0": 10.0, + "pass_2pt": 2.0, + "st_td": 6.0, + "fgm_yds_over_30": 0.1, + "rec_td": 6.0, + "fgm_30_39": 3.0, + "xpmiss": -1.0, + "rush_td": 6.0, + "def_4_and_stop": 2.0, + "rec_2pt": 2.0, + "st_fum_rec": 1.0, + "fgmiss": 0.0, + "ff": 1.0, + "fgmiss_30_39": -1.0, + "rec": 0.0, + "pts_allow_14_20": 1.0, + "fgm_0_19": 3.0, + "int": 2.0, + "def_st_fum_rec": 1.0, + "fum_lost": -2.0, + "pts_allow_1_6": 7.0, + "rec_fd": 0.0, + "kr_yd": 0.04, + "fgmiss_20_29": -1.0, + "fgm_20_29": 3.0, + "pts_allow_21_27": 0.0, + "xpm": 1.0, + "pass_sack": -1.0, + "fgmiss_0_19": -1.0, + "tkl_loss": 0.25, + "rush_2pt": 2.0, + "fum_rec": 2.0, + "def_st_td": 6.0, + "fgm_50p": 3.0, + "def_td": 6.0, + "safe": 2.0, + "pass_yd": 0.04, + "fgmiss_40_49": -1.0, + "blk_kick": 2.0, + "pass_td": 4.0, + "rush_yd": 0.1, + "pr_yd": 0.04, + "fum": 0.0, + "pts_allow_28_34": -1.0, + "pts_allow_35p": -4.0, + "fum_rec_td": 6.0, + "rec_yd": 0.1, + "def_st_ff": 1.0, + "pts_allow_7_13": 4.0, + "st_ff": 1.0, + }, + "last_message_id": "916264309267394560", + "display_order": 0, + "last_author_avatar": None, + "last_author_display_name": "sys", + "last_author_id": "166666666666666666", + "last_author_is_bot": True, + "last_message_attachment": None, + "last_message_text_map": None, + "last_message_time": 1672816943998, + "last_pinned_message_id": None, + "draft_id": "861067611478290432", + "last_read_id": "914329083142660096", + "league_id": "861067611004321792", + "previous_league_id": None, + "group_id": None, + "last_transaction_id": 885960129353441280, + "roster_positions": [ + "QB", + "RB", + "RB", + "WR", + "WR", + "TE", + "FLEX", + "FLEX", + "FLEX", + "K", + "DEF", + "BN", + "BN", + "BN", + "BN", + "BN", + "BN", + "BN", + "BN", + ], + "bracket_id": 911286544366010368, + "loser_bracket_id": 911286544370204672, + "total_rosters": 6, + }, + { + "name": "RB's: We Have the Cleats", + "status": "complete", + "metadata": { + "auto_continue": "on", + "continued": "yes", + "division_1": "Ass Men", + "division_1_avatar": "https://sleepercdn.com/uploads/5d12b28091a4ea45e026622179a73dc9", + "division_2": "Breast Boys", + "division_2_avatar": "https://sleepercdn.com/uploads/6bf3496d4f7fc5672edd89cc53d0d4df", + "keeper_deadline": "0", + "latest_league_winner_roster_id": "2", + }, + "settings": { + "best_ball": 0, + "last_report": 14, + "waiver_budget": 100, + "disable_adds": 0, + "divisions": 2, + "capacity_override": 0, + "waiver_bid_min": 0, + "taxi_deadline": 0, + "draft_rounds": 3, + "reserve_allow_na": 0, + "start_week": 1, + "playoff_seed_type": 0, + "playoff_teams": 6, + "veto_votes_needed": 5, + "num_teams": 12, + "daily_waivers_hour": 0, + "playoff_type": 0, + "taxi_slots": 0, + "last_scored_leg": 17, + "daily_waivers_days": 5461, + "playoff_week_start": 15, + "waiver_clear_days": 1, + "reserve_allow_doubtful": 0, + "commissioner_direct_invite": 0, + "veto_auto_poll": 0, + "reserve_allow_dnr": 0, + "taxi_allow_vets": 0, + "waiver_day_of_week": 2, + "playoff_round_type": 0, + "reserve_allow_out": 1, + "reserve_allow_sus": 0, + "veto_show_votes": 0, + "trade_deadline": 11, + "taxi_years": 0, + "daily_waivers": 0, + "disable_trades": 0, + "pick_trading": 1, + "type": 0, + "max_keepers": 1, + "waiver_type": 2, + "league_average_match": 1, + "trade_review_days": 0, + "bench_lock": 1, + "offseason_adds": 0, + "leg": 17, + "reserve_slots": 2, + "reserve_allow_cov": 1, + "daily_waivers_last_ran": 5, + }, + "avatar": "ae717fa87f2de75fa68d70e94f04e2ac", + "company_id": None, + "shard": 895, + "season": "2022", + "season_type": "regular", + "sport": "nfl", + "scoring_settings": { + "sack": 1.0, + "fgm_40_49": 3.0, + "bonus_rec_te": 0.0, + "pass_int": -2.0, + "pts_allow_0": 10.0, + "pass_2pt": 2.0, + "rec_0_4": 0.0, + "st_td": 6.0, + "rec_30_39": 0.0, + "fgm_yds_over_30": 0.1, + "rec_td": 6.0, + "rec_20_29": 0.0, + "fgm_30_39": 3.0, + "xpmiss": -1.0, + "rush_td": 6.0, + "fgm": 0.0, + "rec_2pt": 2.0, + "rush_fd": 0.0, + "st_fum_rec": 0.0, + "fgmiss": -1.0, + "ff": 1.0, + "rec": 0.0, + "pts_allow_14_20": 1.0, + "fgm_0_19": 3.0, + "int": 2.0, + "def_st_fum_rec": 0.0, + "fum_lost": -2.0, + "pts_allow_1_6": 7.0, + "rec_fd": 0.0, + "rush_att": 0.0, + "rec_5_9": 0.0, + "fgm_20_29": 3.0, + "pts_allow_21_27": 0.0, + "xpm": 1.0, + "rush_2pt": 2.0, + "fum_rec": 2.0, + "rec_10_19": 0.0, + "def_st_td": 6.0, + "fgm_50p": 3.0, + "def_td": 6.0, + "safe": 2.0, + "pass_yd": 0.04, + "blk_kick": 2.0, + "pass_td": 4.0, + "rush_yd": 0.1, + "fum": 0.0, + "pts_allow_28_34": -1.0, + "pts_allow_35p": -4.0, + "fum_rec_td": 6.0, + "rec_yd": 0.1, + "def_st_ff": 0.0, + "pts_allow_7_13": 4.0, + "st_ff": 0.0, + }, + "last_message_id": "982454396099362816", + "display_order": 1, + "last_author_avatar": "5c5c3b22010fc2b2615a1eb147b0e051", + "last_author_display_name": "joeyagreco", + "last_author_id": "852776903310966784", + "last_author_is_bot": False, + "last_message_attachment": None, + "last_message_text_map": None, + "last_message_time": 1688597890480, + "last_pinned_message_id": "931354251186577408", + "draft_id": "863198403067240448", + "last_read_id": "982454396099362816", + "league_id": "863198402471673856", + "previous_league_id": None, + "group_id": None, + "last_transaction_id": None, + "roster_positions": [ + "QB", + "RB", + "RB", + "WR", + "WR", + "TE", + "FLEX", + "FLEX", + "K", + "BN", + "BN", + "BN", + "BN", + "BN", + "BN", + ], + "bracket_id": 908645163168309248, + "loser_bracket_id": 908645163168309249, + "total_rosters": 12, + }, + { + "name": "Kick Picks", + "status": "complete", + "metadata": { + "auto_continue": "on", + "continued": "yes", + "keeper_deadline": "0", + "latest_league_winner_roster_id": "6", + }, + "settings": { + "best_ball": 0, + "last_report": 16, + "waiver_budget": 100, + "disable_adds": 0, + "capacity_override": 0, + "waiver_bid_min": 0, + "taxi_deadline": 0, + "draft_rounds": 3, + "reserve_allow_na": 0, + "start_week": 2, + "playoff_seed_type": 1, + "playoff_teams": 4, + "veto_votes_needed": 3, + "num_teams": 6, + "daily_waivers_hour": 0, + "playoff_type": 0, + "taxi_slots": 0, + "last_scored_leg": 18, + "daily_waivers_days": 5461, + "playoff_week_start": 17, + "waiver_clear_days": 1, + "reserve_allow_doubtful": 0, + "commissioner_direct_invite": 0, + "veto_auto_poll": 0, + "reserve_allow_dnr": 0, + "taxi_allow_vets": 0, + "waiver_day_of_week": 2, + "playoff_round_type": 0, + "reserve_allow_out": 0, + "reserve_allow_sus": 0, + "veto_show_votes": 0, + "trade_deadline": 11, + "taxi_years": 0, + "daily_waivers": 0, + "disable_trades": 0, + "pick_trading": 1, + "type": 0, + "max_keepers": 1, + "waiver_type": 2, + "league_average_match": 0, + "trade_review_days": 1, + "bench_lock": 1, + "offseason_adds": 0, + "leg": 18, + "reserve_slots": 0, + "reserve_allow_cov": 0, + "daily_waivers_last_ran": 15, + }, + "avatar": None, + "company_id": None, + "shard": 242, + "season": "2022", + "season_type": "regular", + "sport": "nfl", + "scoring_settings": { + "sack": 1.0, + "fgm_40_49": 0.0, + "pass_int": -1.0, + "fgmiss_50p": 1.0, + "pts_allow_0": 10.0, + "pass_2pt": 2.0, + "st_td": 6.0, + "rec_td": 6.0, + "fgm_30_39": 0.0, + "xpmiss": 3.0, + "rush_td": 6.0, + "fgm": -0.25, + "rec_2pt": 2.0, + "st_fum_rec": 1.0, + "fgmiss": 0.0, + "ff": 1.0, + "fgmiss_30_39": 3.0, + "rec": 1.0, + "pts_allow_14_20": 1.0, + "fgm_0_19": 0.0, + "int": 2.0, + "def_st_fum_rec": 1.0, + "fum_lost": -2.0, + "pts_allow_1_6": 7.0, + "fgmiss_20_29": 4.0, + "fgm_20_29": 0.0, + "pts_allow_21_27": 0.0, + "xpm": -0.25, + "fgmiss_0_19": 5.0, + "rush_2pt": 2.0, + "fum_rec": 2.0, + "def_st_td": 6.0, + "fgm_50p": 0.0, + "def_td": 6.0, + "safe": 2.0, + "pass_yd": 0.04, + "fgmiss_40_49": 2.0, + "blk_kick": 2.0, + "pass_td": 4.0, + "rush_yd": 0.1, + "fum": 0.0, + "pts_allow_28_34": -1.0, + "pts_allow_35p": -4.0, + "fum_rec_td": 6.0, + "rec_yd": 0.1, + "def_st_ff": 1.0, + "pts_allow_7_13": 4.0, + "st_ff": 1.0, + }, + "last_message_id": "1001971729176166400", + "display_order": 2, + "last_author_avatar": "82aec8e811b839b8ec25d7b458afd57b", + "last_author_display_name": "RickyJ49", + "last_author_id": "869382250104578048", + "last_author_is_bot": False, + "last_message_attachment": None, + "last_message_text_map": None, + "last_message_time": 1693251185272, + "last_pinned_message_id": None, + "draft_id": "874771855859945472", + "last_read_id": "1001971729176166400", + "league_id": "874771854727471104", + "previous_league_id": None, + "group_id": None, + "last_transaction_id": None, + "roster_positions": ["K", "K", "K", "BN"], + "bracket_id": 913710415370788864, + "loser_bracket_id": 913710415374983168, + "total_rosters": 6, + }, +] + +# USER B +USER_B_USER_ID = "589073650351644672" +USER_B_USERNAME = "sleeper" +USER_B_AVATAR_ID = "d9a0519df672516d2b6fce037f374456" +USER_B_USER = { + "avatar": "d9a0519df672516d2b6fce037f374456", + "cookies": None, + "created": None, + "currencies": None, + "data_updated": None, + "deleted": None, + "display_name": "Sleeper", + "email": None, + "is_bot": True, + "metadata": None, + "notifications": None, + "pending": None, + "phone": None, + "real_name": None, + "solicitable": None, + "summoner_name": None, + "summoner_region": None, + "token": None, + "user_id": "589073650351644672", + "username": "sleeper", + "verification": None, +} + +# LEAGUE A +LEAGUE_A_LEAGUE_ID = "874771854727471104" +LEAGUE_A_LEAGUE = { + "name": "Kick Picks", + "status": "complete", + "metadata": { + "auto_continue": "on", + "continued": "yes", + "keeper_deadline": "0", + "latest_league_winner_roster_id": "6", + }, + "settings": { + "best_ball": 0, + "last_report": 16, + "waiver_budget": 100, + "disable_adds": 0, + "capacity_override": 0, + "waiver_bid_min": 0, + "taxi_deadline": 0, + "draft_rounds": 3, + "reserve_allow_na": 0, + "start_week": 2, + "playoff_seed_type": 1, + "playoff_teams": 4, + "veto_votes_needed": 3, + "num_teams": 6, + "daily_waivers_hour": 0, + "playoff_type": 0, + "taxi_slots": 0, + "last_scored_leg": 18, + "daily_waivers_days": 5461, + "playoff_week_start": 17, + "waiver_clear_days": 1, + "reserve_allow_doubtful": 0, + "commissioner_direct_invite": 0, + "veto_auto_poll": 0, + "reserve_allow_dnr": 0, + "taxi_allow_vets": 0, + "waiver_day_of_week": 2, + "playoff_round_type": 0, + "reserve_allow_out": 0, + "reserve_allow_sus": 0, + "veto_show_votes": 0, + "trade_deadline": 11, + "taxi_years": 0, + "daily_waivers": 0, + "disable_trades": 0, + "pick_trading": 1, + "type": 0, + "max_keepers": 1, + "waiver_type": 2, + "league_average_match": 0, + "trade_review_days": 1, + "bench_lock": 1, + "offseason_adds": 0, + "leg": 18, + "reserve_slots": 0, + "reserve_allow_cov": 0, + "daily_waivers_last_ran": 15, + }, + "avatar": None, + "company_id": None, + "shard": 242, + "season": "2022", + "season_type": "regular", + "sport": "nfl", + "scoring_settings": { + "sack": 1.0, + "fgm_40_49": 0.0, + "pass_int": -1.0, + "fgmiss_50p": 1.0, + "pts_allow_0": 10.0, + "pass_2pt": 2.0, + "st_td": 6.0, + "rec_td": 6.0, + "fgm_30_39": 0.0, + "xpmiss": 3.0, + "rush_td": 6.0, + "fgm": -0.25, + "rec_2pt": 2.0, + "st_fum_rec": 1.0, + "fgmiss": 0.0, + "ff": 1.0, + "fgmiss_30_39": 3.0, + "rec": 1.0, + "pts_allow_14_20": 1.0, + "fgm_0_19": 0.0, + "int": 2.0, + "def_st_fum_rec": 1.0, + "fum_lost": -2.0, + "pts_allow_1_6": 7.0, + "fgmiss_20_29": 4.0, + "fgm_20_29": 0.0, + "pts_allow_21_27": 0.0, + "xpm": -0.25, + "fgmiss_0_19": 5.0, + "rush_2pt": 2.0, + "fum_rec": 2.0, + "def_st_td": 6.0, + "fgm_50p": 0.0, + "def_td": 6.0, + "safe": 2.0, + "pass_yd": 0.04, + "fgmiss_40_49": 2.0, + "blk_kick": 2.0, + "pass_td": 4.0, + "rush_yd": 0.1, + "fum": 0.0, + "pts_allow_28_34": -1.0, + "pts_allow_35p": -4.0, + "fum_rec_td": 6.0, + "rec_yd": 0.1, + "def_st_ff": 1.0, + "pts_allow_7_13": 4.0, + "st_ff": 1.0, + }, + "last_message_id": "1001971729176166400", + "last_author_avatar": "82aec8e811b839b8ec25d7b458afd57b", + "last_author_display_name": "RickyJ49", + "last_author_id": "869382250104578048", + "last_author_is_bot": False, + "last_message_attachment": None, + "last_message_text_map": None, + "last_message_time": 1693251185272, + "last_pinned_message_id": None, + "draft_id": "874771855859945472", + "league_id": "874771854727471104", + "previous_league_id": None, + "last_read_id": None, + "bracket_id": 913710415370788864, + "group_id": None, + "roster_positions": ["K", "K", "K", "BN"], + "loser_bracket_id": 913710415374983168, + "total_rosters": 6, +} +LEAGUE_A_DRAFT_1 = { + "created": 1662924372208, + "creators": ["852776903310966784"], + "draft_id": "874771855859945472", + "draft_order": { + "729138469988884480": 1, + "852776903310966784": 6, + "861082899649261568": 4, + "862555482408194048": 2, + "862871829390409728": 5, + "869382250104578048": 3, + }, + "last_message_id": "876156180051845120", + "last_message_time": 1663254420820, + "last_picked": 1663254420543, + "league_id": "874771854727471104", + "metadata": {"description": "", "name": "Kick Picks", "scoring_type": "ppr"}, + "season": "2022", + "season_type": "regular", + "settings": { + "alpha_sort": 0, + "autopause_enabled": 1, + "autopause_end_time": 900, + "autopause_start_time": 180, + "autostart": 0, + "cpu_autopick": 0, + "enforce_position_limits": 1, + "nomination_timer": 60, + "pick_timer": 28800, + "player_type": 0, + "reversal_round": 0, + "rounds": 4, + "slots_bn": 1, + "slots_k": 3, + "teams": 6, + }, + "slot_to_roster_id": {"1": 3, "2": 6, "3": 5, "4": 2, "5": 4, "6": 1}, + "sport": "nfl", + "start_time": 1662927345674, + "status": "complete", + "type": "snake", +} +LEAGUE_A_DRAFTS = [ + { + "created": 1662924372208, + "creators": ["852776903310966784"], + "draft_id": "874771855859945472", + "draft_order": { + "729138469988884480": 1, + "852776903310966784": 6, + "861082899649261568": 4, + "862555482408194048": 2, + "862871829390409728": 5, + "869382250104578048": 3, + }, + "last_message_id": "876156180051845120", + "last_message_time": 1663254420820, + "last_picked": 1663254420543, + "league_id": "874771854727471104", + "metadata": {"description": "", "name": "Kick Picks", "scoring_type": "ppr"}, + "season": "2022", + "season_type": "regular", + "settings": { + "alpha_sort": 0, + "autopause_enabled": 1, + "autopause_end_time": 900, + "autopause_start_time": 180, + "autostart": 0, + "cpu_autopick": 0, + "enforce_position_limits": 1, + "nomination_timer": 60, + "pick_timer": 28800, + "player_type": 0, + "reversal_round": 0, + "rounds": 4, + "slots_bn": 1, + "slots_k": 3, + "teams": 6, + }, + "sport": "nfl", + "start_time": 1662927345674, + "status": "complete", + "type": "snake", + } +] +LEAGUE_A_DRAFT_ID_1 = "874771855859945472" +LEAGUE_A_DRAFT_ID_2 = "1121675041713864705" +LEAGUE_A_DRAFT_ID_2_TRADED_PICKS = [ + { + "round": 8, + "season": "2024", + "draft_id": 1121675041713864705, + "roster_id": 1, + "owner_id": 4, + "previous_owner_id": 1, + }, + { + "round": 5, + "season": "2024", + "draft_id": 1121675041713864705, + "roster_id": 2, + "owner_id": 1, + "previous_owner_id": 2, + }, + { + "round": 2, + "season": "2024", + "draft_id": 1121675041713864705, + "roster_id": 5, + "owner_id": 3, + "previous_owner_id": 5, + }, + { + "round": 5, + "season": "2024", + "draft_id": 1121675041713864705, + "roster_id": 5, + "owner_id": 2, + "previous_owner_id": 5, + }, + { + "round": 2, + "season": "2024", + "draft_id": 1121675041713864705, + "roster_id": 6, + "owner_id": 3, + "previous_owner_id": 6, + }, +] + +# LEAGUE B +LEAGUE_B_LEAGUE_ID = "1002446817038147584" +LEAGUE_B_USERS = [ + { + "avatar": "f3b1db9fae71021fde37731161529701", + "display_name": "AlWebz", + "is_bot": False, + "is_owner": False, + "league_id": "1002446817038147584", + "metadata": {"allow_pn": "on", "archived": "off", "mention_pn": "on"}, + "settings": None, + "user_id": "729138469988884480", + }, + { + "avatar": "5c5c3b22010fc2b2615a1eb147b0e051", + "display_name": "joeyagreco", + "is_bot": False, + "is_owner": True, + "league_id": "1002446817038147584", + "metadata": { + "allow_pn": "on", + "allow_sms": "on", + "archived": "off", + "mascot_item_type_id_leg_10": "jessica", + "mascot_item_type_id_leg_11": "jessica", + "mascot_item_type_id_leg_12": "jessica", + "mascot_item_type_id_leg_13": "jessica", + "mascot_item_type_id_leg_14": "jessica", + "mascot_item_type_id_leg_15": "jessica", + "mascot_item_type_id_leg_16": "jessica", + "mascot_item_type_id_leg_17": "jessica", + "mascot_item_type_id_leg_18": "jessica", + "mascot_item_type_id_leg_4": "jessica", + "mascot_item_type_id_leg_5": "jessica", + "mascot_item_type_id_leg_6": "jessica", + "mascot_item_type_id_leg_7": "jessica", + "mascot_item_type_id_leg_8": "jessica", + "mascot_item_type_id_leg_9": "jessica", + "mascot_message_emotion_leg_4": "idle", + "mention_pn": "on", + "show_mascots": "on", + "team_name": "miss me w that make shit", + }, + "settings": None, + "user_id": "852776903310966784", + }, + { + "avatar": "2df0f395f42ba17fdec89accc3b38c8e", + "display_name": "evanheff25", + "is_bot": False, + "is_owner": False, + "league_id": "1002446817038147584", + "metadata": {"allow_pn": "on", "mention_pn": "on"}, + "settings": None, + "user_id": "861082899649261568", + }, + { + "avatar": "b3338675f635c2c1f42b469621d38ec6", + "display_name": "mrdingleberry", + "is_bot": False, + "is_owner": False, + "league_id": "1002446817038147584", + "metadata": {"allow_pn": "on", "mention_pn": "on"}, + "settings": None, + "user_id": "862555482408194048", + }, + { + "avatar": "82aec8e811b839b8ec25d7b458afd57b", + "display_name": "psnodgrass", + "is_bot": False, + "is_owner": False, + "league_id": "1002446817038147584", + "metadata": { + "allow_pn": "on", + "avatar": "https://sleepercdn.com/uploads/129537b5d2022d40ca18bc46c4596ebf.jpg", + "mention_pn": "on", + "team_name": "Fat Randy’s missers", + }, + "settings": None, + "user_id": "862871829390409728", + }, + { + "avatar": "82aec8e811b839b8ec25d7b458afd57b", + "display_name": "RickyJ49", + "is_bot": False, + "is_owner": False, + "league_id": "1002446817038147584", + "metadata": {"allow_pn": "on", "mention_pn": "on"}, + "settings": None, + "user_id": "869382250104578048", + }, +] +LEAGUE_B_WEEK_1_MATCHUPS = [ + { + "points": -2.75, + "players": ["10955", "1433", "17", "4195"], + "roster_id": 1, + "custom_points": None, + "matchup_id": 3, + "starters": ["17", "1433", "10955"], + "starters_points": [-1.0, -1.25, -0.5], + "players_points": {"10955": -0.5, "1433": -1.25, "17": -1.0, "4195": 1.75}, + }, + { + "points": 0.0, + "players": ["11008", "2747", "3678", "7922"], + "roster_id": 2, + "custom_points": None, + "matchup_id": 2, + "starters": ["2747", "7922", "11008"], + "starters_points": [2.25, -0.75, -1.5], + "players_points": {"11008": -1.5, "2747": 2.25, "3678": 3.5, "7922": -0.75}, + }, + { + "points": -2.75, + "players": ["11058", "1266", "3451", "6528"], + "roster_id": 3, + "custom_points": None, + "matchup_id": 1, + "starters": ["1266", "11058", "3451"], + "starters_points": [-1.0, -1.0, -0.75], + "players_points": {"11058": -1.0, "1266": -1.0, "3451": -0.75, "6528": -1.0}, + }, + { + "points": -2.5, + "players": ["1264", "5095", "7042", "8259"], + "roster_id": 4, + "custom_points": None, + "matchup_id": 1, + "starters": ["1264", "5095", "7042"], + "starters_points": [-0.75, -0.75, -1.0], + "players_points": {"1264": -0.75, "5095": -0.75, "7042": -1.0, "8259": -1.5}, + }, + { + "points": -1.75, + "players": ["1348", "1945", "2020", "5119"], + "roster_id": 5, + "custom_points": None, + "matchup_id": 3, + "starters": ["2020", "1348", "1945"], + "starters_points": [-0.5, -1.0, -0.25], + "players_points": {"1348": -1.0, "1945": -0.25, "2020": -0.5, "5119": 1.5}, + }, + { + "points": 1.25, + "players": ["11533", "4666", "4958", "5272"], + "roster_id": 6, + "custom_points": None, + "matchup_id": 2, + "starters": ["5272", "4958", "11533"], + "starters_points": [-0.75, 0.5, 1.5], + "players_points": {"11533": 1.5, "4666": -1.0, "4958": 0.5, "5272": -0.75}, + }, +] +LEAGUE_B_WINNERS_BRACKET = [ + {"m": 1, "r": 1, "l": 3, "w": 2, "t1": 3, "t2": 2}, + {"m": 2, "r": 1, "l": 5, "w": 1, "t1": 5, "t2": 1}, + { + "p": 1, + "m": 3, + "r": 2, + "l": 2, + "w": 1, + "t1": 2, + "t2": 1, + "t2_from": {"w": 2}, + "t1_from": {"w": 1}, + }, + { + "p": 3, + "m": 4, + "r": 2, + "l": 3, + "w": 5, + "t1": 3, + "t2": 5, + "t2_from": {"l": 2}, + "t1_from": {"l": 1}, + }, +] +LEAGUE_B_LOSERS_BRACKET = [{"p": 1, "m": 1, "r": 1, "l": 4, "w": 6, "t1": 4, "t2": 6}] +LEAGUE_B_WEEK_1_TRANSACTIONS = [ + { + "status": "complete", + "type": "waiver", + "metadata": {"notes": "Your waiver claim was processed successfully!"}, + "created": 1694529022395, + "settings": {"seq": 0, "waiver_bid": 0}, + "leg": 1, + "draft_picks": [], + "creator": "862871829390409728", + "transaction_id": "1007331366539956224", + "adds": {"503": 4}, + "consenter_ids": [4], + "drops": {"1264": 4}, + "roster_ids": [4], + "status_updated": 1694588952347, + "waiver_budget": [], + }, + { + "status": "complete", + "type": "waiver", + "metadata": {"notes": "Your waiver claim was processed successfully!"}, + "created": 1693918172956, + "settings": {"seq": 0, "waiver_bid": 0}, + "leg": 1, + "draft_picks": [], + "creator": "862555482408194048", + "transaction_id": "1004769278291283968", + "adds": {"11533": 6}, + "consenter_ids": [6], + "drops": {"503": 6}, + "roster_ids": [6], + "status_updated": 1693984137148, + "waiver_budget": [], + }, + { + "status": "complete", + "type": "free_agent", + "metadata": None, + "created": 1693874059318, + "settings": None, + "leg": 1, + "draft_picks": [], + "creator": "862555482408194048", + "transaction_id": "1004584252282834944", + "adds": {"4958": 6}, + "consenter_ids": [6], + "drops": {"4227": 6}, + "roster_ids": [6], + "status_updated": 1693874059318, + "waiver_budget": [], + }, + { + "status": "complete", + "type": "free_agent", + "metadata": None, + "created": 1693873957016, + "settings": None, + "leg": 1, + "draft_picks": [], + "creator": "862555482408194048", + "transaction_id": "1004583823197147136", + "adds": {"5272": 6}, + "consenter_ids": [6], + "drops": {"7839": 6}, + "roster_ids": [6], + "status_updated": 1693873957016, + "waiver_budget": [], + }, +] + +# LEAGUE C +LEAGUE_C_LEAGUE_ID = "917112471750574080" +LEAGUE_C_TRADED_PICKS = [ + { + "round": 2, + "season": "2023", + "roster_id": 1, + "owner_id": 6, + "previous_owner_id": 1, + }, + { + "round": 4, + "season": "2024", + "roster_id": 2, + "owner_id": 1, + "previous_owner_id": 2, + }, + { + "round": 2, + "season": "2024", + "roster_id": 3, + "owner_id": 6, + "previous_owner_id": 3, + }, + { + "round": 1, + "season": "2023", + "roster_id": 4, + "owner_id": 1, + "previous_owner_id": 4, + }, + { + "round": 10, + "season": "2023", + "roster_id": 4, + "owner_id": 5, + "previous_owner_id": 4, + }, + { + "round": 6, + "season": "2023", + "roster_id": 5, + "owner_id": 4, + "previous_owner_id": 5, + }, + { + "round": 8, + "season": "2023", + "roster_id": 5, + "owner_id": 6, + "previous_owner_id": 5, + }, + { + "round": 8, + "season": "2023", + "roster_id": 6, + "owner_id": 3, + "previous_owner_id": 6, + }, + { + "round": 3, + "season": "2024", + "roster_id": 6, + "owner_id": 3, + "previous_owner_id": 6, + }, + { + "round": 5, + "season": "2024", + "roster_id": 6, + "owner_id": 1, + "previous_owner_id": 6, + }, +] diff --git a/test/integration/test_api/test_avatar.py b/test/integration/test_api/test_avatar.py new file mode 100644 index 0000000..4337bbd --- /dev/null +++ b/test/integration/test_api/test_avatar.py @@ -0,0 +1,25 @@ +import os +import unittest + +from sleeper.api import get_avatar +from test.integration.test_api.constants import USER_B_AVATAR_ID + + +class TestAvatar(unittest.TestCase): + _PATH_TO_TEST_DIR = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "util", "bin") + ) + + with open(os.path.join(_PATH_TO_TEST_DIR, "sleeper.bin"), "rb") as image: + _SLEEPER_AVATAR_BYTES = image.read() + + with open(os.path.join(_PATH_TO_TEST_DIR, "sleeper_thumb.bin"), "rb") as image: + _SLEEPER_THUMBNAIL_AVATAR_BYTES = image.read() + + def test_get_avatar_defaults(self): + response = get_avatar(avatar_id=USER_B_AVATAR_ID) + self.assertEqual(self._SLEEPER_AVATAR_BYTES, response) + + def test_get_avatar_as_thumbnail(self): + response = get_avatar(avatar_id=USER_B_AVATAR_ID, as_thumbnail=True) + self.assertEqual(self._SLEEPER_THUMBNAIL_AVATAR_BYTES, response) diff --git a/test/integration/test_api/test_draft.py b/test/integration/test_api/test_draft.py new file mode 100644 index 0000000..2e42053 --- /dev/null +++ b/test/integration/test_api/test_draft.py @@ -0,0 +1,46 @@ +import unittest + +from sleeper.api import ( + get_draft, + get_drafts_in_league, + get_player_draft_picks, + get_traded_draft_picks, + get_user_drafts_for_year, +) +from test.integration.test_api.constants import ( + LEAGUE_A_DRAFT_1, + LEAGUE_A_DRAFT_ID_1, + LEAGUE_A_DRAFT_ID_2, + LEAGUE_A_DRAFT_ID_2_TRADED_PICKS, + LEAGUE_A_DRAFTS, + LEAGUE_A_LEAGUE_ID, + USER_A_DRAFT_PICKS_DRAFT_ID_1_2023, + USER_A_DRAFTS_2023, + USER_A_USER_ID, +) + + +class TestDraft(unittest.TestCase): + def test_get_user_drafts_for_year_happy_path(self): + response = get_user_drafts_for_year( + user_id=USER_A_USER_ID, sport="nfl", year=2023 + ) + self.assertEqual(USER_A_DRAFTS_2023, response) + + def test_get_drafts_in_league(self): + response = get_drafts_in_league(league_id=LEAGUE_A_LEAGUE_ID) + self.assertEqual(LEAGUE_A_DRAFTS, response) + + def test_get_draft(self): + response = get_draft(draft_id=LEAGUE_A_DRAFT_ID_1) + self.assertEqual(LEAGUE_A_DRAFT_1, response) + + def test_get_player_draft_picks(self): + response = get_player_draft_picks( + draft_id=LEAGUE_A_DRAFT_ID_1, + ) + self.assertEqual(USER_A_DRAFT_PICKS_DRAFT_ID_1_2023, response) + + def test_get_traded_draft_picks(self): + response = get_traded_draft_picks(draft_id=LEAGUE_A_DRAFT_ID_2) + self.assertEqual(LEAGUE_A_DRAFT_ID_2_TRADED_PICKS, response) diff --git a/test/integration/test_api/test_league.py b/test/integration/test_api/test_league.py new file mode 100644 index 0000000..a3c16f6 --- /dev/null +++ b/test/integration/test_api/test_league.py @@ -0,0 +1,79 @@ +import unittest + +from sleeper.api import ( + get_league, + get_losers_bracket, + get_matchups_for_week, + get_rosters, + get_sport_state, + get_traded_picks, + get_transactions, + get_user_leagues_for_year, + get_users_in_league, + get_winners_bracket, +) +from test.integration.test_api.constants import ( + LEAGUE_A_LEAGUE, + LEAGUE_A_LEAGUE_ID, + LEAGUE_B_LEAGUE_ID, + LEAGUE_B_LOSERS_BRACKET, + LEAGUE_B_USERS, + LEAGUE_B_WEEK_1_MATCHUPS, + LEAGUE_B_WEEK_1_TRANSACTIONS, + LEAGUE_B_WINNERS_BRACKET, + LEAGUE_C_LEAGUE_ID, + LEAGUE_C_TRADED_PICKS, + USER_A_LEAGUES_2022, + USER_A_USER_ID, +) + + +class TestLeague(unittest.TestCase): + def test_get_league(self): + response = get_league(league_id=LEAGUE_A_LEAGUE_ID) + self.assertEqual(LEAGUE_A_LEAGUE, response) + + def test_get_user_leagues_for_year(self): + response = get_user_leagues_for_year( + user_id=USER_A_USER_ID, sport="nfl", year=2022 + ) + self.assertEqual(USER_A_LEAGUES_2022, response) + + def test_get_rosters(self): + response = get_rosters(league_id=LEAGUE_A_LEAGUE_ID) + # this response will constantly change, so just assert some general things + self.assertIsInstance(response, list) + self.assertEqual(6, len(response)) + for item in response: + self.assertIsInstance(item, dict) + + def test_get_users_in_league(self): + response = get_users_in_league(league_id=LEAGUE_B_LEAGUE_ID) + self.assertEqual(LEAGUE_B_USERS, response) + + def test_get_matchups_for_week(self): + response = get_matchups_for_week(league_id=LEAGUE_B_LEAGUE_ID, week=1) + self.assertEqual(LEAGUE_B_WEEK_1_MATCHUPS, response) + + def test_get_winners_bracket(self): + response = get_winners_bracket(league_id=LEAGUE_B_LEAGUE_ID) + self.assertEqual(LEAGUE_B_WINNERS_BRACKET, response) + + def test_get_losers_bracket(self): + response = get_losers_bracket(league_id=LEAGUE_B_LEAGUE_ID) + self.assertEqual(LEAGUE_B_LOSERS_BRACKET, response) + + def test_get_transactions(self): + response = get_transactions(league_id=LEAGUE_B_LEAGUE_ID, week=1) + self.assertEqual(LEAGUE_B_WEEK_1_TRANSACTIONS, response) + + def test_get_traded_picks(self): + response = get_traded_picks(league_id=LEAGUE_C_LEAGUE_ID) + self.assertEqual(LEAGUE_C_TRADED_PICKS, response) + + def test_get_sport_state(self): + response = get_sport_state(sport="nfl") + # this response will constantly change, so just assert some general things + self.assertIsInstance(response, dict) + for k in response.keys(): + self.assertIsInstance(k, str) diff --git a/test/integration/test_api/test_player.py b/test/integration/test_api/test_player.py new file mode 100644 index 0000000..13fb993 --- /dev/null +++ b/test/integration/test_api/test_player.py @@ -0,0 +1,21 @@ +import unittest + +from sleeper.api import get_all_players, get_trending_players + + +class TestPlayer(unittest.TestCase): + def test_get_all_players(self): + response = get_all_players(sport="nfl") + # this response will constantly change, so just assert some general things + self.assertIsInstance(response, dict) + for k, v in response.items(): + self.assertIsInstance(k, str) + self.assertIsInstance(v, dict) + + def test_get_trending_players(self): + response = get_trending_players(sport="nfl", trend_type="add") + # this response will constantly change, so just assert some general things + self.assertIsInstance(response, list) + self.assertEqual(25, len(response)) + for item in response: + self.assertIsInstance(item, dict) diff --git a/test/integration/test_api/test_user.py b/test/integration/test_api/test_user.py new file mode 100644 index 0000000..019f29f --- /dev/null +++ b/test/integration/test_api/test_user.py @@ -0,0 +1,18 @@ +import unittest + +from sleeper.api import get_user +from test.integration.test_api.constants import ( + USER_B_USER, + USER_B_USER_ID, + USER_B_USERNAME, +) + + +class TestUser(unittest.TestCase): + def test_get_user_with_user_id_as_identifier(self): + response = get_user(identifier=USER_B_USER_ID) + self.assertEqual(response, USER_B_USER) + + def test_get_user_with_username_as_identifier(self): + response = get_user(identifier=USER_B_USERNAME) + self.assertEqual(response, USER_B_USER) diff --git a/test/integration/util/bin/sleeper.bin b/test/integration/util/bin/sleeper.bin new file mode 100644 index 0000000..1cd3340 Binary files /dev/null and b/test/integration/util/bin/sleeper.bin differ diff --git a/test/integration/util/bin/sleeper_thumb.bin b/test/integration/util/bin/sleeper_thumb.bin new file mode 100644 index 0000000..2340a39 Binary files /dev/null and b/test/integration/util/bin/sleeper_thumb.bin differ diff --git a/test/test_api/test_AvatarAPIClient.py b/test/test_api/test_AvatarAPIClient.py deleted file mode 100644 index 1198e45..0000000 --- a/test/test_api/test_AvatarAPIClient.py +++ /dev/null @@ -1,76 +0,0 @@ -import os -import tempfile -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from requests import HTTPError - -from sleeper.api.AvatarAPIClient import AvatarAPIClient -from sleeper.exception.SleeperAPIException import SleeperAPIException - - -class TestAvatarAPIClient(unittest.TestCase): - PATH_TO_TEST_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "files", "api") - ) - - @mock.patch("requests.get") - def test_get_avatar_happy_path(self, mock_requests_get): - mock_dict = dict() - with open(os.path.join(self.PATH_TO_TEST_DIR, "test.png"), "rb") as image: - f = image.read() - original_image_bytes = bytearray(f) - mock_response = MockResponse(mock_dict, 200, content=original_image_bytes) - mock_requests_get.return_value = mock_response - - with tempfile.TemporaryDirectory() as temp_dir: - full_image_path = os.path.join(temp_dir, "tmp.png") - AvatarAPIClient.get_avatar(avatar_id="avatar_id", save_to_path=full_image_path) - - with open(full_image_path, "rb") as image: - f = image.read() - saved_image_bytes = bytearray(f) - self.assertEqual(original_image_bytes, saved_image_bytes) - self.assertTrue(os.path.exists(full_image_path)) - - @mock.patch("requests.get") - def test_get_avatar_thumbnail_is_true_happy_path(self, mock_requests_get): - mock_dict = dict() - with open(os.path.join(self.PATH_TO_TEST_DIR, "test.png"), "rb") as image: - f = image.read() - original_image_bytes = bytearray(f) - mock_response = MockResponse(mock_dict, 200, content=original_image_bytes) - mock_requests_get.return_value = mock_response - - with tempfile.TemporaryDirectory() as temp_dir: - full_image_path = os.path.join(temp_dir, "tmp.png") - AvatarAPIClient.get_avatar( - avatar_id="avatar_id", save_to_path=full_image_path, thumbnail=True - ) - - with open(full_image_path, "rb") as image: - f = image.read() - saved_image_bytes = bytearray(f) - self.assertEqual(original_image_bytes, saved_image_bytes) - self.assertTrue(os.path.exists(full_image_path)) - - @mock.patch("requests.get") - def test_get_avatar_avatar_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(SleeperAPIException) as context: - AvatarAPIClient.get_avatar(avatar_id="avatar_id", save_to_path="") - self.assertEqual("No image found.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_avatar_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = dict() - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - AvatarAPIClient.get_avatar(avatar_id="avatar_id", save_to_path="") - self.assertEqual("404 Client Error", str(context.exception)) diff --git a/test/test_api/test_DraftAPIClient.py b/test/test_api/test_DraftAPIClient.py deleted file mode 100644 index f24b74b..0000000 --- a/test/test_api/test_DraftAPIClient.py +++ /dev/null @@ -1,465 +0,0 @@ -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from requests import HTTPError - -from sleeper.api import DraftAPIClient -from sleeper.enum.DraftStatus import DraftStatus -from sleeper.enum.DraftType import DraftType -from sleeper.enum.InjuryStatus import InjuryStatus -from sleeper.enum.nfl.NFLPlayerStatus import NFLPlayerStatus -from sleeper.enum.nfl.NFLPosition import NFLPosition -from sleeper.enum.nfl.NFLTeam import NFLTeam -from sleeper.enum.ScoringType import ScoringType -from sleeper.enum.SeasonType import SeasonType -from sleeper.enum.Sport import Sport -from sleeper.model.Draft import Draft -from sleeper.model.DraftMetadata import DraftMetadata -from sleeper.model.DraftPick import DraftPick -from sleeper.model.DraftSettings import DraftSettings -from sleeper.model.PlayerDraftPick import PlayerDraftPick -from sleeper.model.PlayerDraftPickMetadata import PlayerDraftPickMetadata - - -class TestDraftAPIClient(unittest.TestCase): - @mock.patch("requests.get") - def test_get_user_drafts_for_year_happy_path(self, mock_requests_get): - mock_list = [ - { - "type": "snake", - "status": "complete", - "start_time": 1630891562020, - "sport": "nfl", - "settings": { - "teams": 8, - "slots_wr": 3, - "slots_te": 1, - "slots_rb": 2, - "slots_qb": 2, - "slots_super_flex": 1, - "slots_flex": 3, - "slots_bn": 6, - "rounds": 17, - "reversal_round": 0, - "player_type": 0, - "pick_timer": 0, - "nomination_timer": 60, - "enforce_position_limits": 1, - "cpu_autopick": 1, - "alpha_sort": 0, - }, - "season_type": "regular", - "season": "2021", - "metadata": {"scoring_type": "2qb", "name": "The Test", "description": "des"}, - "league_id": "738979251063275520", - "last_picked": 1630897024291, - "last_message_time": 1630897024793, - "last_message_id": "740439424466202624", - "draft_order": {"123": 45}, - "draft_id": "738979252392919040", - "creators": ["12345", "67890"], - "created": 1630548892636, - "slot_to_roster_id": {"123": 45}, - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = DraftAPIClient.get_user_drafts_for_year( - user_id="user_id", sport=Sport.NFL, year="2020" - ) - - self.assertIsInstance(response, list) - self.assertIsInstance(response[0], Draft) - self.assertEqual(1630548892636, response[0].created) - self.assertEqual(["12345", "67890"], response[0].creators) - self.assertEqual("738979252392919040", response[0].draft_id) - self.assertEqual({"123": 45}, response[0].draft_order) - self.assertEqual("740439424466202624", response[0].last_message_id) - self.assertEqual(1630897024793, response[0].last_message_time) - self.assertEqual(1630897024291, response[0].last_picked) - self.assertEqual("738979251063275520", response[0].league_id) - self.assertIsInstance(response[0].metadata, DraftMetadata) - self.assertEqual("des", response[0].metadata.description) - self.assertEqual("The Test", response[0].metadata.name) - self.assertEqual(ScoringType.TWO_QB, response[0].metadata.scoring_type) - self.assertEqual("2021", response[0].season) - self.assertEqual(SeasonType.REGULAR, response[0].season_type) - self.assertIsInstance(response[0].settings, DraftSettings) - self.assertEqual(0, response[0].settings.alpha_sort) - self.assertEqual(1, response[0].settings.cpu_autopick) - self.assertEqual(1, response[0].settings.enforce_position_limits) - self.assertEqual(60, response[0].settings.nomination_timer) - self.assertEqual(0, response[0].settings.pick_timer) - self.assertEqual(0, response[0].settings.player_type) - self.assertEqual(0, response[0].settings.reversal_round) - self.assertEqual(17, response[0].settings.rounds) - self.assertEqual(6, response[0].settings.slots_bn) - self.assertEqual(3, response[0].settings.slots_flex) - self.assertEqual(2, response[0].settings.slots_qb) - self.assertEqual(2, response[0].settings.slots_rb) - self.assertEqual(1, response[0].settings.slots_super_flex) - self.assertEqual(1, response[0].settings.slots_te) - self.assertEqual(3, response[0].settings.slots_wr) - self.assertEqual(8, response[0].settings.teams) - self.assertEqual({"123": 45}, response[0].slot_to_roster_id) - self.assertEqual(Sport.NFL, response[0].sport) - self.assertEqual(1630891562020, response[0].start_time) - self.assertEqual(DraftStatus.COMPLETE, response[0].status) - self.assertEqual(DraftType.SNAKE, response[0].type) - - @mock.patch("requests.get") - def test_get_user_drafts_for_year_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - DraftAPIClient.get_user_drafts_for_year(user_id="user_id", sport=Sport.NFL, year="2020") - self.assertEqual( - "Could not get Drafts for user_id 'user_id', sport 'NFL', and year '2020'.", - str(context.exception), - ) - - @mock.patch("requests.get") - def test_get_user_drafts_for_year_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - DraftAPIClient.get_user_drafts_for_year(user_id="user_id", sport=Sport.NFL, year="2020") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_drafts_in_league_happy_path(self, mock_requests_get): - mock_list = [ - { - "type": "snake", - "status": "complete", - "start_time": 1630891562020, - "sport": "nfl", - "settings": { - "teams": 8, - "slots_wr": 3, - "slots_te": 1, - "slots_rb": 2, - "slots_qb": 2, - "slots_super_flex": 1, - "slots_flex": 3, - "slots_bn": 6, - "rounds": 17, - "reversal_round": 0, - "player_type": 0, - "pick_timer": 0, - "nomination_timer": 60, - "enforce_position_limits": 1, - "cpu_autopick": 1, - "alpha_sort": 0, - }, - "season_type": "regular", - "season": "2021", - "metadata": {"scoring_type": "2qb", "name": "The Test", "description": "des"}, - "league_id": "738979251063275520", - "last_picked": 1630897024291, - "last_message_time": 1630897024793, - "last_message_id": "740439424466202624", - "draft_order": {"123": 45}, - "draft_id": "738979252392919040", - "creators": ["12345", "67890"], - "created": 1630548892636, - "slot_to_roster_id": {"123": 45}, - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = DraftAPIClient.get_drafts_in_league(league_id="12345") - - self.assertIsInstance(response, list) - self.assertIsInstance(response[0], Draft) - self.assertEqual(1630548892636, response[0].created) - self.assertEqual(["12345", "67890"], response[0].creators) - self.assertEqual("738979252392919040", response[0].draft_id) - self.assertEqual({"123": 45}, response[0].draft_order) - self.assertEqual("740439424466202624", response[0].last_message_id) - self.assertEqual(1630897024793, response[0].last_message_time) - self.assertEqual(1630897024291, response[0].last_picked) - self.assertEqual("738979251063275520", response[0].league_id) - self.assertIsInstance(response[0].metadata, DraftMetadata) - self.assertEqual("des", response[0].metadata.description) - self.assertEqual("The Test", response[0].metadata.name) - self.assertEqual(ScoringType.TWO_QB, response[0].metadata.scoring_type) - self.assertEqual("2021", response[0].season) - self.assertEqual(SeasonType.REGULAR, response[0].season_type) - self.assertIsInstance(response[0].settings, DraftSettings) - self.assertEqual(0, response[0].settings.alpha_sort) - self.assertEqual(1, response[0].settings.cpu_autopick) - self.assertEqual(1, response[0].settings.enforce_position_limits) - self.assertEqual(60, response[0].settings.nomination_timer) - self.assertEqual(0, response[0].settings.pick_timer) - self.assertEqual(0, response[0].settings.player_type) - self.assertEqual(0, response[0].settings.reversal_round) - self.assertEqual(17, response[0].settings.rounds) - self.assertEqual(6, response[0].settings.slots_bn) - self.assertEqual(3, response[0].settings.slots_flex) - self.assertEqual(2, response[0].settings.slots_qb) - self.assertEqual(2, response[0].settings.slots_rb) - self.assertEqual(1, response[0].settings.slots_super_flex) - self.assertEqual(1, response[0].settings.slots_te) - self.assertEqual(3, response[0].settings.slots_wr) - self.assertEqual(8, response[0].settings.teams) - self.assertEqual({"123": 45}, response[0].slot_to_roster_id) - self.assertEqual(Sport.NFL, response[0].sport) - self.assertEqual(1630891562020, response[0].start_time) - self.assertEqual(DraftStatus.COMPLETE, response[0].status) - self.assertEqual(DraftType.SNAKE, response[0].type) - - @mock.patch("requests.get") - def test_get_drafts_in_league_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - DraftAPIClient.get_drafts_in_league(league_id="12345") - self.assertEqual("Could not get Drafts for league_id '12345'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_drafts_in_league_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - DraftAPIClient.get_drafts_in_league(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_draft_happy_path(self, mock_requests_get): - mock_dict = { - "type": "snake", - "status": "complete", - "start_time": 1630891562020, - "sport": "nfl", - "settings": { - "teams": 8, - "slots_wr": 3, - "slots_te": 1, - "slots_rb": 2, - "slots_qb": 2, - "slots_super_flex": 1, - "slots_flex": 3, - "slots_bn": 6, - "rounds": 17, - "reversal_round": 0, - "player_type": 0, - "pick_timer": 0, - "nomination_timer": 60, - "enforce_position_limits": 1, - "cpu_autopick": 1, - "alpha_sort": 0, - }, - "season_type": "regular", - "season": "2021", - "metadata": {"scoring_type": "2qb", "name": "The Test", "description": "des"}, - "league_id": "738979251063275520", - "last_picked": 1630897024291, - "last_message_time": 1630897024793, - "last_message_id": "740439424466202624", - "draft_order": {"123": 45}, - "draft_id": "738979252392919040", - "creators": ["12345", "67890"], - "created": 1630548892636, - "slot_to_roster_id": {"123": 45}, - } - - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = DraftAPIClient.get_draft(draft_id="12345") - - self.assertIsInstance(response, Draft) - self.assertEqual(1630548892636, response.created) - self.assertEqual(["12345", "67890"], response.creators) - self.assertEqual("738979252392919040", response.draft_id) - self.assertEqual({"123": 45}, response.draft_order) - self.assertEqual("740439424466202624", response.last_message_id) - self.assertEqual(1630897024793, response.last_message_time) - self.assertEqual(1630897024291, response.last_picked) - self.assertEqual("738979251063275520", response.league_id) - self.assertIsInstance(response.metadata, DraftMetadata) - self.assertEqual("des", response.metadata.description) - self.assertEqual("The Test", response.metadata.name) - self.assertEqual(ScoringType.TWO_QB, response.metadata.scoring_type) - self.assertEqual("2021", response.season) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertIsInstance(response.settings, DraftSettings) - self.assertEqual(0, response.settings.alpha_sort) - self.assertEqual(1, response.settings.cpu_autopick) - self.assertEqual(1, response.settings.enforce_position_limits) - self.assertEqual(60, response.settings.nomination_timer) - self.assertEqual(0, response.settings.pick_timer) - self.assertEqual(0, response.settings.player_type) - self.assertEqual(0, response.settings.reversal_round) - self.assertEqual(17, response.settings.rounds) - self.assertEqual(6, response.settings.slots_bn) - self.assertEqual(3, response.settings.slots_flex) - self.assertEqual(2, response.settings.slots_qb) - self.assertEqual(2, response.settings.slots_rb) - self.assertEqual(1, response.settings.slots_super_flex) - self.assertEqual(1, response.settings.slots_te) - self.assertEqual(3, response.settings.slots_wr) - self.assertEqual(8, response.settings.teams) - self.assertEqual({"123": 45}, response.slot_to_roster_id) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(1630891562020, response.start_time) - self.assertEqual(DraftStatus.COMPLETE, response.status) - self.assertEqual(DraftType.SNAKE, response.type) - - @mock.patch("requests.get") - def test_get_draft_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - DraftAPIClient.get_draft(draft_id="12345") - self.assertEqual("Could not get Draft with draft_id '12345'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_draft_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - DraftAPIClient.get_draft(draft_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_player_draft_picks_happy_path(self, mock_requests_get): - mock_list = [ - { - "player_id": "2391", - "picked_by": "234343434", - "roster_id": "1", - "round": 5, - "draft_slot": 5, - "pick_no": 1, - "metadata": { - "team": "ARI", - "status": "Injured Reserve", - "sport": "nfl", - "position": "RB", - "player_id": "2391", - "number": "31", - "news_updated": "1513007102037", - "last_name": "Johnson", - "injury_status": "Out", - "first_name": "David", - }, - "is_keeper": True, - "draft_id": "257270643320426496", - } - ] - - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = DraftAPIClient.get_player_draft_picks(draft_id="12345", sport=Sport.NFL) - - self.assertIsInstance(response, list) - self.assertIsInstance(response[0], PlayerDraftPick) - self.assertEqual("257270643320426496", response[0].draft_id) - self.assertEqual(5, response[0].draft_slot) - self.assertTrue(response[0].is_keeper) - self.assertIsInstance(response[0].metadata, PlayerDraftPickMetadata) - self.assertEqual("David", response[0].metadata.first_name) - self.assertEqual(InjuryStatus.OUT, response[0].metadata.injury_status) - self.assertEqual("Johnson", response[0].metadata.last_name) - self.assertEqual("1513007102037", response[0].metadata.news_updated) - self.assertEqual("31", response[0].metadata.number) - self.assertEqual("2391", response[0].metadata.player_id) - self.assertEqual(NFLPosition.RB, response[0].metadata.position) - self.assertEqual(Sport.NFL, response[0].metadata.sport) - self.assertEqual(NFLPlayerStatus.INJURED_RESERVE, response[0].metadata.status) - self.assertEqual(NFLTeam.ARI, response[0].metadata.team) - self.assertEqual(1, response[0].pick_no) - self.assertEqual("234343434", response[0].picked_by) - self.assertEqual("2391", response[0].player_id) - self.assertEqual("1", response[0].roster_id) - self.assertEqual(5, response[0].round) - - @mock.patch("requests.get") - def test_get_player_draft_picks_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - DraftAPIClient.get_player_draft_picks(draft_id="12345", sport=Sport.NFL) - self.assertEqual( - "Could not get PlayerDraftPicks with draft_id '12345' and sport 'NFL'.", - str(context.exception), - ) - - @mock.patch("requests.get") - def test_get_player_draft_picks_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - DraftAPIClient.get_player_draft_picks(draft_id="12345", sport=Sport.NFL) - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_traded_draft_picks_happy_path(self, mock_requests_get): - mock_list = [ - { - "season": "2021", - "round": 3, - "roster_id": 1, - "previous_owner_id": 1, - "owner_id": 4, - "draft_id": 726312889421496320, - } - ] - - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = DraftAPIClient.get_traded_draft_picks(draft_id="12345") - - self.assertIsInstance(response, list) - self.assertIsInstance(response[0], DraftPick) - self.assertEqual(726312889421496320, response[0].draft_id) - self.assertEqual(4, response[0].owner_id) - self.assertEqual(1, response[0].previous_owner_id) - self.assertEqual(1, response[0].roster_id) - self.assertEqual(3, response[0].round) - self.assertEqual("2021", response[0].season) - - @mock.patch("requests.get") - def test_get_traded_draft_picks_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - DraftAPIClient.get_traded_draft_picks(draft_id="12345") - self.assertEqual( - "Could not get traded DraftPicks with draft_id '12345'.", str(context.exception) - ) - - @mock.patch("requests.get") - def test_get_traded_draft_picks_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - DraftAPIClient.get_traded_draft_picks(draft_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) diff --git a/test/test_api/test_LeagueAPIClient.py b/test/test_api/test_LeagueAPIClient.py deleted file mode 100644 index 273fd6b..0000000 --- a/test/test_api/test_LeagueAPIClient.py +++ /dev/null @@ -1,1260 +0,0 @@ -import datetime -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from requests import HTTPError - -from sleeper.api import LeagueAPIClient -from sleeper.enum.nfl.NFLRosterPosition import NFLRosterPosition -from sleeper.enum.PlayoffRoundType import PlayoffRoundType -from sleeper.enum.SeasonStatus import SeasonStatus -from sleeper.enum.SeasonType import SeasonType -from sleeper.enum.Sport import Sport -from sleeper.enum.TransactionStatus import TransactionStatus -from sleeper.enum.TransactionType import TransactionType -from sleeper.model.FAABTransaction import FAABTransaction -from sleeper.model.FromPlayoffMatchup import FromPlayoffMatchup -from sleeper.model.League import League -from sleeper.model.LeagueSettings import LeagueSettings -from sleeper.model.Matchup import Matchup -from sleeper.model.PlayoffMatchup import PlayoffMatchup -from sleeper.model.Roster import Roster -from sleeper.model.RosterSettings import RosterSettings -from sleeper.model.ScoringSettings import ScoringSettings -from sleeper.model.SportState import SportState -from sleeper.model.TradedPick import TradedPick -from sleeper.model.Transaction import Transaction -from sleeper.model.TransactionSettings import TransactionSettings -from sleeper.model.User import User - - -class TestLeagueAPIClient(unittest.TestCase): - @mock.patch("requests.get") - def test_get_league_happy_path(self, mock_requests_get): - mock_dict = { - "total_rosters": 12, - "status": "in_season", - "sport": "nfl", - "shard": 679, - "settings": { - "max_keepers": 1, - "draft_rounds": 3, - "trade_review_days": 2, - "reserve_allow_dnr": 0, - "capacity_override": 0, - "pick_trading": 1, - "disable_trades": 1, - "taxi_years": 0, - "taxi_allow_vets": 0, - "best_ball": 1, - "disable_adds": 1, - "waiver_type": 0, - "bench_lock": 0, - "reserve_allow_sus": 0, - "type": 0, - "reserve_allow_cov": 0, - "waiver_clear_days": 2, - "daily_waivers_last_ran": 17, - "waiver_day_of_week": 2, - "start_week": 1, - "commissioner_direct_invite": 0, - "playoff_teams": 6, - "num_teams": 12, - "reserve_slots": 0, - "playoff_round_type": 0, - "daily_waivers_hour": 0, - "waiver_budget": 100, - "reserve_allow_out": 0, - "waiver_bid_min": 0, - "offseason_adds": 0, - "playoff_seed_type": 0, - "daily_waivers": 0, - "playoff_week_start": 15, - "daily_waivers_days": 5461, - "league_average_match": 0, - "leg": 1, - "trade_deadline": 11, - "reserve_allow_doubtful": 0, - "taxi_deadline": 0, - "reserve_allow_na": 0, - "taxi_slots": 0, - "playoff_type": 0, - "last_report": 1, - "last_scored_leg": 3, - }, - "season_type": "regular", - "season": "2022", - "scoring_settings": { - "pass_2pt": 2.0, - "pass_int": -1.0, - "fgmiss": -1.0, - "fgmiss_0_19": -1.0, - "fgmiss_20_29": -1.0, - "fgmiss_30_39": -1.0, - "fgmiss_40_49": -1.0, - "fgmiss_50p": -1.0, - "rec_yd": 0.1, - "xpmiss": -1.0, - "fgm_0_19": 3.0, - "fgm_20_29": 3.0, - "fgm_30_39": 3.0, - "fgm_40_49": 4.0, - "fgm_50p": 5.0, - "blk_kick": 2.0, - "blk_kick_ret_yd": 1.0, - "pts_allow_7_13": 4.0, - "ff": 1.0, - "pts_allow_1_6": 7.0, - "st_fum_rec": 1.0, - "def_st_ff": 1.0, - "st_ff": 1.0, - "pts_allow_28_34": -1.0, - "fum_rec": 2.0, - "def_td": 6.0, - "int": 2.0, - "pts_allow_0": 10.0, - "pts_allow_21_27": 0.0, - "rec_2pt": 2.0, - "rec": 1.0, - "xpm": 1.0, - "st_td": 6.0, - "def_st_fum_rec": 1.0, - "def_st_td": 6.0, - "sack": 1.0, - "fum_rec_td": 6.0, - "rush_2pt": 2.0, - "rec_td": 6.0, - "pts_allow_35p": -4.0, - "pts_allow_14_20": 1.0, - "rush_yd": 0.1, - "pass_yd": 0.04, - "pass_td": 4.0, - "rush_td": 6.0, - "fum_lost": -2.0, - "fum": 0.0, - "safe": 2.0, - "bonus_pass_yd_300": 1.0, - "bonus_pass_yd_400": 1.0, - "bonus_rec_yd_100": 1.0, - "bonus_rec_yd_200": 1.0, - "bonus_rush_yd_100": 1.0, - "bonus_rush_yd_200": 1.0, - "def_2pt": 1.0, - "def_pass_def": 1.0, - "fg_ret_yd": 1.0, - "fgm": 1.0, - "fum_ret_yd": 1.0, - "idp_blk_kick": 1.0, - "idp_def_td": 1.0, - "idp_ff": 1.0, - "idp_fum_rec": 1.0, - "idp_int": 1.0, - "idp_pass_def": 1.0, - "idp_sack": 1.0, - "idp_safe": 1.0, - "idp_tkl": 1.0, - "idp_tkl_ast": 1.0, - "idp_tkl_solo": 1.0, - "int_ret_yd": 1.0, - "kr_td": 1.0, - "kr_yd": 1.0, - "pass_att": 1.0, - "pass_cmp": 1.0, - "pass_cmp_40p": 1.0, - "pass_inc": 1.0, - "pass_sack": 1.0, - "pr_td": 1.0, - "pr_yd": 1.0, - "qb_hit": 1.0, - "rec_40p": 1.0, - "rush_40p": 1.0, - "rush_att": 1.0, - "sack_yd": 1.0, - "st_tkl_solo": 1.0, - "tkl": 1.0, - "tkl_ast": 1.0, - "tkl_loss": 1.0, - "tkl_solo": 1.0, - "yds_allow_0_100": 1.0, - "yds_allow_100_199": 1.0, - "yds_allow_200_299": 1.0, - "yds_allow_300_349": 1.0, - "yds_allow_350_399": 1.0, - "yds_allow_400_449": 1.0, - "yds_allow_450_499": 1.0, - "yds_allow_500_549": 1.0, - "yds_allow_550p": 1.0, - }, - "roster_positions": ["QB", "RB", "RB", "WR", "TE", "FLEX", "BN"], - "previous_league_id": "12345", - "name": "R2 PooPoo DooDoo", - "metadata": {"keeper_deadline": "0", "auto_continue": "off"}, - "loser_bracket_id": None, - "league_id": "854528180957097984", - "last_read_id": None, - "last_pinned_message_id": "854538979343712256", - "last_message_time": 1658185095507, - "last_message_text_map": None, - "last_message_id": "854893888614273024", - "last_message_attachment": None, - "last_author_is_bot": False, - "last_author_id": "444590402142466048", - "last_author_display_name": "BIGCELL561", - "last_author_avatar": "9b69495def7b9b9d77e0a0126c22efbe", - "group_id": None, - "draft_id": "854528182030835712", - "company_id": None, - "bracket_id": None, - "avatar": "d4ed6e3ae14b56422de8029566d51234", - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_league(league_id="12345") - - self.assertIsInstance(response, League) - self.assertEqual("d4ed6e3ae14b56422de8029566d51234", response.avatar) - self.assertEqual("854528182030835712", response.draft_id) - self.assertEqual("854528180957097984", response.league_id) - self.assertEqual("R2 PooPoo DooDoo", response.name) - self.assertEqual("12345", response.previous_league_id) - self.assertIsInstance(response.roster_positions, list) - self.assertEqual(7, len(response.roster_positions)) - for nfl_roster_position in response.roster_positions: - self.assertIsInstance(nfl_roster_position, NFLRosterPosition) - self.assertIsInstance(response.scoring_settings, ScoringSettings) - self.assertEqual(2.0, response.scoring_settings.blk_kick) - self.assertEqual(1.0, response.scoring_settings.blk_kick_ret_yd) - self.assertEqual(1.0, response.scoring_settings.bonus_pass_yd_300) - self.assertEqual(1.0, response.scoring_settings.bonus_pass_yd_400) - self.assertEqual(1.0, response.scoring_settings.bonus_rec_yd_100) - self.assertEqual(1.0, response.scoring_settings.bonus_rec_yd_200) - self.assertEqual(1.0, response.scoring_settings.bonus_rush_yd_100) - self.assertEqual(1.0, response.scoring_settings.bonus_rush_yd_200) - self.assertEqual(1.0, response.scoring_settings.def_2pt) - self.assertEqual(1.0, response.scoring_settings.def_pass_def) - self.assertEqual(1.0, response.scoring_settings.def_st_ff) - self.assertEqual(1.0, response.scoring_settings.def_st_fum_rec) - self.assertEqual(6.0, response.scoring_settings.def_st_td) - self.assertEqual(6.0, response.scoring_settings.def_td) - self.assertEqual(1.0, response.scoring_settings.ff) - self.assertEqual(1.0, response.scoring_settings.fg_ret_yd) - self.assertEqual(1.0, response.scoring_settings.fgm) - self.assertEqual(3.0, response.scoring_settings.fgm_0_19) - self.assertEqual(3.0, response.scoring_settings.fgm_20_29) - self.assertEqual(3.0, response.scoring_settings.fgm_30_39) - self.assertEqual(4.0, response.scoring_settings.fgm_40_49) - self.assertEqual(5.0, response.scoring_settings.fgm_50p) - self.assertEqual(-1.0, response.scoring_settings.fgmiss) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_0_19) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_20_29) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_30_39) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_40_49) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_50p) - self.assertEqual(0.0, response.scoring_settings.fum) - self.assertEqual(-2.0, response.scoring_settings.fum_lost) - self.assertEqual(2.0, response.scoring_settings.fum_rec) - self.assertEqual(1.0, response.scoring_settings.fum_ret_yd) - self.assertEqual(1.0, response.scoring_settings.idp_blk_kick) - self.assertEqual(1.0, response.scoring_settings.idp_def_td) - self.assertEqual(1.0, response.scoring_settings.idp_ff) - self.assertEqual(1.0, response.scoring_settings.idp_fum_rec) - self.assertEqual(1.0, response.scoring_settings.idp_int) - self.assertEqual(1.0, response.scoring_settings.idp_pass_def) - self.assertEqual(1.0, response.scoring_settings.idp_sack) - self.assertEqual(1.0, response.scoring_settings.idp_safe) - self.assertEqual(1.0, response.scoring_settings.idp_tkl) - self.assertEqual(1.0, response.scoring_settings.idp_tkl_ast) - self.assertEqual(1.0, response.scoring_settings.idp_tkl_solo) - self.assertEqual(2.0, response.scoring_settings.int) - self.assertEqual(1.0, response.scoring_settings.int_ret_yd) - self.assertEqual(1.0, response.scoring_settings.kr_td) - self.assertEqual(1.0, response.scoring_settings.kr_yd) - self.assertEqual(2.0, response.scoring_settings.pass_2pt) - self.assertEqual(1.0, response.scoring_settings.pass_att) - self.assertEqual(1.0, response.scoring_settings.pass_cmp) - self.assertEqual(1.0, response.scoring_settings.pass_cmp_40p) - self.assertEqual(1.0, response.scoring_settings.pass_inc) - self.assertEqual(-1.0, response.scoring_settings.pass_int) - self.assertEqual(1.0, response.scoring_settings.pass_sack) - self.assertEqual(4.0, response.scoring_settings.pass_td) - self.assertEqual(0.04, response.scoring_settings.pass_yd) - self.assertEqual(1.0, response.scoring_settings.pr_td) - self.assertEqual(1.0, response.scoring_settings.pr_yd) - self.assertEqual(10.0, response.scoring_settings.pts_allow_0) - self.assertEqual(1.0, response.scoring_settings.pts_allow_14_20) - self.assertEqual(7.0, response.scoring_settings.pts_allow_1_6) - self.assertEqual(0.0, response.scoring_settings.pts_allow_21_27) - self.assertEqual(-1.0, response.scoring_settings.pts_allow_28_34) - self.assertEqual(-4.0, response.scoring_settings.pts_allow_35p) - self.assertEqual(4.0, response.scoring_settings.pts_allow_7_13) - self.assertEqual(1.0, response.scoring_settings.qb_hit) - self.assertEqual(1.0, response.scoring_settings.rec) - self.assertEqual(2.0, response.scoring_settings.rec_2pt) - self.assertEqual(1.0, response.scoring_settings.rec_40p) - self.assertEqual(6.0, response.scoring_settings.rec_td) - self.assertEqual(0.1, response.scoring_settings.rec_yd) - self.assertEqual(2.0, response.scoring_settings.rush_2pt) - self.assertEqual(1.0, response.scoring_settings.rush_40p) - self.assertEqual(1.0, response.scoring_settings.rush_att) - self.assertEqual(6.0, response.scoring_settings.rush_td) - self.assertEqual(0.1, response.scoring_settings.rush_yd) - self.assertEqual(1.0, response.scoring_settings.sack) - self.assertEqual(1.0, response.scoring_settings.sack_yd) - self.assertEqual(2.0, response.scoring_settings.safe) - self.assertEqual(1.0, response.scoring_settings.st_ff) - self.assertEqual(1.0, response.scoring_settings.st_fum_rec) - self.assertEqual(6.0, response.scoring_settings.st_td) - self.assertEqual(1.0, response.scoring_settings.st_tkl_solo) - self.assertEqual(1.0, response.scoring_settings.tkl) - self.assertEqual(1.0, response.scoring_settings.tkl_ast) - self.assertEqual(1.0, response.scoring_settings.tkl_loss) - self.assertEqual(1.0, response.scoring_settings.tkl_solo) - self.assertEqual(1.0, response.scoring_settings.xpm) - self.assertEqual(-1.0, response.scoring_settings.xpmiss) - self.assertEqual(1.0, response.scoring_settings.yds_allow_0_100) - self.assertEqual(1.0, response.scoring_settings.yds_allow_100_199) - self.assertEqual(1.0, response.scoring_settings.yds_allow_200_299) - self.assertEqual(1.0, response.scoring_settings.yds_allow_300_349) - self.assertEqual(1.0, response.scoring_settings.yds_allow_350_399) - self.assertEqual(1.0, response.scoring_settings.yds_allow_400_449) - self.assertEqual(1.0, response.scoring_settings.yds_allow_450_499) - self.assertEqual(1.0, response.scoring_settings.yds_allow_500_549) - self.assertEqual(1.0, response.scoring_settings.yds_allow_550p) - self.assertEqual("2022", response.season) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertIsInstance(response.settings, LeagueSettings) - self.assertEqual(3, response.settings.draft_rounds) - self.assertEqual(1, response.settings.last_report) - self.assertEqual(3, response.settings.last_scored_leg) - self.assertEqual(1, response.settings.leg) - self.assertEqual(1, response.settings.max_keepers) - self.assertEqual(12, response.settings.num_teams) - self.assertEqual(0, response.settings.offseason_adds) - self.assertEqual(1, response.settings.pick_trading) - self.assertEqual(6, response.settings.playoff_teams) - self.assertEqual(15, response.settings.playoff_week_start) - self.assertEqual(0, response.settings.reserve_allow_out) - self.assertEqual(0, response.settings.reserve_slots) - self.assertEqual(1, response.settings.start_week) - self.assertEqual(11, response.settings.trade_deadline) - self.assertEqual(2, response.settings.trade_review_days) - self.assertEqual(0, response.settings.type) - self.assertEqual(100, response.settings.waiver_budget) - self.assertEqual(2, response.settings.waiver_clear_days) - self.assertEqual(2, response.settings.waiver_day_of_week) - self.assertEqual(0, response.settings.waiver_type) - self.assertEqual(0, response.settings.bench_lock) - self.assertEqual(1, response.settings.best_ball) - self.assertEqual(0, response.settings.capacity_override) - self.assertEqual(0, response.settings.commissioner_direct_invite) - self.assertEqual(0, response.settings.daily_waivers) - self.assertEqual(5461, response.settings.daily_waivers_days) - self.assertEqual(0, response.settings.daily_waivers_hour) - self.assertEqual(17, response.settings.daily_waivers_last_ran) - self.assertEqual(1, response.settings.disable_adds) - self.assertEqual(1, response.settings.disable_trades) - self.assertEqual(0, response.settings.league_average_match) - self.assertEqual(0, response.settings.playoff_round_type) - self.assertEqual( - PlayoffRoundType.ONE_WEEK_PER_ROUND, response.settings.playoff_round_type_enum - ) - self.assertEqual(0, response.settings.playoff_seed_type) - self.assertEqual(0, response.settings.playoff_type) - self.assertEqual(0, response.settings.reserve_allow_cov) - self.assertEqual(0, response.settings.reserve_allow_dnr) - self.assertEqual(0, response.settings.reserve_allow_na) - self.assertEqual(0, response.settings.reserve_allow_sus) - self.assertEqual(0, response.settings.taxi_allow_vets) - self.assertEqual(0, response.settings.taxi_slots) - self.assertEqual(0, response.settings.taxi_years) - self.assertEqual(0, response.settings.waiver_bid_min) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonStatus.IN_SEASON, response.status) - self.assertEqual(12, response.total_rosters) - - @mock.patch("requests.get") - def test_get_league_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_league(league_id="12345") - self.assertEqual("Could not get League with league_id '12345'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_league_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_league(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_user_leagues_for_year_happy_path(self, mock_requests_get): - mock_dict = [ - { - "total_rosters": 12, - "status": "in_season", - "sport": "nfl", - "shard": 679, - "settings": { - "max_keepers": 1, - "draft_rounds": 3, - "trade_review_days": 2, - "reserve_allow_dnr": 0, - "capacity_override": 0, - "pick_trading": 1, - "disable_trades": 1, - "taxi_years": 0, - "taxi_allow_vets": 0, - "best_ball": 1, - "disable_adds": 1, - "waiver_type": 0, - "bench_lock": 0, - "reserve_allow_sus": 0, - "type": 0, - "reserve_allow_cov": 0, - "waiver_clear_days": 2, - "daily_waivers_last_ran": 17, - "waiver_day_of_week": 2, - "start_week": 1, - "commissioner_direct_invite": 0, - "playoff_teams": 6, - "num_teams": 12, - "reserve_slots": 0, - "playoff_round_type": 0, - "daily_waivers_hour": 0, - "waiver_budget": 100, - "reserve_allow_out": 0, - "waiver_bid_min": 0, - "offseason_adds": 0, - "playoff_seed_type": 0, - "daily_waivers": 0, - "playoff_week_start": 15, - "daily_waivers_days": 5461, - "league_average_match": 0, - "leg": 1, - "trade_deadline": 11, - "reserve_allow_doubtful": 0, - "taxi_deadline": 0, - "reserve_allow_na": 0, - "taxi_slots": 0, - "playoff_type": 0, - "last_report": 1, - "last_scored_leg": 3, - }, - "season_type": "regular", - "season": "2022", - "scoring_settings": { - "pass_2pt": 2.0, - "pass_int": -1.0, - "fgmiss": -1.0, - "fgmiss_0_19": -1.0, - "fgmiss_20_29": -1.0, - "fgmiss_30_39": -1.0, - "fgmiss_40_49": -1.0, - "fgmiss_50p": -1.0, - "rec_yd": 0.1, - "xpmiss": -1.0, - "fgm_0_19": 3.0, - "fgm_20_29": 3.0, - "fgm_30_39": 3.0, - "fgm_40_49": 4.0, - "fgm_50p": 5.0, - "blk_kick": 2.0, - "blk_kick_ret_yd": 1.0, - "pts_allow_7_13": 4.0, - "ff": 1.0, - "pts_allow_1_6": 7.0, - "st_fum_rec": 1.0, - "def_st_ff": 1.0, - "st_ff": 1.0, - "pts_allow_28_34": -1.0, - "fum_rec": 2.0, - "def_td": 6.0, - "int": 2.0, - "pts_allow_0": 10.0, - "pts_allow_21_27": 0.0, - "rec_2pt": 2.0, - "rec": 1.0, - "xpm": 1.0, - "st_td": 6.0, - "def_st_fum_rec": 1.0, - "def_st_td": 6.0, - "sack": 1.0, - "fum_rec_td": 6.0, - "rush_2pt": 2.0, - "rec_td": 6.0, - "pts_allow_35p": -4.0, - "pts_allow_14_20": 1.0, - "rush_yd": 0.1, - "pass_yd": 0.04, - "pass_td": 4.0, - "rush_td": 6.0, - "fum_lost": -2.0, - "fum": 0.0, - "safe": 2.0, - "bonus_pass_yd_300": 1.0, - "bonus_pass_yd_400": 1.0, - "bonus_rec_yd_100": 1.0, - "bonus_rec_yd_200": 1.0, - "bonus_rush_yd_100": 1.0, - "bonus_rush_yd_200": 1.0, - "def_2pt": 1.0, - "def_pass_def": 1.0, - "fg_ret_yd": 1.0, - "fgm": 1.0, - "fum_ret_yd": 1.0, - "idp_blk_kick": 1.0, - "idp_def_td": 1.0, - "idp_ff": 1.0, - "idp_fum_rec": 1.0, - "idp_int": 1.0, - "idp_pass_def": 1.0, - "idp_sack": 1.0, - "idp_safe": 1.0, - "idp_tkl": 1.0, - "idp_tkl_ast": 1.0, - "idp_tkl_solo": 1.0, - "int_ret_yd": 1.0, - "kr_td": 1.0, - "kr_yd": 1.0, - "pass_att": 1.0, - "pass_cmp": 1.0, - "pass_cmp_40p": 1.0, - "pass_inc": 1.0, - "pass_sack": 1.0, - "pr_td": 1.0, - "pr_yd": 1.0, - "qb_hit": 1.0, - "rec_40p": 1.0, - "rush_40p": 1.0, - "rush_att": 1.0, - "sack_yd": 1.0, - "st_tkl_solo": 1.0, - "tkl": 1.0, - "tkl_ast": 1.0, - "tkl_loss": 1.0, - "tkl_solo": 1.0, - "yds_allow_0_100": 1.0, - "yds_allow_100_199": 1.0, - "yds_allow_200_299": 1.0, - "yds_allow_300_349": 1.0, - "yds_allow_350_399": 1.0, - "yds_allow_400_449": 1.0, - "yds_allow_450_499": 1.0, - "yds_allow_500_549": 1.0, - "yds_allow_550p": 1.0, - }, - "roster_positions": ["QB", "RB", "RB", "WR", "TE", "FLEX", "BN"], - "previous_league_id": "12345", - "name": "R2 PooPoo DooDoo", - "metadata": {"keeper_deadline": "0", "auto_continue": "off"}, - "loser_bracket_id": None, - "league_id": "854528180957097984", - "last_read_id": None, - "last_pinned_message_id": "854538979343712256", - "last_message_time": 1658185095507, - "last_message_text_map": None, - "last_message_id": "854893888614273024", - "last_message_attachment": None, - "last_author_is_bot": False, - "last_author_id": "444590402142466048", - "last_author_display_name": "BIGCELL561", - "last_author_avatar": "9b69495def7b9b9d77e0a0126c22efbe", - "group_id": None, - "draft_id": "854528182030835712", - "company_id": None, - "bracket_id": None, - "avatar": "d4ed6e3ae14b56422de8029566d51234", - } - ] - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_user_leagues_for_year( - user_id="12345", sport=Sport.NFL, year="2020" - )[0] - - self.assertIsInstance(response, League) - self.assertEqual("d4ed6e3ae14b56422de8029566d51234", response.avatar) - self.assertEqual("854528182030835712", response.draft_id) - self.assertEqual("854528180957097984", response.league_id) - self.assertEqual("R2 PooPoo DooDoo", response.name) - self.assertEqual("12345", response.previous_league_id) - self.assertIsInstance(response.roster_positions, list) - self.assertEqual(7, len(response.roster_positions)) - for nfl_roster_position in response.roster_positions: - self.assertIsInstance(nfl_roster_position, NFLRosterPosition) - self.assertIsInstance(response.scoring_settings, ScoringSettings) - self.assertEqual(2.0, response.scoring_settings.blk_kick) - self.assertEqual(1.0, response.scoring_settings.blk_kick_ret_yd) - self.assertEqual(1.0, response.scoring_settings.bonus_pass_yd_300) - self.assertEqual(1.0, response.scoring_settings.bonus_pass_yd_400) - self.assertEqual(1.0, response.scoring_settings.bonus_rec_yd_100) - self.assertEqual(1.0, response.scoring_settings.bonus_rec_yd_200) - self.assertEqual(1.0, response.scoring_settings.bonus_rush_yd_100) - self.assertEqual(1.0, response.scoring_settings.bonus_rush_yd_200) - self.assertEqual(1.0, response.scoring_settings.def_2pt) - self.assertEqual(1.0, response.scoring_settings.def_pass_def) - self.assertEqual(1.0, response.scoring_settings.def_st_ff) - self.assertEqual(1.0, response.scoring_settings.def_st_fum_rec) - self.assertEqual(6.0, response.scoring_settings.def_st_td) - self.assertEqual(6.0, response.scoring_settings.def_td) - self.assertEqual(1.0, response.scoring_settings.ff) - self.assertEqual(1.0, response.scoring_settings.fg_ret_yd) - self.assertEqual(1.0, response.scoring_settings.fgm) - self.assertEqual(3.0, response.scoring_settings.fgm_0_19) - self.assertEqual(3.0, response.scoring_settings.fgm_20_29) - self.assertEqual(3.0, response.scoring_settings.fgm_30_39) - self.assertEqual(4.0, response.scoring_settings.fgm_40_49) - self.assertEqual(5.0, response.scoring_settings.fgm_50p) - self.assertEqual(-1.0, response.scoring_settings.fgmiss) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_0_19) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_20_29) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_30_39) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_40_49) - self.assertEqual(-1.0, response.scoring_settings.fgmiss_50p) - self.assertEqual(0.0, response.scoring_settings.fum) - self.assertEqual(-2.0, response.scoring_settings.fum_lost) - self.assertEqual(2.0, response.scoring_settings.fum_rec) - self.assertEqual(1.0, response.scoring_settings.fum_ret_yd) - self.assertEqual(1.0, response.scoring_settings.idp_blk_kick) - self.assertEqual(1.0, response.scoring_settings.idp_def_td) - self.assertEqual(1.0, response.scoring_settings.idp_ff) - self.assertEqual(1.0, response.scoring_settings.idp_fum_rec) - self.assertEqual(1.0, response.scoring_settings.idp_int) - self.assertEqual(1.0, response.scoring_settings.idp_pass_def) - self.assertEqual(1.0, response.scoring_settings.idp_sack) - self.assertEqual(1.0, response.scoring_settings.idp_safe) - self.assertEqual(1.0, response.scoring_settings.idp_tkl) - self.assertEqual(1.0, response.scoring_settings.idp_tkl_ast) - self.assertEqual(1.0, response.scoring_settings.idp_tkl_solo) - self.assertEqual(2.0, response.scoring_settings.int) - self.assertEqual(1.0, response.scoring_settings.int_ret_yd) - self.assertEqual(1.0, response.scoring_settings.kr_td) - self.assertEqual(1.0, response.scoring_settings.kr_yd) - self.assertEqual(2.0, response.scoring_settings.pass_2pt) - self.assertEqual(1.0, response.scoring_settings.pass_att) - self.assertEqual(1.0, response.scoring_settings.pass_cmp) - self.assertEqual(1.0, response.scoring_settings.pass_cmp_40p) - self.assertEqual(1.0, response.scoring_settings.pass_inc) - self.assertEqual(-1.0, response.scoring_settings.pass_int) - self.assertEqual(1.0, response.scoring_settings.pass_sack) - self.assertEqual(4.0, response.scoring_settings.pass_td) - self.assertEqual(0.04, response.scoring_settings.pass_yd) - self.assertEqual(1.0, response.scoring_settings.pr_td) - self.assertEqual(1.0, response.scoring_settings.pr_yd) - self.assertEqual(10.0, response.scoring_settings.pts_allow_0) - self.assertEqual(1.0, response.scoring_settings.pts_allow_14_20) - self.assertEqual(7.0, response.scoring_settings.pts_allow_1_6) - self.assertEqual(0.0, response.scoring_settings.pts_allow_21_27) - self.assertEqual(-1.0, response.scoring_settings.pts_allow_28_34) - self.assertEqual(-4.0, response.scoring_settings.pts_allow_35p) - self.assertEqual(4.0, response.scoring_settings.pts_allow_7_13) - self.assertEqual(1.0, response.scoring_settings.qb_hit) - self.assertEqual(1.0, response.scoring_settings.rec) - self.assertEqual(2.0, response.scoring_settings.rec_2pt) - self.assertEqual(1.0, response.scoring_settings.rec_40p) - self.assertEqual(6.0, response.scoring_settings.rec_td) - self.assertEqual(0.1, response.scoring_settings.rec_yd) - self.assertEqual(2.0, response.scoring_settings.rush_2pt) - self.assertEqual(1.0, response.scoring_settings.rush_40p) - self.assertEqual(1.0, response.scoring_settings.rush_att) - self.assertEqual(6.0, response.scoring_settings.rush_td) - self.assertEqual(0.1, response.scoring_settings.rush_yd) - self.assertEqual(1.0, response.scoring_settings.sack) - self.assertEqual(1.0, response.scoring_settings.sack_yd) - self.assertEqual(2.0, response.scoring_settings.safe) - self.assertEqual(1.0, response.scoring_settings.st_ff) - self.assertEqual(1.0, response.scoring_settings.st_fum_rec) - self.assertEqual(6.0, response.scoring_settings.st_td) - self.assertEqual(1.0, response.scoring_settings.st_tkl_solo) - self.assertEqual(1.0, response.scoring_settings.tkl) - self.assertEqual(1.0, response.scoring_settings.tkl_ast) - self.assertEqual(1.0, response.scoring_settings.tkl_loss) - self.assertEqual(1.0, response.scoring_settings.tkl_solo) - self.assertEqual(1.0, response.scoring_settings.xpm) - self.assertEqual(-1.0, response.scoring_settings.xpmiss) - self.assertEqual(1.0, response.scoring_settings.yds_allow_0_100) - self.assertEqual(1.0, response.scoring_settings.yds_allow_100_199) - self.assertEqual(1.0, response.scoring_settings.yds_allow_200_299) - self.assertEqual(1.0, response.scoring_settings.yds_allow_300_349) - self.assertEqual(1.0, response.scoring_settings.yds_allow_350_399) - self.assertEqual(1.0, response.scoring_settings.yds_allow_400_449) - self.assertEqual(1.0, response.scoring_settings.yds_allow_450_499) - self.assertEqual(1.0, response.scoring_settings.yds_allow_500_549) - self.assertEqual(1.0, response.scoring_settings.yds_allow_550p) - self.assertEqual("2022", response.season) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertIsInstance(response.settings, LeagueSettings) - self.assertEqual(3, response.settings.draft_rounds) - self.assertEqual(1, response.settings.last_report) - self.assertEqual(3, response.settings.last_scored_leg) - self.assertEqual(1, response.settings.leg) - self.assertEqual(1, response.settings.max_keepers) - self.assertEqual(12, response.settings.num_teams) - self.assertEqual(0, response.settings.offseason_adds) - self.assertEqual(1, response.settings.pick_trading) - self.assertEqual(6, response.settings.playoff_teams) - self.assertEqual(15, response.settings.playoff_week_start) - self.assertEqual(0, response.settings.reserve_allow_out) - self.assertEqual(0, response.settings.reserve_slots) - self.assertEqual(1, response.settings.start_week) - self.assertEqual(11, response.settings.trade_deadline) - self.assertEqual(2, response.settings.trade_review_days) - self.assertEqual(0, response.settings.type) - self.assertEqual(100, response.settings.waiver_budget) - self.assertEqual(2, response.settings.waiver_clear_days) - self.assertEqual(2, response.settings.waiver_day_of_week) - self.assertEqual(0, response.settings.waiver_type) - self.assertEqual(0, response.settings.bench_lock) - self.assertEqual(1, response.settings.best_ball) - self.assertEqual(0, response.settings.capacity_override) - self.assertEqual(0, response.settings.commissioner_direct_invite) - self.assertEqual(0, response.settings.daily_waivers) - self.assertEqual(5461, response.settings.daily_waivers_days) - self.assertEqual(0, response.settings.daily_waivers_hour) - self.assertEqual(17, response.settings.daily_waivers_last_ran) - self.assertEqual(1, response.settings.disable_adds) - self.assertEqual(1, response.settings.disable_trades) - self.assertEqual(0, response.settings.league_average_match) - self.assertEqual(0, response.settings.playoff_round_type) - self.assertEqual( - PlayoffRoundType.ONE_WEEK_PER_ROUND, response.settings.playoff_round_type_enum - ) - self.assertEqual(0, response.settings.playoff_seed_type) - self.assertEqual(0, response.settings.playoff_type) - self.assertEqual(0, response.settings.reserve_allow_cov) - self.assertEqual(0, response.settings.reserve_allow_dnr) - self.assertEqual(0, response.settings.reserve_allow_na) - self.assertEqual(0, response.settings.reserve_allow_sus) - self.assertEqual(0, response.settings.taxi_allow_vets) - self.assertEqual(0, response.settings.taxi_slots) - self.assertEqual(0, response.settings.taxi_years) - self.assertEqual(0, response.settings.waiver_bid_min) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonStatus.IN_SEASON, response.status) - self.assertEqual(12, response.total_rosters) - - @mock.patch("requests.get") - def test_get_user_leagues_for_year_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_user_leagues_for_year(user_id="12345", sport=Sport.NFL, year="2020") - self.assertEqual( - "Could not get user Leagues for user_id '12345', sport 'NFL', and year '2020'.", - str(context.exception), - ) - - @mock.patch("requests.get") - def test_get_user_leagues_for_year_non_200_status_code_raises_exception( - self, mock_requests_get - ): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_user_leagues_for_year(user_id="12345", sport=Sport.NFL, year="2020") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_rosters_happy_path(self, mock_requests_get): - mock_dict = [ - { - "taxi": 1, - "starters": ["3163", "CHI"], - "settings": { - "wins": 10, - "waiver_position": 10, - "waiver_budget_used": 0, - "waiver_adjusted": 14, - "total_moves": 0, - "ties": 0, - "ppts_decimal": 64, - "ppts": 1934, - "losses": 3, - "fpts_decimal": 8, - "fpts_against_decimal": 4, - "fpts_against": 1101, - "fpts": 1611, - }, - "roster_id": 1, - "reserve": ["test"], - "players": ["1833", "CHI"], - "player_map": {"test": "t"}, - "owner_id": "66947650880421888", - "metadata": {"test": "t"}, - "league_id": "308857914418823168", - "co_owners": 1, - } - ] - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_rosters(league_id="12345")[0] - - self.assertIsInstance(response, Roster) - self.assertEqual(1, response.co_owners) - self.assertEqual("308857914418823168", response.league_id) - self.assertEqual({"test": "t"}, response.metadata) - self.assertEqual("66947650880421888", response.owner_id) - self.assertEqual(["1833", "CHI"], response.players) - self.assertEqual({"test": "t"}, response.player_map) - self.assertEqual(["test"], response.reserve) - self.assertEqual(1, response.roster_id) - self.assertIsInstance(response.settings, RosterSettings) - self.assertEqual(1611, response.settings.fpts) - self.assertEqual(1101, response.settings.fpts_against) - self.assertEqual(4, response.settings.fpts_against_decimal) - self.assertEqual(8, response.settings.fpts_decimal) - self.assertEqual(3, response.settings.losses) - self.assertEqual(1934, response.settings.ppts) - self.assertEqual(64, response.settings.ppts_decimal) - self.assertEqual(0, response.settings.ties) - self.assertEqual(0, response.settings.total_moves) - self.assertEqual(14, response.settings.waiver_adjusted) - self.assertEqual(0, response.settings.waiver_budget_used) - self.assertEqual(10, response.settings.waiver_position) - self.assertEqual(10, response.settings.wins) - self.assertEqual(["3163", "CHI"], response.starters) - self.assertEqual(1, response.taxi) - - @mock.patch("requests.get") - def test_get_rosters_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_rosters(league_id="12345") - self.assertEqual("Could not get Rosters for league_id '12345'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_rosters_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_rosters(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_users_in_league_happy_path(self, mock_requests_get): - mock_list = [ - { - "verification": "v", - "username": "username", - "user_id": "user_id", - "token": "t", - "summoner_region": "r", - "solicitable": "s", - "real_name": "name", - "phone": "1", - "pending": "1", - "notifications": "1", - "metadata": {"test": "t"}, - "is_bot": True, - "email": "email", - "display_name": "display_name", - "deleted": "deleted", - "data_updated": "data", - "currencies": "currencies", - "created": "created", - "cookies": "cookies", - "avatar": "avatar", - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_users_in_league(league_id="12345")[0] - - self.assertIsInstance(response, User) - self.assertEqual(response.username, "username") - self.assertEqual(response.user_id, "user_id") - self.assertEqual(response.display_name, "display_name") - self.assertEqual(response.avatar, "avatar") - self.assertEqual("cookies", response.cookies) - self.assertEqual("created", response.created) - self.assertEqual("currencies", response.currencies) - self.assertEqual("data", response.data_updated) - self.assertEqual("deleted", response.deleted) - self.assertEqual("email", response.email) - self.assertEqual({"test": "t"}, response.metadata) - self.assertEqual("1", response.notifications) - self.assertEqual("1", response.pending) - self.assertEqual("1", response.phone) - self.assertEqual("name", response.real_name) - self.assertEqual("s", response.solicitable) - self.assertEqual("r", response.summoner_region) - self.assertEqual("t", response.token) - self.assertEqual("v", response.verification) - - @mock.patch("requests.get") - def test_get_users_in_league_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_users_in_league(league_id="12345") - self.assertEqual("Could not get Users for league_id '12345'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_users_in_league_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_users_in_league(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_matchups_for_week_happy_path(self, mock_requests_get): - mock_list = [ - { - "starters_points": [10.04, 20.7], - "starters": ["421", "2315"], - "roster_id": 1, - "points": 74.04, - "players_points": {"NO": -9.0, "830": 11.2}, - "players": ["NO", "830"], - "matchup_id": 5, - "custom_points": "cp", - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_matchups_for_week(league_id="12345", week=1)[0] - - self.assertIsInstance(response, Matchup) - self.assertEqual("cp", response.custom_points) - self.assertEqual(5, response.matchup_id) - self.assertEqual(["NO", "830"], response.players) - self.assertEqual({"NO": -9.0, "830": 11.2}, response.players_points) - self.assertEqual(74.04, response.points) - self.assertEqual(1, response.roster_id) - self.assertEqual(["421", "2315"], response.starters) - self.assertEqual([10.04, 20.7], response.starters_points) - - @mock.patch("requests.get") - def test_get_matchups_for_week_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_matchups_for_week(league_id="12345", week=1) - self.assertEqual( - "Could not get Matchups for league_id '12345' and week '1'.", str(context.exception) - ) - - @mock.patch("requests.get") - def test_get_matchups_for_week_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_matchups_for_week(league_id="12345", week=1) - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_winners_bracket_happy_path(self, mock_requests_get): - mock_list = [ - { - "w": 8, - "t2_from": {"l": 5, "w": 6}, - "t2": 4, - "t1_from": {"l": 6, "w": 5}, - "t1": 8, - "r": 3, - "p": 1, - "m": 9, - "l": 4, - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_winners_bracket(league_id="12345")[0] - - self.assertIsInstance(response, PlayoffMatchup) - self.assertEqual(4, response.losing_roster_id) - self.assertEqual(9, response.matchup_id) - self.assertEqual(3, response.round) - self.assertIsInstance(response.team_1_from, FromPlayoffMatchup) - self.assertEqual(6, response.team_1_from.lost_matchup_id) - self.assertEqual(5, response.team_1_from.won_matchup_id) - self.assertEqual(8, response.team_1_roster_id) - self.assertIsInstance(response.team_2_from, FromPlayoffMatchup) - self.assertEqual(5, response.team_2_from.lost_matchup_id) - self.assertEqual(6, response.team_2_from.won_matchup_id) - self.assertEqual(4, response.team_2_roster_id) - self.assertEqual(8, response.winning_roster_id) - self.assertEqual(1, response.p) - - @mock.patch("requests.get") - def test_get_winners_bracket_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_winners_bracket(league_id="12345") - self.assertEqual( - "Could not get PlayoffMatchups for league_id '12345'.", str(context.exception) - ) - - @mock.patch("requests.get") - def test_get_winners_bracket_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_winners_bracket(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_losers_bracket_happy_path(self, mock_requests_get): - mock_list = [ - { - "w": 8, - "t2_from": {"l": 5, "w": 6}, - "t2": 4, - "t1_from": {"l": 6, "w": 5}, - "t1": 8, - "r": 3, - "p": 1, - "m": 9, - "l": 4, - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_losers_bracket(league_id="12345")[0] - - self.assertIsInstance(response, PlayoffMatchup) - self.assertEqual(4, response.losing_roster_id) - self.assertEqual(9, response.matchup_id) - self.assertEqual(3, response.round) - self.assertIsInstance(response.team_1_from, FromPlayoffMatchup) - self.assertEqual(6, response.team_1_from.lost_matchup_id) - self.assertEqual(5, response.team_1_from.won_matchup_id) - self.assertEqual(8, response.team_1_roster_id) - self.assertIsInstance(response.team_2_from, FromPlayoffMatchup) - self.assertEqual(5, response.team_2_from.lost_matchup_id) - self.assertEqual(6, response.team_2_from.won_matchup_id) - self.assertEqual(4, response.team_2_roster_id) - self.assertEqual(8, response.winning_roster_id) - self.assertEqual(1, response.p) - - @mock.patch("requests.get") - def test_get_losers_bracket_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_losers_bracket(league_id="12345") - self.assertEqual( - "Could not get PlayoffMatchups for league_id '12345'.", str(context.exception) - ) - - @mock.patch("requests.get") - def test_get_losers_bracket_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_losers_bracket(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_transactions_happy_path(self, mock_requests_get): - mock_list = [ - { - "waiver_budget": [{"sender": 2, "receiver": 3, "amount": 55}], - "type": "free_agent", - "transaction_id": "852289191705423872", - "status_updated": 1657564087371, - "status": "complete", - "settings": {"seq": 1, "waiver_bid": 1}, - "roster_ids": [1], - "metadata": {"test": "t"}, - "leg": 1, - "drops": {"1234": 1}, - "draft_picks": [ - { - "season": "2019", - "round": 5, - "roster_id": 1, - "previous_owner_id": 1, - "owner_id": 2, - "draft_id": "12345", - } - ], - "creator": "342404703486779392", - "created": 1657564087371, - "consenter_ids": [1], - "adds": {"5880": 1}, - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_transactions(league_id="12345", week=1)[0] - - self.assertIsInstance(response, Transaction) - self.assertEqual({"5880": 1}, response.adds) - self.assertEqual([1], response.consenter_ids) - self.assertEqual(1657564087371, response.created) - self.assertEqual("342404703486779392", response.creator) - self.assertIsInstance(response.draft_picks, list) - self.assertEqual(1, len(response.draft_picks)) - self.assertEqual("12345", response.draft_picks[0].draft_id) - self.assertEqual(2, response.draft_picks[0].owner_id) - self.assertEqual(1, response.draft_picks[0].previous_owner_id) - self.assertEqual(1, response.draft_picks[0].roster_id) - self.assertEqual(5, response.draft_picks[0].round) - self.assertEqual("2019", response.draft_picks[0].season) - self.assertEqual({"1234": 1}, response.drops) - self.assertEqual([1], response.roster_ids) - self.assertIsInstance(response.settings, TransactionSettings) - self.assertEqual(1, response.settings.seq) - self.assertEqual(1, response.settings.waiver_bid) - self.assertIsInstance(response.status, TransactionStatus) - self.assertEqual(TransactionStatus.COMPLETE, response.status) - self.assertEqual(1657564087371, response.status_updated) - self.assertEqual("852289191705423872", response.transaction_id) - self.assertEqual(TransactionType.FREE_AGENT, response.type) - self.assertIsInstance(response.waiver_budget[0], FAABTransaction) - self.assertEqual(2, response.waiver_budget[0].sender) - self.assertEqual(3, response.waiver_budget[0].receiver) - self.assertEqual(55, response.waiver_budget[0].amount) - self.assertEqual(1, response.leg) - self.assertEqual({"test": "t"}, response.metadata) - - @mock.patch("requests.get") - def test_get_transactions_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_transactions(league_id="12345", week=1) - self.assertEqual( - "Could not get Transactions for league_id '12345' and week '1'.", str(context.exception) - ) - - @mock.patch("requests.get") - def test_get_transactions_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_transactions(league_id="12345", week=1) - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_traded_picks_happy_path(self, mock_requests_get): - mock_list = [ - {"season": "2019", "round": 5, "roster_id": 1, "previous_owner_id": 1, "owner_id": 2} - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_traded_picks(league_id="12345")[0] - - self.assertIsInstance(response, TradedPick) - self.assertEqual(2, response.owner_id) - self.assertEqual(1, response.previous_owner_id) - self.assertEqual(1, response.roster_id) - self.assertEqual(5, response.round) - self.assertEqual("2019", response.season) - - @mock.patch("requests.get") - def test_get_traded_picks_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_traded_picks(league_id="12345") - self.assertEqual("Could not get TradedPicks for league_id '12345'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_traded_picks_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_traded_picks(league_id="12345") - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_sport_state_happy_path(self, mock_requests_get): - mock_dict = { - "week": 0, - "season_type": "off", - "season_start_date": "2022-09-08", - "season": "2022", - "previous_season": "2021", - "leg": 0, - "league_season": "2022", - "league_create_season": "2022", - "display_week": 0, - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = LeagueAPIClient.get_sport_state(sport=Sport.NFL) - - self.assertIsInstance(response, SportState) - self.assertEqual(0, response.display_week) - self.assertEqual("2022", response.league_create_season) - self.assertEqual("2022", response.league_season) - self.assertEqual(0, response.leg) - self.assertEqual("2021", response.previous_season) - self.assertEqual("2022", response.season) - self.assertEqual(datetime.date(2022, 9, 8), response.season_start_date) - self.assertEqual(SeasonType.OFF, response.season_type) - self.assertEqual(0, response.week) - - @mock.patch("requests.get") - def test_get_sport_state_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - LeagueAPIClient.get_sport_state(sport=Sport.NFL) - self.assertEqual("Could not get SportState for sport 'NFL'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_sport_state_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - LeagueAPIClient.get_sport_state(sport=Sport.NFL) - self.assertEqual("404 Client Error", str(context.exception)) diff --git a/test/test_api/test_PlayerAPIClient.py b/test/test_api/test_PlayerAPIClient.py deleted file mode 100644 index 4017c1d..0000000 --- a/test/test_api/test_PlayerAPIClient.py +++ /dev/null @@ -1,225 +0,0 @@ -import datetime -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from requests import HTTPError - -from sleeper.api.PlayerAPIClient import PlayerAPIClient -from sleeper.enum.InjuryStatus import InjuryStatus -from sleeper.enum.nfl.NFLPlayerStatus import NFLPlayerStatus -from sleeper.enum.nfl.NFLPosition import NFLPosition -from sleeper.enum.nfl.NFLTeam import NFLTeam -from sleeper.enum.PracticeParticipation import PracticeParticipation -from sleeper.enum.Sport import Sport -from sleeper.enum.TrendType import TrendType -from sleeper.model.Player import Player -from sleeper.model.PlayerTrend import PlayerTrend - - -class TestPlayerAPIClient(unittest.TestCase): - @mock.patch("requests.get") - def test_get_all_players_happy_path(self, mock_requests_get): - mock_dict = { - "2103": { - "player_id": "2103", - "number": 60, - "years_exp": 1, - "swish_id": 12345, - "birth_city": "Milwaukee", - "espn_id": 17054, - "rotowire_id": 9866, - "injury_notes": "some injury", - "gsis_id": "gsis", - "birth_state": "WI", - "weight": "285", - "status": "Inactive", - "practice_description": "practice description", - "last_name": "Booth", - "hashtag": "#codybooth-NFL-FA-60", - "fantasy_positions": ["OL"], - "position": "OT", - "stats_id": 12345, - "search_last_name": "booth", - "yahoo_id": 27841, - "birth_country": "USA", - "full_name": "Cody Booth", - "age": 27, - "sport": "nfl", - "team": "GB", - "pandascore_id": "pandascore", - "high_school": "Rufus King", - "news_updated": 20200101, - "metadata": {"test": 1}, - "injury_body_part": "ear", - "injury_start_date": "20000101", - "fantasy_data_id": 16426, - "depth_chart_position": 1, - "height": "6'5\"", - "injury_status": None, - "sportradar_id": "4cd4976e-e230-4935-ad3f-c12876a41350", - "practice_participation": None, - "birth_date": "1991-04-22", - "first_name": "Cody", - "active": False, - "depth_chart_order": 1, - "college": "Temple", - "rotoworld_id": 12345, - "search_rank": 9999999, - "search_first_name": "cody", - "search_full_name": "codybooth", - } - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = PlayerAPIClient.get_all_players(sport=Sport.NFL) - - self.assertIsInstance(response, dict) - self.assertIsInstance(response["2103"], Player) - self.assertEqual(1, len(response.keys())) - self.assertEqual(27, response["2103"].age) - self.assertEqual("USA", response["2103"].birth_country) - self.assertEqual("Temple", response["2103"].college) - self.assertEqual(1, response["2103"].depth_chart_order) - self.assertEqual(1, response["2103"].depth_chart_position) - self.assertEqual(17054, response["2103"].espn_id) - self.assertEqual(16426, response["2103"].fantasy_data_id) - self.assertEqual(1, len(response["2103"].fantasy_positions)) - self.assertEqual(NFLPosition.OL, response["2103"].fantasy_positions[0]) - self.assertEqual("Cody", response["2103"].first_name) - self.assertEqual("#codybooth-NFL-FA-60", response["2103"].hashtag) - self.assertEqual("6'5\"", response["2103"].height) - self.assertEqual("20000101", response["2103"].injury_start_date) - self.assertEqual(InjuryStatus.NA, response["2103"].injury_status) - self.assertEqual("Booth", response["2103"].last_name) - self.assertEqual(60, response["2103"].number) - self.assertEqual("2103", response["2103"].player_id) - self.assertEqual(NFLPosition.OT, response["2103"].position) - self.assertEqual(PracticeParticipation.NA, response["2103"].practice_participation) - self.assertEqual(9866, response["2103"].rotowire_id) - self.assertEqual(12345, response["2103"].rotoworld_id) - self.assertEqual("cody", response["2103"].search_first_name) - self.assertEqual("codybooth", response["2103"].search_full_name) - self.assertEqual("booth", response["2103"].search_last_name) - self.assertEqual(9999999, response["2103"].search_rank) - self.assertEqual(Sport.NFL, response["2103"].sport) - self.assertEqual("4cd4976e-e230-4935-ad3f-c12876a41350", response["2103"].sportradar_id) - self.assertEqual(12345, response["2103"].stats_id) - self.assertEqual(NFLPlayerStatus.INACTIVE, response["2103"].status) - self.assertEqual(NFLTeam.GB, response["2103"].team) - self.assertEqual("285", response["2103"].weight) - self.assertEqual(27841, response["2103"].yahoo_id) - self.assertEqual(1, response["2103"].years_exp) - self.assertEqual(12345, response["2103"].swish_id) - self.assertEqual("Milwaukee", response["2103"].birth_city) - self.assertEqual("some injury", response["2103"].injury_notes) - self.assertEqual("gsis", response["2103"].gsis_id) - self.assertEqual("WI", response["2103"].birth_state) - self.assertEqual("practice description", response["2103"].practice_description) - self.assertEqual("pandascore", response["2103"].pandascore_id) - self.assertEqual("Rufus King", response["2103"].high_school) - self.assertEqual(20200101, response["2103"].news_updated) - self.assertEqual({"test": 1}, response["2103"].metadata) - self.assertEqual("ear", response["2103"].injury_body_part) - self.assertEqual(datetime.date(1991, 4, 22), response["2103"].birth_date) - self.assertFalse(response["2103"].active) - - @mock.patch("requests.get") - def test_get_all_players_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - PlayerAPIClient.get_all_players(sport=Sport.NFL) - self.assertEqual("Could not get Players for sport: 'NFL'.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_all_players_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - PlayerAPIClient.get_all_players(sport=Sport.NFL) - self.assertEqual("404 Client Error", str(context.exception)) - - @mock.patch("requests.get") - def test_get_trending_players_add_happy_path(self, mock_requests_get): - mock_dict = [ - {"player_id": "943", "count": 13750}, - {"player_id": "5284", "count": 8070}, - {"player_id": "4863", "count": 6139}, - ] - - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = PlayerAPIClient.get_trending_players(sport=Sport.NFL, trend_type=TrendType.ADD) - - self.assertIsInstance(response, list) - self.assertEqual(3, len(response)) - self.assertIsInstance(response[0], PlayerTrend) - self.assertEqual("943", response[0].player_id) - self.assertEqual(13750, response[0].count) - - @mock.patch("requests.get") - def test_get_trending_players_drop_happy_path(self, mock_requests_get): - mock_dict = [ - {"player_id": "943", "count": 13750}, - {"player_id": "5284", "count": 8070}, - {"player_id": "4863", "count": 6139}, - ] - - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = PlayerAPIClient.get_trending_players(sport=Sport.NFL, trend_type=TrendType.DROP) - - self.assertIsInstance(response, list) - self.assertEqual(3, len(response)) - self.assertIsInstance(response[0], PlayerTrend) - self.assertEqual("943", response[0].player_id) - self.assertEqual(13750, response[0].count) - - @mock.patch("requests.get") - def test_get_trending_players_filters_given(self, mock_requests_get): - mock_dict = [ - {"player_id": "943", "count": 13750}, - {"player_id": "5284", "count": 8070}, - {"player_id": "4863", "count": 6139}, - ] - - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = PlayerAPIClient.get_trending_players( - sport=Sport.NFL, trend_type=TrendType.ADD, lookback_hours=1, limit=3 - ) - - self.assertIsInstance(response, list) - self.assertEqual(3, len(response)) - self.assertIsInstance(response[0], PlayerTrend) - self.assertEqual("943", response[0].player_id) - self.assertEqual(13750, response[0].count) - - @mock.patch("requests.get") - def test_get_trending_players_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - PlayerAPIClient.get_trending_players(sport=Sport.NFL, trend_type=TrendType.ADD) - self.assertEqual("Could not get PlayerTrends.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_trending_players_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - PlayerAPIClient.get_trending_players(sport=Sport.NFL, trend_type=TrendType.ADD) - self.assertEqual("404 Client Error", str(context.exception)) diff --git a/test/test_api/test_UserAPIClient.py b/test/test_api/test_UserAPIClient.py deleted file mode 100644 index e302379..0000000 --- a/test/test_api/test_UserAPIClient.py +++ /dev/null @@ -1,87 +0,0 @@ -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from requests import HTTPError - -from sleeper.api.UserAPIClient import UserAPIClient -from sleeper.model.User import User - - -class TestUserAPIClient(unittest.TestCase): - @mock.patch("requests.get") - def test_get_user_happy_path(self, mock_requests_get): - mock_dict = { - "verification": "v", - "username": "username", - "user_id": "user_id", - "token": "t", - "summoner_region": "r", - "solicitable": "s", - "real_name": "name", - "phone": "1", - "pending": "1", - "notifications": "1", - "metadata": {"test": "t"}, - "is_bot": True, - "email": "email", - "display_name": "display_name", - "deleted": "deleted", - "data_updated": "data", - "currencies": "currencies", - "created": "created", - "cookies": "cookies", - "avatar": "avatar", - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = UserAPIClient.get_user(user_id="user_id") - - self.assertIsInstance(response, User) - self.assertEqual(response.username, "username") - self.assertEqual(response.user_id, "user_id") - self.assertEqual(response.display_name, "display_name") - self.assertEqual(response.avatar, "avatar") - self.assertEqual("cookies", response.cookies) - self.assertEqual("created", response.created) - self.assertEqual("currencies", response.currencies) - self.assertEqual("data", response.data_updated) - self.assertEqual("deleted", response.deleted) - self.assertEqual("email", response.email) - self.assertEqual({"test": "t"}, response.metadata) - self.assertEqual("1", response.notifications) - self.assertEqual("1", response.pending) - self.assertEqual("1", response.phone) - self.assertEqual("name", response.real_name) - self.assertEqual("s", response.solicitable) - self.assertEqual("r", response.summoner_region) - self.assertEqual("t", response.token) - self.assertEqual("v", response.verification) - - def test_get_user_username_and_user_id_not_given_raises_exception(self): - with self.assertRaises(ValueError) as context: - UserAPIClient.get_user() - self.assertEqual("'username' and 'user_id' cannot both be None.", str(context.exception)) - - @mock.patch("requests.get") - def test_get_user_username_or_user_id_not_found_raises_exception(self, mock_requests_get): - mock_dict = None - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - with self.assertRaises(ValueError) as context: - UserAPIClient.get_user(user_id="user_id") - self.assertEqual( - "Could not find User for username/user_id: 'user_id'.", str(context.exception) - ) - - @mock.patch("requests.get") - def test_get_user_non_200_status_code_raises_exception(self, mock_requests_get): - mock_dict = {} - mock_response = MockResponse(mock_dict, 404) - mock_requests_get.return_value = mock_response - - with self.assertRaises(HTTPError) as context: - UserAPIClient.get_user(user_id="user_id") - self.assertEqual("404 Client Error", str(context.exception)) diff --git a/test/test_api/test_unofficial/test_UPlayerAPIClient.py b/test/test_api/test_unofficial/test_UPlayerAPIClient.py deleted file mode 100644 index 51eb5a9..0000000 --- a/test/test_api/test_unofficial/test_UPlayerAPIClient.py +++ /dev/null @@ -1,376 +0,0 @@ -import os -import tempfile -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from sleeper.api.unofficial import UPlayerAPIClient -from sleeper.enum import Category, Company, SeasonType -from sleeper.enum.nfl import NFLPosition, NFLTeam -from sleeper.enum.Sport import Sport -from sleeper.model import Player, PlayerStats -from sleeper.model.nfl import NFLStats - - -class TestUPlayerAPIClient(unittest.TestCase): - PATH_TO_TEST_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "..", "files", "api") - ) - - @mock.patch("requests.get") - def test_get_player_stats_no_week_given_happy_path(self, mock_requests_get): - mock_dict = { - "team": "LAR", - "stats": {"rush_yd": 1.0, "rush_fd": 2.0, "rush_att": 3.0}, - "sport": "nfl", - "season_type": "regular", - "season": "2021", - "player_id": "1234", - "player": { - "years_exp": 1, - "team": "LAR", - "position": "WR", - "news_updated": 1234, - "last_name": "ln", - "first_name": "fn", - "fantasy_positions": ["WR"], - }, - "game_id": "season", - "company": "rotowire", - "category": "stat", - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = UPlayerAPIClient.get_player_stats( - sport=Sport.NFL, player_id="1234", season="2021" - ) - - self.assertIsInstance(response, PlayerStats) - self.assertEqual(NFLTeam.LAR, response.team) - self.assertIsInstance(response.stats, NFLStats) - self.assertEqual(1.0, response.stats.rush_yd) - self.assertEqual(2.0, response.stats.rush_fd) - self.assertEqual(3.0, response.stats.rush_att) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertEqual("2021", response.season) - self.assertEqual("1234", response.player_id) - self.assertIsInstance(response.player, Player) - self.assertEqual(1, response.player.years_exp) - self.assertEqual(NFLTeam.LAR, response.player.team) - self.assertEqual(NFLPosition.WR, response.player.position) - self.assertEqual(1234, response.player.news_updated) - self.assertIsNone(response.player.metadata) - self.assertEqual("ln", response.player.last_name) - self.assertEqual("fn", response.player.first_name) - self.assertEqual([NFLPosition.WR], response.player.fantasy_positions) - self.assertEqual("season", response.game_id) - self.assertEqual(Company.ROTOWIRE, response.company) - self.assertEqual(Category.STAT, response.category) - - @mock.patch("requests.get") - def test_get_player_stats_week_is_given_happy_path(self, mock_requests_get): - mock_dict = { - "week": 1, - "team": "LAR", - "stats": {"rush_yd": 1.0, "rush_fd": 2.0, "rush_att": 3.0}, - "sport": "nfl", - "season_type": "regular", - "season": "2021", - "opponent": "SEA", - "player_id": "1234", - "player": { - "years_exp": 1, - "team": "LAR", - "position": "WR", - "news_updated": 1234, - "last_name": "ln", - "first_name": "fn", - "fantasy_positions": ["WR"], - }, - "game_id": "1234", - "company": "sportradar", - "category": "stat", - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = UPlayerAPIClient.get_player_stats( - sport=Sport.NFL, player_id="1234", season="2021", week=1 - ) - - self.assertIsInstance(response, PlayerStats) - self.assertEqual(NFLTeam.LAR, response.team) - self.assertIsInstance(response.stats, NFLStats) - self.assertEqual(1, response.week) - self.assertEqual(1.0, response.stats.rush_yd) - self.assertEqual(2.0, response.stats.rush_fd) - self.assertEqual(3.0, response.stats.rush_att) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertEqual("2021", response.season) - self.assertEqual("1234", response.player_id) - self.assertIsInstance(response.player, Player) - self.assertEqual(1, response.player.years_exp) - self.assertEqual(NFLTeam.LAR, response.player.team) - self.assertEqual(NFLPosition.WR, response.player.position) - self.assertEqual(1234, response.player.news_updated) - self.assertIsNone(response.player.metadata) - self.assertEqual("ln", response.player.last_name) - self.assertEqual("fn", response.player.first_name) - self.assertEqual([NFLPosition.WR], response.player.fantasy_positions) - self.assertEqual("1234", response.game_id) - self.assertEqual(Company.SPORTRADAR, response.company) - self.assertEqual(Category.STAT, response.category) - self.assertEqual(NFLTeam.SEA, response.opponent) - - @mock.patch("requests.get") - def test_get_player_projections_no_week_given_happy_path(self, mock_requests_get): - mock_dict = { - "team": "LAR", - "stats": {"rush_yd": 1.0, "rush_fd": 2.0, "rush_att": 3.0}, - "sport": "nfl", - "season_type": "regular", - "season": "2021", - "player_id": "1234", - "player": { - "years_exp": 1, - "team": "LAR", - "position": "WR", - "news_updated": 1234, - "last_name": "ln", - "first_name": "fn", - "fantasy_positions": ["WR"], - }, - "game_id": "season", - "company": "rotowire", - "category": "proj", - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = UPlayerAPIClient.get_player_projections( - sport=Sport.NFL, player_id="1234", season="2021" - ) - - self.assertIsInstance(response, PlayerStats) - self.assertEqual(NFLTeam.LAR, response.team) - self.assertIsInstance(response.stats, NFLStats) - self.assertEqual(1.0, response.stats.rush_yd) - self.assertEqual(2.0, response.stats.rush_fd) - self.assertEqual(3.0, response.stats.rush_att) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertEqual("2021", response.season) - self.assertEqual("1234", response.player_id) - self.assertIsInstance(response.player, Player) - self.assertEqual(1, response.player.years_exp) - self.assertEqual(NFLTeam.LAR, response.player.team) - self.assertEqual(NFLPosition.WR, response.player.position) - self.assertEqual(1234, response.player.news_updated) - self.assertIsNone(response.player.metadata) - self.assertEqual("ln", response.player.last_name) - self.assertEqual("fn", response.player.first_name) - self.assertEqual([NFLPosition.WR], response.player.fantasy_positions) - self.assertEqual("season", response.game_id) - self.assertEqual(Company.ROTOWIRE, response.company) - self.assertEqual(Category.PROJ, response.category) - - @mock.patch("requests.get") - def test_get_player_projections_week_is_given_happy_path(self, mock_requests_get): - mock_dict = { - "week": 1, - "team": "LAR", - "stats": {"rush_yd": 1.0, "rush_fd": 2.0, "rush_att": 3.0}, - "sport": "nfl", - "season_type": "regular", - "season": "2021", - "opponent": "SEA", - "player_id": "1234", - "player": { - "years_exp": 1, - "team": "LAR", - "position": "WR", - "news_updated": 1234, - "last_name": "ln", - "first_name": "fn", - "fantasy_positions": ["WR"], - }, - "game_id": "1234", - "company": "sportradar", - "category": "proj", - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = UPlayerAPIClient.get_player_stats( - sport=Sport.NFL, player_id="1234", season="2021", week=1 - ) - - self.assertIsInstance(response, PlayerStats) - self.assertEqual(NFLTeam.LAR, response.team) - self.assertIsInstance(response.stats, NFLStats) - self.assertEqual(1, response.week) - self.assertEqual(1.0, response.stats.rush_yd) - self.assertEqual(2.0, response.stats.rush_fd) - self.assertEqual(3.0, response.stats.rush_att) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertEqual("2021", response.season) - self.assertEqual("1234", response.player_id) - self.assertIsInstance(response.player, Player) - self.assertEqual(1, response.player.years_exp) - self.assertEqual(NFLTeam.LAR, response.player.team) - self.assertEqual(NFLPosition.WR, response.player.position) - self.assertEqual(1234, response.player.news_updated) - self.assertIsNone(response.player.metadata) - self.assertEqual("ln", response.player.last_name) - self.assertEqual("fn", response.player.first_name) - self.assertEqual([NFLPosition.WR], response.player.fantasy_positions) - self.assertEqual("1234", response.game_id) - self.assertEqual(Company.SPORTRADAR, response.company) - self.assertEqual(Category.PROJ, response.category) - self.assertEqual(NFLTeam.SEA, response.opponent) - - @mock.patch("requests.get") - def test_get_all_player_stats_happy_path(self, mock_requests_get): - mock_list = [ - { - "week": 1, - "team": "LAR", - "stats": {"rush_yd": 1.0, "rush_fd": 2.0, "rush_att": 3.0}, - "sport": "nfl", - "season_type": "regular", - "season": "2021", - "opponent": "SEA", - "player_id": "1234", - "player": { - "years_exp": 1, - "team": "LAR", - "position": "WR", - "news_updated": 1234, - "last_name": "ln", - "first_name": "fn", - "fantasy_positions": ["WR"], - }, - "game_id": "1234", - "company": "sportradar", - "category": "stat", - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response_list = UPlayerAPIClient.get_all_player_stats( - sport=Sport.NFL, season="2021", week=1 - ) - response = response_list[0] - - self.assertIsInstance(response_list, list) - self.assertEqual(1, len(response_list)) - self.assertIsInstance(response, PlayerStats) - self.assertEqual(NFLTeam.LAR, response.team) - self.assertIsInstance(response.stats, NFLStats) - self.assertEqual(1, response.week) - self.assertEqual(1.0, response.stats.rush_yd) - self.assertEqual(2.0, response.stats.rush_fd) - self.assertEqual(3.0, response.stats.rush_att) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertEqual("2021", response.season) - self.assertEqual("1234", response.player_id) - self.assertIsInstance(response.player, Player) - self.assertEqual(1, response.player.years_exp) - self.assertEqual(NFLTeam.LAR, response.player.team) - self.assertEqual(NFLPosition.WR, response.player.position) - self.assertEqual(1234, response.player.news_updated) - self.assertIsNone(response.player.metadata) - self.assertEqual("ln", response.player.last_name) - self.assertEqual("fn", response.player.first_name) - self.assertEqual([NFLPosition.WR], response.player.fantasy_positions) - self.assertEqual("1234", response.game_id) - self.assertEqual(Company.SPORTRADAR, response.company) - self.assertEqual(Category.STAT, response.category) - self.assertEqual(NFLTeam.SEA, response.opponent) - - @mock.patch("requests.get") - def test_get_all_player_projections_happy_path(self, mock_requests_get): - mock_list = [ - { - "week": 1, - "team": "LAR", - "stats": {"rush_yd": 1.0, "rush_fd": 2.0, "rush_att": 3.0}, - "sport": "nfl", - "season_type": "regular", - "season": "2021", - "opponent": "SEA", - "player_id": "1234", - "player": { - "years_exp": 1, - "team": "LAR", - "position": "WR", - "news_updated": 1234, - "last_name": "ln", - "first_name": "fn", - "fantasy_positions": ["WR"], - }, - "game_id": "1234", - "company": "sportradar", - "category": "proj", - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response_list = UPlayerAPIClient.get_all_player_projections( - sport=Sport.NFL, season="2021", week=1 - ) - response = response_list[0] - - self.assertIsInstance(response_list, list) - self.assertEqual(1, len(response_list)) - self.assertIsInstance(response, PlayerStats) - self.assertEqual(NFLTeam.LAR, response.team) - self.assertIsInstance(response.stats, NFLStats) - self.assertEqual(1, response.week) - self.assertEqual(1.0, response.stats.rush_yd) - self.assertEqual(2.0, response.stats.rush_fd) - self.assertEqual(3.0, response.stats.rush_att) - self.assertEqual(Sport.NFL, response.sport) - self.assertEqual(SeasonType.REGULAR, response.season_type) - self.assertEqual("2021", response.season) - self.assertEqual("1234", response.player_id) - self.assertIsInstance(response.player, Player) - self.assertEqual(1, response.player.years_exp) - self.assertEqual(NFLTeam.LAR, response.player.team) - self.assertEqual(NFLPosition.WR, response.player.position) - self.assertEqual(1234, response.player.news_updated) - self.assertIsNone(response.player.metadata) - self.assertEqual("ln", response.player.last_name) - self.assertEqual("fn", response.player.first_name) - self.assertEqual([NFLPosition.WR], response.player.fantasy_positions) - self.assertEqual("1234", response.game_id) - self.assertEqual(Company.SPORTRADAR, response.company) - self.assertEqual(Category.PROJ, response.category) - self.assertEqual(NFLTeam.SEA, response.opponent) - - @mock.patch("requests.get") - def test_get_player_head_shot_happy_path(self, mock_requests_get): - with open(os.path.join(self.PATH_TO_TEST_DIR, "test.png"), "rb") as image: - f = image.read() - original_image_bytes = bytearray(f) - mock_response = MockResponse(dict(), 200, content=original_image_bytes) - mock_requests_get.return_value = mock_response - - with tempfile.TemporaryDirectory() as temp_dir: - full_image_path = os.path.join(temp_dir, "tmp.png") - UPlayerAPIClient.get_player_head_shot( - sport=Sport.NFL, player_id="1234", save_to_path=full_image_path - ) - - with open(full_image_path, "rb") as image: - f = image.read() - saved_image_bytes = bytearray(f) - self.assertEqual(original_image_bytes, saved_image_bytes) - self.assertTrue(os.path.exists(full_image_path)) diff --git a/test/test_api/test_unofficial/test_USportAPIClient.py b/test/test_api/test_unofficial/test_USportAPIClient.py deleted file mode 100644 index 3fb7083..0000000 --- a/test/test_api/test_unofficial/test_USportAPIClient.py +++ /dev/null @@ -1,39 +0,0 @@ -import datetime -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from sleeper.api.unofficial import USportAPIClient -from sleeper.enum import SeasonStatus -from sleeper.enum.nfl import NFLTeam -from sleeper.enum.Sport import Sport -from sleeper.model import Game - - -class TestUSportAPIClient(unittest.TestCase): - @mock.patch("requests.get") - def test_get_player_stats_no_week_given_happy_path(self, mock_requests_get): - mock_list = [ - { - "week": 1, - "status": "complete", - "home": "ATL", - "game_id": "1234", - "date": "2021-09-12", - "away": "PHI", - } - ] - mock_response = MockResponse(mock_list, 200) - mock_requests_get.return_value = mock_response - - response = USportAPIClient.get_regular_season_schedule(sport=Sport.NFL, season="2021") - - self.assertIsInstance(response, list) - self.assertEqual(1, len(response)) - self.assertIsInstance(response[0], Game) - self.assertEqual(1, response[0].week) - self.assertEqual(SeasonStatus.COMPLETE, response[0].status) - self.assertEqual(NFLTeam.ATL, response[0].home) - self.assertEqual("1234", response[0].game_id) - self.assertEqual(datetime.datetime(2021, 9, 12).date(), response[0].date) - self.assertEqual(NFLTeam.PHI, response[0].away) diff --git a/test/test_api/test_unofficial/test_UTeamAPIClient.py b/test/test_api/test_unofficial/test_UTeamAPIClient.py deleted file mode 100644 index ab419fb..0000000 --- a/test/test_api/test_unofficial/test_UTeamAPIClient.py +++ /dev/null @@ -1,121 +0,0 @@ -import unittest -from test.helper.helper_classes import MockResponse -from unittest import mock - -from sleeper.api.unofficial import UTeamAPIClient -from sleeper.enum.nfl import NFLTeam -from sleeper.enum.Sport import Sport -from sleeper.model.nfl import NFLDepthChart - - -class TestUSTeamAPIClient(unittest.TestCase): - @mock.patch("requests.get") - def test_get_team_depth_chart_happy_path(self, mock_requests_get): - mock_dict = { - "WR3": ["1817", "8167"], - "WR2": ["928", "7540", "8235"], - "WR1": ["5185", "8121", "6223"], - "TE": ["4602", "111", "7050"], - "SS": ["2445", "5736", "6355"], - "RT": ["5877", "8511"], - "ROLB": ["5839", "8382"], - "RILB": ["8266", "7782"], - "RG": ["7702", "8460"], - "RDE": ["3220", "8270"], - "RCB": ["7628", "6333"], - "RB": ["4199", "6828"], - "QB": ["96", "6804"], - "PK": ["59"], - "NT": ["3186", "7818", "8344"], - "NB": ["4136", "4223"], - "LT": ["1521", "6008"], - "LOLB": ["2343", "6965", "6981"], - "LILB": ["3276", "7268"], - "LG": ["6980", "8463"], - "LDE": ["3295"], - "LCB": ["4979", "7813"], - "FS": ["6210", "8405"], - "C": ["7645", "7132"], - } - mock_response = MockResponse(mock_dict, 200) - mock_requests_get.return_value = mock_response - - response = UTeamAPIClient.get_team_depth_chart(sport=Sport.NFL, team=NFLTeam.GB) - - self.assertIsInstance(response, NFLDepthChart) - self.assertEqual(2, len(response.WR3)) - self.assertEqual("1817", response.WR3[0]) - self.assertEqual("8167", response.WR3[1]) - self.assertEqual(3, len(response.WR2)) - self.assertEqual("928", response.WR2[0]) - self.assertEqual("7540", response.WR2[1]) - self.assertEqual("8235", response.WR2[2]) - self.assertEqual(3, len(response.WR1)) - self.assertEqual("5185", response.WR1[0]) - self.assertEqual("8121", response.WR1[1]) - self.assertEqual("6223", response.WR1[2]) - self.assertEqual(3, len(response.TE)) - self.assertEqual("4602", response.TE[0]) - self.assertEqual("111", response.TE[1]) - self.assertEqual("7050", response.TE[2]) - self.assertEqual(3, len(response.SS)) - self.assertEqual("2445", response.SS[0]) - self.assertEqual("5736", response.SS[1]) - self.assertEqual("6355", response.SS[2]) - self.assertEqual(2, len(response.RT)) - self.assertEqual("5877", response.RT[0]) - self.assertEqual("8511", response.RT[1]) - self.assertEqual(2, len(response.ROLB)) - self.assertEqual("5839", response.ROLB[0]) - self.assertEqual("8382", response.ROLB[1]) - self.assertEqual(2, len(response.RILB)) - self.assertEqual("8266", response.RILB[0]) - self.assertEqual("7782", response.RILB[1]) - self.assertEqual(2, len(response.RG)) - self.assertEqual("7702", response.RG[0]) - self.assertEqual("8460", response.RG[1]) - self.assertEqual(2, len(response.RDE)) - self.assertEqual("3220", response.RDE[0]) - self.assertEqual("8270", response.RDE[1]) - self.assertEqual(2, len(response.RCB)) - self.assertEqual("7628", response.RCB[0]) - self.assertEqual("6333", response.RCB[1]) - self.assertEqual(2, len(response.RB)) - self.assertEqual("4199", response.RB[0]) - self.assertEqual("6828", response.RB[1]) - self.assertEqual(2, len(response.QB)) - self.assertEqual("96", response.QB[0]) - self.assertEqual("6804", response.QB[1]) - self.assertEqual(1, len(response.PK)) - self.assertEqual("59", response.PK[0]) - self.assertEqual(3, len(response.NT)) - self.assertEqual("3186", response.NT[0]) - self.assertEqual("7818", response.NT[1]) - self.assertEqual("8344", response.NT[2]) - self.assertEqual(2, len(response.NB)) - self.assertEqual("4136", response.NB[0]) - self.assertEqual("4223", response.NB[1]) - self.assertEqual(2, len(response.LT)) - self.assertEqual("1521", response.LT[0]) - self.assertEqual("6008", response.LT[1]) - self.assertEqual(3, len(response.LOLB)) - self.assertEqual("2343", response.LOLB[0]) - self.assertEqual("6965", response.LOLB[1]) - self.assertEqual("6981", response.LOLB[2]) - self.assertEqual(2, len(response.LILB)) - self.assertEqual("3276", response.LILB[0]) - self.assertEqual("7268", response.LILB[1]) - self.assertEqual(2, len(response.LG)) - self.assertEqual("6980", response.LG[0]) - self.assertEqual("8463", response.LG[1]) - self.assertEqual(1, len(response.LDE)) - self.assertEqual("3295", response.LDE[0]) - self.assertEqual(2, len(response.LCB)) - self.assertEqual("4979", response.LCB[0]) - self.assertEqual("7813", response.LCB[1]) - self.assertEqual(2, len(response.FS)) - self.assertEqual("6210", response.FS[0]) - self.assertEqual("8405", response.FS[1]) - self.assertEqual(2, len(response.C)) - self.assertEqual("7645", response.C[0]) - self.assertEqual("7132", response.C[1]) diff --git a/test/test_api/test_unofficial/__init__.py b/test/unit/__init__.py similarity index 100% rename from test/test_api/test_unofficial/__init__.py rename to test/unit/__init__.py diff --git a/test/helper/helper_classes.py b/test/unit/helper/helper_classes.py similarity index 100% rename from test/helper/helper_classes.py rename to test/unit/helper/helper_classes.py diff --git a/test/unit/test_api/__init__.py b/test/unit/test_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/test_api/test_avatar.py b/test/unit/test_api/test_avatar.py new file mode 100644 index 0000000..e2724fe --- /dev/null +++ b/test/unit/test_api/test_avatar.py @@ -0,0 +1,31 @@ +import unittest +from unittest.mock import patch + +from sleeper.api import get_avatar +from test.unit.helper.helper_classes import MockResponse + + +class TestAvatar(unittest.TestCase): + @patch("requests.get") + def test_get_avatar_defaults(self, mock_requests_get): + mock_bytes = b"foo" + mock_response = MockResponse({}, 200, mock_bytes) + mock_requests_get.return_value = mock_response + + response = get_avatar(avatar_id="abc") + + self.assertEqual(mock_bytes, response) + mock_requests_get.assert_called_once_with("https://sleepercdn.com/avatars/abc") + + @patch("requests.get") + def test_get_avatar_as_thumbnail(self, mock_requests_get): + mock_bytes = b"foo" + mock_response = MockResponse({}, 200, mock_bytes) + mock_requests_get.return_value = mock_response + + response = get_avatar(avatar_id="abc", as_thumbnail=True) + + self.assertEqual(mock_bytes, response) + mock_requests_get.assert_called_once_with( + "https://sleepercdn.com/avatars/thumbs/abc" + ) diff --git a/test/unit/test_api/test_draft.py b/test/unit/test_api/test_draft.py new file mode 100644 index 0000000..9a8f81b --- /dev/null +++ b/test/unit/test_api/test_draft.py @@ -0,0 +1,78 @@ +import unittest +from unittest.mock import patch + +from sleeper.api import ( + get_draft, + get_drafts_in_league, + get_player_draft_picks, + get_traded_draft_picks, + get_user_drafts_for_year, +) +from test.unit.helper.helper_classes import MockResponse + + +class TestDraft(unittest.TestCase): + @patch("requests.get") + def test_get_user_drafts_for_year_happy_path(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_user_drafts_for_year(user_id="user_id", sport="nfl", year=2020) + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/user/user_id/drafts/nfl/2020" + ) + + @patch("requests.get") + def test_get_drafts_in_league(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_drafts_in_league(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/drafts" + ) + + @patch("requests.get") + def test_get_draft(self, mock_requests_get): + mock_dict = {"foo": "bar"} + mock_response = MockResponse(mock_dict, 200) + mock_requests_get.return_value = mock_response + + response = get_draft(draft_id="12345") + + self.assertEqual(mock_dict, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/draft/12345" + ) + + @patch("requests.get") + def test_get_player_draft_picks(self, mock_requests_get): + mock_dict = {"foo": "bar"} + mock_response = MockResponse(mock_dict, 200) + mock_requests_get.return_value = mock_response + + response = get_player_draft_picks(draft_id="12345") + + self.assertEqual(mock_dict, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/draft/12345/picks" + ) + + @patch("requests.get") + def test_get_traded_draft_picks(self, mock_requests_get): + mock_dict = {"foo": "bar"} + mock_response = MockResponse(mock_dict, 200) + mock_requests_get.return_value = mock_response + + response = get_traded_draft_picks(draft_id="12345") + + self.assertEqual(mock_dict, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/draft/12345/traded_picks" + ) diff --git a/test/unit/test_api/test_league.py b/test/unit/test_api/test_league.py new file mode 100644 index 0000000..97ac6b9 --- /dev/null +++ b/test/unit/test_api/test_league.py @@ -0,0 +1,148 @@ +import unittest +from unittest.mock import patch + +from sleeper.api import ( + get_league, + get_losers_bracket, + get_matchups_for_week, + get_rosters, + get_sport_state, + get_traded_picks, + get_transactions, + get_user_leagues_for_year, + get_users_in_league, + get_winners_bracket, +) +from test.unit.helper.helper_classes import MockResponse + + +class TestLeague(unittest.TestCase): + @patch("requests.get") + def test_get_league(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_league(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345" + ) + + @patch("requests.get") + def test_get_user_leagues_for_year(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_user_leagues_for_year(user_id="12345", sport="nfl", year=2024) + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/user/12345/leagues/nfl/2024" + ) + + @patch("requests.get") + def test_get_rosters(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_rosters(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/rosters" + ) + + @patch("requests.get") + def test_get_users_in_league(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_users_in_league(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/users" + ) + + @patch("requests.get") + def test_get_matchups_for_week(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_matchups_for_week(league_id="12345", week=1) + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/matchups/1" + ) + + @patch("requests.get") + def test_get_winners_bracket(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_winners_bracket(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/winners_bracket" + ) + + @patch("requests.get") + def test_get_losers_bracket(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_losers_bracket(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/losers_bracket" + ) + + @patch("requests.get") + def test_get_transactions(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_transactions(league_id="12345", week=1) + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/transactions/1" + ) + + @patch("requests.get") + def test_get_traded_picks(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_traded_picks(league_id="12345") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/league/12345/traded_picks" + ) + + @patch("requests.get") + def test_get_sport_state(self, mock_requests_get): + mock_dict = {"foo": "bar"} + mock_response = MockResponse(mock_dict, 200) + mock_requests_get.return_value = mock_response + + response = get_sport_state(sport="nfl") + + self.assertEqual(mock_dict, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/state/nfl" + ) diff --git a/test/unit/test_api/test_player.py b/test/unit/test_api/test_player.py new file mode 100644 index 0000000..bb425f9 --- /dev/null +++ b/test/unit/test_api/test_player.py @@ -0,0 +1,48 @@ +import unittest +from unittest.mock import patch + +from sleeper.api import get_all_players, get_trending_players +from test.unit.helper.helper_classes import MockResponse + + +class TestPlayer(unittest.TestCase): + @patch("requests.get") + def test_get_all_players(self, mock_requests_get): + mock_dict = {"foo": {"bar": "baz"}} + mock_response = MockResponse(mock_dict, 200) + mock_requests_get.return_value = mock_response + + response = get_all_players(sport="nfl") + + self.assertEqual(mock_dict, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/players/nfl" + ) + + @patch("requests.get") + def test_get_trending_players_with_defaults(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_trending_players(sport="nfl", trend_type="add") + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/players/nfl/trending/add" + ) + + @patch("requests.get") + def test_get_trending_players_with_optional_params_given(self, mock_requests_get): + mock_list = [{"foo": "bar"}] + mock_response = MockResponse(mock_list, 200) + mock_requests_get.return_value = mock_response + + response = get_trending_players( + sport="nfl", trend_type="add", lookback_hours=1, limit=2 + ) + + self.assertEqual(mock_list, response) + mock_requests_get.assert_called_once_with( + "https://api.sleeper.app/v1/players/nfl/trending/add?lookback_hours=1&limit=2" + ) diff --git a/test/unit/test_api/test_user.py b/test/unit/test_api/test_user.py new file mode 100644 index 0000000..58921af --- /dev/null +++ b/test/unit/test_api/test_user.py @@ -0,0 +1,18 @@ +import unittest +from unittest.mock import patch + +from sleeper.api import get_user +from test.unit.helper.helper_classes import MockResponse + + +class TestUser(unittest.TestCase): + @patch("requests.get") + def test_get_user(self, mock_requests_get): + mock_dict = {"foo": "bar"} + mock_response = MockResponse(mock_dict, 200) + mock_requests_get.return_value = mock_response + + response = get_user(identifier="foo") + + self.assertEqual(mock_dict, response) + mock_requests_get.assert_called_once_with("https://api.sleeper.app/v1/user/foo") diff --git a/test/unit/test_api/test_utils.py b/test/unit/test_api/test_utils.py new file mode 100644 index 0000000..1fdc6a7 --- /dev/null +++ b/test/unit/test_api/test_utils.py @@ -0,0 +1,36 @@ +import unittest + +from sleeper.api._utils import add_filters, build_route + + +class TestUtils(unittest.TestCase): + def test_build_route_with_str_paths(self): + resp = build_route("https://foo", "bar", "/baz") + self.assertEqual("https://foo/bar/baz", resp) + + def test_build_route_with_int_and_str_paths(self): + resp = build_route("https://foo", "bar", 1) + self.assertEqual("https://foo/bar/1", resp) + + def test_build_route_base_url_ends_with_slash(self): + resp = build_route("https://foo/", "bar", "/baz") + self.assertEqual("https://foo/bar/baz", resp) + + def test_build_route_ending_path_ends_with_slash(self): + resp = build_route("https://foo/", "bar", "/baz/") + self.assertEqual("https://foo/bar/baz", resp) + + def test_add_filters_no_filters_given(self): + resp = add_filters("https://foo") + self.assertEqual("https://foo", resp) + + def test_add_filters_filters_given(self): + resp = add_filters("https://foo", ("bar", "baz"), ("qux", 1)) + self.assertEqual("https://foo?bar=baz&qux=1", resp) + + def test_add_filters_url_already_has_filters(self): + resp = add_filters( + "https://foo?bar=baz", + ("qux", 1), + ) + self.assertEqual("https://foo?bar=baz&qux=1", resp)