def __init__(self): self.actions = [ Actions.up, Actions.down, Actions.right, Actions.left, Actions.stick ] self.initial_state = Soccer_Field( Athlete(coordinates=(2, 0), has_possession=False, ID=1), Athlete(coordinates=(1, 0), has_possession=True, ID=2)) self.Nash = defaultdict(lambda: 1)
def field_state_a2_first(self, athlete1_action, athlete2_action): a1_new_position = self.get_new_coordinates(self.athlete1, athlete1_action) a2_new_position = self.get_new_coordinates(self.athlete2, athlete2_action) if a1_new_position == a2_new_position: both_new_actions_are_the_same = True else: both_new_actions_are_the_same = False # What the field would look like if athlete 2 moved first if a2_new_position != self.athlete1.coordinates: if self.athlete2.has_possession: a2_state_if_a2_first = Athlete(coordinates=a2_new_position, has_possession=True, ID=2) if both_new_actions_are_the_same: a1_state_if_a2_first = Athlete( coordinates=self.athlete1.coordinates, has_possession=False, ID=1) else: a1_state_if_a2_first = Athlete(coordinates=a1_new_position, has_possession=False, ID=1) else: if both_new_actions_are_the_same: a2_state_if_a2_first = Athlete(coordinates=a2_new_position, has_possession=True, ID=2) a1_state_if_a2_first = Athlete( coordinates=self.athlete1.coordinates, has_possession=False, ID=1) else: a2_state_if_a2_first = Athlete(coordinates=a2_new_position, has_possession=False, ID=2) a1_state_if_a2_first = Athlete(coordinates=a1_new_position, has_possession=True, ID=1) else: #if a2 moves to a1's coordinates.. a2_state_if_a2_first = Athlete( coordinates=self.athlete2.coordinates, has_possession=False, ID=2) a1_state_if_a2_first = Athlete( coordinates=self.athlete1.coordinates, has_possession=True, ID=1) new_soccer_field = Soccer_Field(a1_state_if_a2_first, a2_state_if_a2_first) return new_soccer_field
def parse_athlete(self, athlete_id, response): soup = bs4.BeautifulSoup(response.text) trs = soup.select('tr') dl = soup.select('.profile-details dl') athlete = Athlete(athlete_id) for tr in trs: contents = tr.contents if len(tr.contents) < 2: continue exercise = contents[0].getText() value = contents[1].getText() athlete.set_stat(exercise, value) counter = 0 for content in dl[0].contents: counter += 1 if counter % 2 == 0: value = content.getText() athlete.set_personal(label, value) else: label = content.getText()[:-1] return athlete
def add_athlete(athlete_id, division): if Division(division).add_athlete(athlete_id): athlete = Athlete(athlete_id) return json.dumps(athlete.get()) else: return 'Incorrect gender for Division'
def parse_open(self, response): soup = bs4.BeautifulSoup(response.text) tds = soup.select('tr > td') data = [] for td in tds: str_td = str(td) athlete_match = re.search(self.ATHLETE_ID_REGEX, str_td) rank_and_score = re.search(self.RANK_AND_SCORE_REGEX, str_td) event_id = re.search(self.EVENT_ID_REGEX, str_td) if athlete_match: athlete_id = athlete_match.group("athlete_id") athlete = Athlete(athlete_id) elif self.has_rank_score_and_event(rank_and_score, event_id): event_id = event_id.group("event_id") rank = rank_and_score.group("rank") score = rank_and_score.group("score") athlete.set_event(event_id, rank, score) if self.verbose: print("Getting event " + event_id + " for " + athlete_id + "\n") if event_id == "5": data.append(athlete) return data
def add_athlete(self, athlete_id): athlete = Athlete(athlete_id).get() # if 'sex' not in athlete and (athlete['sex'] == self.division_object['sex'] or athlete['sex'] == 'None'): Division.remove_athlete_from_all_divisions(athlete_id) redisclient.sadd('%s_members' % self.division_id, athlete_id) return True
def get_coach_data(filename): try: with open(filename) as f: data = f.readline() templ = data.strip().split(',') return (Athlete(templ.pop(0), templ.pop(0), templ)) except IOError as ierr: print('file error:' + str(ioerr)) return None
def get_coach_data(filename): try: with open(filename) as player_score: data = player_score.readline().strip().split(',') result = Athlete(data.pop(0), data.pop(0), data) return (result) except IOError as err: print('IOErroe: ' + str(err)) return (None)
def __init__(self, filename=None, data_path=None): # Based in Django's approach -> http://code.djangoproject.com/svn/django/trunk/django/__init__.py self.version = __import__('pytrainer').get_version() #Process command line options self.startup_options = self.get_options() #Setup logging self.environment = Environment(platform.get_platform(), self.startup_options.conf_dir) self.environment.create_directories() self.set_logging(self.startup_options.log_level, self.startup_options.log_type) logging.debug('>>') logging.debug("pytrainer version %s" % (self.version)) self.data_path = data_path self.date = Date() self.ddbb = None # Checking profile logging.debug('Checking configuration and profile...') self.profile = Profile(self.environment, self.data_path, self) self.uc = UC() self.windowmain = None self.ddbb = DDBB(self.profile, self) logging.debug('connecting to DDBB') self.ddbb.connect() initialize_data(self.ddbb, self.environment.conf_dir) self._sport_service = SportService(self.ddbb) self.record = Record(self._sport_service, data_path, self) self.athlete = Athlete(data_path, self) self.stats = Stats(self._sport_service, self) pool_size = self.profile.getIntValue("pytraining", "activitypool_size", default=1) self.activitypool = ActivityPool(self, size=pool_size) #preparamos la ventana principal self.windowmain = Main(self._sport_service, data_path, self, self.version, gpxDir=self.profile.gpxdir) self.date = Date(self.windowmain.calendar) self.waypoint = Waypoint(data_path, self) self.extension = Extension(data_path, self) self.plugins = Plugins(data_path, self) self.importdata = Importdata(self._sport_service, data_path, self, self.profile) self.loadPlugins() self.loadExtensions() self.windowmain.setup() self.windowmain.on_calendar_selected(None) self.refreshMainSportList() self.windowmain.run() logging.debug('<<')
def get_coach_data(filename): """ 将指定文件去除不需要的空白符并返回列表。 参数"filename“,将要转换为列表的文件路径。 """ try: with open(filename) as fl: data = fl.readline().strip().split(',') return Athlete(data.pop(0), data.pop(0), data) except IOError as err: print('File Error\n\t' + str(err)) return None
def test_Athlete_whenCalledWithAthleteIdInRedis_returnsAthleteRecordFromRedis( self): with mock.patch('webrequest.getjsonfromurl') as mock_geturl: self.setupTestData() mock_geturl.return_value = self.test_data['members'][1338208] athlete = Athlete('1338208').get() mock_geturl.assert_not_called() self.assertEqual(athlete['firstname'], 'Brett') self.assertEqual(athlete['lastname'], 'J ARCC') self.assertEqual(athlete['sex'], 'M')
def get_all(get_athletes=False): divisions = {} division_list = Division.get_list() for division_id in division_list: division = Division(division_id).get() if get_athletes: for member in division['members']: division['members'][member] = Athlete(member).get() divisions[division_id] = division return divisions
def token_exchange(): code = request.args.get('code') client_id = redisclient.hget('api', 'client_id') client_secret = redisclient.hget('api', 'client_token') exch_uri = 'https://www.strava.com/oauth/token' data = urlencode({ 'client_id': client_id, 'client_secret': client_secret, 'code': code }).encode() with closing(urlopen(exch_uri, data)) as response: user_profile = json.loads(response.read().decode()) athlete = Athlete(user_profile['athlete']['id']).get() return render_template('connected.html', athlete=athlete)
def __init__(self, filename=None, data_path=None): # Based on Django's approach -> http://code.djangoproject.com/svn/django/trunk/django/__init__.py self.version = __import__('pytrainer').get_version() #Process command line options self.startup_options = self.get_options() #Setup logging self.environment = Environment(self.startup_options.conf_dir, data_path) self.environment.create_directories() self.environment.clear_temp_dir() self.set_logging(self.startup_options.log_level, self.startup_options.log_type) logging.debug('>>') logging.info("pytrainer version %s" % (self.version)) self.data_path = data_path # Checking profile logging.debug('Checking configuration and profile...') self.profile = Profile() # Write the default config to disk self.profile.saveProfile() self.uc = UC() self.profilewindow = None self.ddbb = DDBB(self.profile.sqlalchemy_url) logging.debug('connecting to DDBB') self.ddbb.connect() logging.info('Checking if some upgrade action is needed...') initialize_data(self.ddbb, self.environment.conf_dir) # Loading shared services logging.debug('Loading sport service...') self._sport_service = SportService(self.ddbb) logging.debug('Loading record service...') self.record = Record(self._sport_service, data_path, self) logging.debug('Loading athlete service...') self.athlete = Athlete(data_path, self) logging.debug('Loading stats service...') self.stats = Stats(self) logging.debug('Initializing activity pool...') pool_size = self.profile.getIntValue("pytraining", "activitypool_size", default=1) self.activitypool = ActivityService(self, size=pool_size) #Loading main window self.windowmain = None logging.debug('Loading main window...') self.windowmain = Main(self._sport_service, data_path, self, self.version, gpxDir=self.profile.gpxdir) # Select initial date depending on user's preference self.selectInitialDate() logging.debug('Loading waypoint service...') self.waypoint = WaypointService(data_path, self) logging.debug('Loading extension service...') self.extension = Extension(data_path, self) logging.debug('Loading plugins service...') self.plugins = Plugins(data_path, self) self.importdata = Importdata(self._sport_service, data_path, self, self.profile) logging.debug('Loading plugins...') self.loadPlugins() logging.debug('Loading extensions...') self.loadExtensions() logging.debug('Setting values for graphs, maps and waypoint editor...') self.windowmain.setup() self.windowmain.on_calendar_selected(None) logging.debug('Refreshing sport list... is this needed?') self.refreshMainSportList() logging.debug('Launching main window...') self.windowmain.run() logging.debug('<<')
try: with open(filename) as fl: data = fl.readline().strip().split(',') return Athlete(data.pop(0), data.pop(0), data) except IOError as err: print('File Error\n\t' + str(err)) return None james = get_coach_data('.//chapter6//james2.txt') julie = get_coach_data('.//chapter6//julie2.txt') mikey = get_coach_data('.//chapter6//mikey2.txt') sarah = get_coach_data('.//chapter6//sarah2.txt') print(james.name + "'s fastest times are: " + str(james.top3())) print(julie.name + "'s fastest times are: " + str(julie.top3())) print(mikey.name + "'s fastest times are: " + str(mikey.top3())) print(sarah.name + "'s fastest times are: " + str(sarah.top3())) # print(james.times) # james.add_time('0:3') # print(james.name + "'s fastest times are: " + str(james.top3())) # print(james.times) # james.add_times(['3.2', '1:2', '0-1']) # print(james.name + "'s fastest times are: " + str(james.top3())) # print(james.times) vera = Athlete('Vera Vi') vera.append('1.31') print(vera.top3()) vera.extend(['2.22', '1-21', '2:22']) print(vera.top3())
def compile_league(self, league_name, effort_list): members = redisclient.smembers(league_name + '_members') times = [] efforts = {} # Compile dict of best efforts for each athlete in this league for effort in effort_list: athlete_id = effort['athlete']['id'] if str(athlete_id) in members: if athlete_id in efforts: if effort['elapsed_time'] >= efforts[athlete_id][ 'elapsed_time']: continue efforts[athlete_id] = effort # Enrich with athlete details, and collect list of times for ranking for athlete_id, effort in efforts.items(): athlete = Athlete(athlete_id).get() for k, v in athlete.items(): effort['athlete'][k] = v corrected_time = effort['elapsed_time'] neutralised_times = [] for key, value in effort['neutralised'].items(): corrected_time = corrected_time - value neutralised_times.append(str(value)) effort['neutralised_times_formatted'] = ', '.join( neutralised_times) minutes = int(effort['elapsed_time'] / 60) seconds = effort['elapsed_time'] % 60 effort['elapsed_time_formatted'] = "%d.%02d" % (minutes, seconds) minutes = corrected_time / 60 seconds = corrected_time % 60 effort['corrected_time'] = corrected_time effort['corrected_time_formatted'] = "%d.%02d" % (minutes, seconds) start_time_formatted = datetime.strptime( effort['start_date_local'], "%Y-%m-%dT%H:%M:%SZ") effort['start_time_formatted'] = start_time_formatted.strftime( '%a %d/%m, %H:%M') times.append(corrected_time) times = list(set(times)) times.sort() rank = 1 # Assign a rank to each effort for time in times: joint = 0 for athlete_id, effort in efforts.items(): if effort['corrected_time'] == time: effort['rank'] = rank effort['points'] = max(11 - rank, 0) joint = joint + 1 rank = rank + max(joint, 1) # s = OrderedDict(sorted(efforts.items(), key=lambda t: t[1]['rank'])) return efforts
def createAthlete(data): athleteJson = json.loads(data) return Athlete(athleteJson.get('id'), athleteJson.get('firstName'), athleteJson.get('secondName'), athleteJson.get('age'), athleteJson.get('disc'), athleteJson.get('club'), athleteJson.get('nationality'))
def field_state_a1_first(self, athlete1_action, athlete2_action): # update the soccer field if athlete 1 goes first a1_new_position = self.get_new_coordinates(self.athlete1, athlete1_action) a2_new_position = self.get_new_coordinates(self.athlete2, athlete2_action) if a1_new_position == a2_new_position: both_new_actions_are_the_same = True else: both_new_actions_are_the_same = False # What the field would look like if athlete 1 moved first '''if the player without the ball moves into the player with the ball, attempting to steal the ball, he cannot.''' if a1_new_position != self.athlete2.coordinates: #if a1's new move is NOT where a2 is... if self.athlete1.has_possession: #AND a1 has possession... a1_state_if_a1_first = Athlete( coordinates=a1_new_position, has_possession=True, ID=1) #then a1 can move anywhere if both_new_actions_are_the_same: a2_state_if_a1_first = Athlete( coordinates=self.athlete2.coordinates, has_possession=False, ID=2 ) #a2 cannot move where a1 is because no possession else: a2_state_if_a1_first = Athlete( coordinates=a2_new_position, has_possession=False, ID=2 ) #a2 can go anywhere as long as it's not where a1 is else: #if a1 doesn't have the ball if both_new_actions_are_the_same: #and both actions are the same... a1_state_if_a1_first = Athlete(coordinates=a1_new_position, has_possession=True, ID=1) #a1 gets the ball a2_state_if_a1_first = Athlete( coordinates=self.athlete2.coordinates, has_possession=False, ID=2) #a2 loses the ball else: a1_state_if_a1_first = Athlete(coordinates=a1_new_position, has_possession=False, ID=1) a2_state_if_a1_first = Athlete(coordinates=a2_new_position, has_possession=True, ID=2) #If the player with the ball moves into the player without it, the former loses the ball to the latter else: a1_state_if_a1_first = Athlete( coordinates=self.athlete1.coordinates, has_possession=False, ID=1) a2_state_if_a1_first = Athlete( coordinates=self.athlete2.coordinates, has_possession=True, ID=2) new_soccer_field = Soccer_Field(a1_state_if_a1_first, a2_state_if_a1_first) return new_soccer_field