diff --git a/setup.py b/setup.py index e82cb88..26918e9 100755 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ def readme(): setup(name='yahoo_fantasy_api', - version='2.8.0', + version='2.9.0', description='Python bindings to access the Yahoo! Fantasy APIs', long_description=readme(), url='http://github.com/spilchen/yahoo_fantasy_api', diff --git a/yahoo_fantasy_api/team.py b/yahoo_fantasy_api/team.py index 02e7155..7ffc806 100644 --- a/yahoo_fantasy_api/team.py +++ b/yahoo_fantasy_api/team.py @@ -2,6 +2,7 @@ from yahoo_fantasy_api import yhandler import objectpath +import datetime from xml.dom.minidom import Document from yahoo_fantasy_api.utils import create_element @@ -113,15 +114,15 @@ def _compact_eligible_pos(j): pass return roster - def change_positions(self, day, modified_lineup): + def change_positions(self, time_frame, modified_lineup): """Change the starting position of a subset of players in your lineup This raises a RuntimeError if any error occurs when communicating with Yahoo! - :param day: The day that the new positions take affect. This should be - the starting day of the week. - :type day: :class:`datetime.date` + :param time_frame: The time frame that the new positions take affect. This should be + the starting day of the week (MLB, NBA, or NHL) or the week number (NFL). + :type time_frame: :class:`datetime.date` | int :param modified_lineup: List of players to modify. Each entry should have a dict with the following keys: player_id - player ID of the player to change; selected_position - new position of the player. @@ -134,7 +135,7 @@ def change_positions(self, day, modified_lineup): {'player_id': 4558, 'selected_position': 'BN'}] tm.change_positions(cd, plyrs) """ - xml = self._construct_change_roster_xml(day, modified_lineup) + xml = self._construct_change_roster_xml(time_frame, modified_lineup) self.yhandler.put_roster(self.team_key, xml) def add_player(self, player_id): @@ -377,16 +378,24 @@ def _construct_trade_proposal_xml(self, tradee_team_key: str, your_player_keys: return doc.toprettyxml() - def _construct_change_roster_xml(self, day, modified_lineup): + def _construct_change_roster_xml(self, time_frame, modified_lineup): """Construct XML to pass to Yahoo! that will modified the positions""" doc = Document() roster = doc.appendChild(doc.createElement('fantasy_content')) \ .appendChild(doc.createElement('roster')) - roster.appendChild(doc.createElement('coverage_type')) \ - .appendChild(doc.createTextNode('date')) - roster.appendChild(doc.createElement('date')) \ - .appendChild(doc.createTextNode(day.strftime("%Y-%m-%d"))) + if isinstance(time_frame, datetime.date): + roster.appendChild(doc.createElement('coverage_type')) \ + .appendChild(doc.createTextNode('date')) + roster.appendChild(doc.createElement('date')) \ + .appendChild(doc.createTextNode(time_frame.strftime("%Y-%m-%d"))) + elif isinstance(time_frame, int): + roster.appendChild(doc.createElement('coverage_type')) \ + .appendChild(doc.createTextNode('week')) + roster.appendChild(doc.createElement('week')) \ + .appendChild(doc.createTextNode(str(time_frame))) + else: + raise RuntimeError("Invalid time_frame format. Must be datetime.date or int.") plyrs = roster.appendChild(doc.createElement('players')) for plyr in modified_lineup: diff --git a/yahoo_fantasy_api/tests/mock_yhandler.py b/yahoo_fantasy_api/tests/mock_yhandler.py index 065b01b..1892346 100644 --- a/yahoo_fantasy_api/tests/mock_yhandler.py +++ b/yahoo_fantasy_api/tests/mock_yhandler.py @@ -189,3 +189,9 @@ def get_transactions_raw(self, league_id, tran_types, count): """ with open(self.dir_path + "/sample.transactions.json", "r") as f: return json.load(f) + + def put_roster(self, team_key, xml): + # This produces no output. Just save the xml for inspection by the + # test. + self.roster_xml = xml + diff --git a/yahoo_fantasy_api/tests/test_team.py b/yahoo_fantasy_api/tests/test_team.py index a15de5b..d4cb175 100644 --- a/yahoo_fantasy_api/tests/test_team.py +++ b/yahoo_fantasy_api/tests/test_team.py @@ -1,6 +1,8 @@ #!/bin/python import os +import datetime +import pytest def test_matchup(mock_team): @@ -79,3 +81,19 @@ def test__construct_trade_proposal_xml(mock_team): actual_xml = mock_team._construct_trade_proposal_xml(tradee_team_key, your_player_keys, their_player_keys, trade_note) assert actual_xml == expected_xml + + +def test_change_roster(mock_team): + plyrs = [{'player_id': 5981, 'selected_position': 'BN'}, + {'player_id': 4558, 'selected_position': 'BN'}] + cd = datetime.date(2019, 10, 7) + mock_team.change_positions(cd, plyrs) + assert mock_team.yhandler.roster_xml is not None + assert "2019-10-07" in mock_team.yhandler.roster_xml + + mock_team.change_positions(2, plyrs) + assert "2019-10-07" not in mock_team.yhandler.roster_xml + assert "2" in mock_team.yhandler.roster_xml + + with pytest.raises(Exception): + mock_team.change_positions("3", plyrs)