def test_simple(self): d = {'a': 1, 'b': 2} self.assertEqual(pluck(d, ('a')), 1) self.assertEqual(pluck(d, ('b')), 2) self.assertEqual(pluck(d, ('c'), None), None) with self.assertRaises(LookupError): self.assertEqual(pluck(d, ('c')), None)
def test_deep(self): d = {'a': {'b': {'c': {'d': {'e': 1}}}}} self.assertEqual(pluck(d, ('a.b.c.d.e')), 1) with self.assertRaises(LookupError): self.assertEqual(pluck(d, ('a.b.c.d.e.f')), None) self.assertEqual(pluck(d, ('a.b.c.d')), {'e': 1}) self.assertEqual(pluck(d, ('a.b.d.d.e'), 666), 666)
def from_dict(cls, game: Mapping) -> Game: return Game( GameStatus.parse_statuscode(utils.pluck(game, 'status.statusCode')), game['gamePk'], GameType(game['gameType']), utils.pluck(game, 'teams.home.team.abbreviation', '???'), utils.pluck(game, 'teams.home.score'), utils.pluck(game, 'teams.away.team.abbreviation', '???'), utils.pluck(game, 'teams.away.score'))
def parse_games(): for date in schedule['dates']: for game in date['games']: try: statuscode = int(pluck(game, 'status.statusCode', 0)) if statuscode != 1: continue game_dt = localize( datetime.strptime(game['gameDate'], '%Y-%m-%dT%H:%M:%SZ')) if game_dt < datetime.utcnow(): continue if game_dt.hour < hmin or game_dt.hour > hmax: continue yield (game_dt, pluck(game, 'teams.home.team.name'), pluck(game, 'teams.away.team.name')) except (TypeError, KeyError) as e: pass
def filter_players(players: Mapping, nationalities: List[str], min_goals: int, min_points: int) -> Iterable[Mapping]: for player in players.values(): goalie_toi = pluck(player, 'stats.goalieStats.timeOnIce', '0:00') if goalie_toi != '0:00': toi = goalie_toi else: toi = pluck(player, 'stats.skaterStats.timeOnIce', '0:00') if toi == '0:00': continue goals = pluck(player, 'stats.skaterStats.goals', 0) assists = pluck(player, 'stats.skaterStats.assists', 0) sv = round(pluck(player, 'stats.goalieStats.savePercentage', 0), 1) value = 2 + goals * 3 + assists if sv: shots = pluck(player, 'stats.goalieStats.shots', 0) value = sv / 100 else: shots = pluck(player, 'stats.skaterStats.shots', 0) nationality = pluck(player, 'person.nationality', '?') if (goals + assists < min_points and goals < min_goals and nationality not in nationalities): continue yield { 'first_name': pluck(player, 'person.firstName', '?'), 'last_name': pluck(player, 'person.lastName', '?'), 'nationality': nationality, 'toi': toi, 'shots': shots, 'hits': pluck(player, 'stats.skaterStats.hits', 0), 'plus_minus': pluck(player, 'stats.skaterStats.plusMinus', 0), 'position': pluck(player, 'person.primaryPosition.abbreviation', '?'), 'goals': goals, 'assists': assists, 'value': value, 'sv': sv }
def _extract(boxscore, team): return list( filter_players(pluck(boxscore, f'teams.{team}.players'), nationalities, min_goals, min_points))