Skip to content

Commit

Permalink
Merge 6414397 into 3b64155
Browse files Browse the repository at this point in the history
  • Loading branch information
phoffer committed May 16, 2017
2 parents 3b64155 + 6414397 commit f28bb32
Show file tree
Hide file tree
Showing 10 changed files with 16,649 additions and 6 deletions.
1 change: 1 addition & 0 deletions lib/sportradar/api/baseball.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
require_relative 'baseball/events/warming_up'
require_relative 'baseball/pitch'
require_relative 'baseball/player'
require_relative 'baseball/lineup'
# require_relative 'baseball/broadcast'
# require_relative 'baseball/injury'
require_relative 'baseball/scoring'
Expand Down
10 changes: 6 additions & 4 deletions lib/sportradar/api/baseball/events/lineup.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ module Api
module Baseball
class Event
class Lineup < Data
attr_accessor :response, :id, :hitter_id, :outcome, :description, :player_id, :order, :position, :team_id, :last_name, :first_name, :preferred_name, :jersey_number
attr_accessor :response, :id, :hitter_id, :outcome, :description, :event, :player_id, :order, :position, :team_id, :last_name, :first_name, :preferred_name, :jersey_number

def initialize(data, **opts)
@response = data
# @response = data
@event = opts[:event]
@id = data["id"]
@player_id = data["player_id"]
@order = data["order"]
Expand All @@ -15,13 +16,14 @@ def initialize(data, **opts)
@last_name = data["last_name"]
@first_name = data["first_name"]
@preferred_name = data["preferred_name"]
@jersey_number = data["jersey_number" ]
@jersey_number = data["jersey_number"]

update(data)
end

def update(data, **opts)
@description = data['description'] if data['description']
lineup = event.half_inning.inning.game.lineup
lineup.update_from_lineup_event(data)
end

def data_key
Expand Down
7 changes: 6 additions & 1 deletion lib/sportradar/api/baseball/game.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Sportradar
module Api
module Baseball
class Game < Data
attr_accessor :response, :id, :title, :home_id, :away_id, :score, :status, :coverage, :scheduled, :venue, :broadcast, :duration, :attendance, :team_stats, :player_stats, :changes
attr_accessor :response, :id, :title, :home_id, :away_id, :score, :status, :coverage, :scheduled, :venue, :broadcast, :duration, :attendance, :team_stats, :player_stats, :changes, :lineup

attr_reader :inning, :half, :outs, :bases, :pitchers, :final, :rescheduled, :inning_over
attr_reader :outcome, :count
Expand All @@ -19,6 +19,7 @@ def initialize(data, **opts)
@team_stats = {}
@player_stats = {}
@scoring_raw = Scoring.new(data, game: self)
@lineup = Lineup.new(data, game: self)
@teams_hash = {}
@innings_hash = {}
@home_runs = nil
Expand All @@ -34,6 +35,9 @@ def initialize(data, **opts)

update(data, **opts)
end
def lineup
@lineup ||= Lineup.new({}, game: self)
end

def timeouts
{}
Expand Down Expand Up @@ -127,6 +131,7 @@ def update(data, source: nil, **opts)
update_bases(data)
parse_pitchers(data) if data['home'] && data['away']

lineup.update(data, source: source)
if data['scoring']
parse_score(data['scoring'])
elsif data.dig('home', 'hits')
Expand Down
110 changes: 110 additions & 0 deletions lib/sportradar/api/baseball/lineup.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
module Sportradar
module Api
module Baseball
class Lineup < Data
attr_reader :roster, :home, :away, :game
def initialize(data, game: nil)
@game = game
end

def update(data, source: nil)
case source
when :pbp
when :summary
@roster = (data.dig('home', 'roster') || []) + (data.dig('away', 'roster') || [])
@home_team_lineup = data.dig('home', 'lineup')
@away_team_lineup = data.dig('away', 'lineup')
initialize_home
initialize_away
end
end

def update_from_lineup_event(data)
if data.dig('lineup', 'team_id') == game.home_id
update_home(find_player(data.dig('lineup', 'player_id')), data.dig('lineup', 'order'))
elsif data.dig('lineup', 'team_id') == game.away_id
update_away(find_player(data.dig('lineup', 'player_id')), data.dig('lineup', 'order'))
end
end

def update_home(player, order)
return if order == 0
idx = home.index do |h|
h['order'] == order
end
home[idx] = { 'order' => order }
home[idx].merge!(player)
end

def update_away(player, order)
return if order == 0
idx = away.index do |h|
h['order'] == order
end
away[idx] = { 'order' => order}
away[idx].merge!(player)
end

def find_player(id)
roster.detect do |player|
player['id'] == id
end
end

def initial_lineup
[
{ 'order' => 1 },
{ 'order' => 2 },
{ 'order' => 3 },
{ 'order' => 4 },
{ 'order' => 5 },
{ 'order' => 6 },
{ 'order' => 7 },
{ 'order' => 8 },
{ 'order' => 9 },
]
end

def next_batters(team, number_of_upcoming_batters = 3)
if team == 'home'
last_at_bat = game.at_bats.select{|at_bat| at_bat.event.half_inning.half == 'B'}.last
if last_at_bat # first inning
last_position = @home_team_lineup.detect{|htl| htl['id'] == last_at_bat.hitter_id}&.dig('order')
upcoming = home.rotate(last_position || 0)
else
upcoming = home
end
elsif team == 'away'
last_at_bat = game.at_bats.select{|at_bat| at_bat.event.half_inning.half == 'T'}.last
if last_at_bat # first inning
last_position = @away_team_lineup.detect{|atl| atl['id'] == last_at_bat.hitter_id}&.dig('order')
upcoming = away.rotate(last_position || 0)
else
upcoming = away
end
end
upcoming[0..(number_of_upcoming_batters - 1)]
end

private

def initialize_away
@away = initial_lineup.dup
@away_team_lineup.sort_by{|t| t['sequence']}.each do |al|
# al.merge!(find_player(al['id']))
update_away(find_player(al['id']), al['order'])
end.sort_by{|al| al['order']}
end

def initialize_home
@home = initial_lineup.dup
@home_team_lineup.sort_by{|t| t['sequence']}.each do |hl|
# hl.merge!(find_player(hl['id']))
update_home(find_player(hl['id']), hl['order'])
end.sort_by{|hl| hl['order']}
end

end
end
end
end
2 changes: 1 addition & 1 deletion lib/sportradar/api/baseball/mlb/hierarchy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -269,4 +269,4 @@ def queue_daily_summary(date = Date.today)
res = mlb.get_schedule;
g = mlb.games.sort_by(&:scheduled).first


portradar::Api::Baseball::Mlb::Hierarchy.new
94 changes: 94 additions & 0 deletions test/sportradar/api/baseball/mlb/lineup_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
require 'test_helper'

class Sportradar::Api::Baseball::Mlb::LineupTest < Minitest::Test
describe "lineup" do
describe "American" do
let(:game) { Sportradar::Api::Baseball::Game.new('id' => "9d0fe41c-4e6b-4433-b376-2d09ed39d184") }
let(:summary) { VCR.use_cassette('lineup game summary') { game.get_summary } }
let(:pbp) { VCR.use_cassette('lineup game play by play') { game.get_pbp } }
let(:lineup_update_hash) { {"lineup"=>
{"description"=>"Robbie Ross Jr. (P) replaces Steven Wright (P).",
"id"=>"912e171b-b906-4214-a420-c1ca512a71a6",
"player_id"=>"7267e527-1ca0-4a94-b5a6-032e4769df48",
"order"=>1,
"position"=>1,
"team_id"=>"93941372-eb4c-4c40-aced-fe3267174393",
"last_name"=>"Ross Jr.",
"first_name"=>"Robert",
"preferred_name"=>"Robbie",
"jersey_number"=>"28"}} }

it "creates a lineup from a summary" do
lineup = Sportradar::Api::Baseball::Lineup.new(nil, game: game)
lineup.update(summary, source: :summary)
assert_equal lineup.home.length, 9
assert_equal lineup.away.length, 9
assert_equal 'Dustin', lineup.home.first['preferred_name']
end

it "creates a lineup from a pbp update" do
lineup = Sportradar::Api::Baseball::Lineup.new(nil, game: game)
lineup.update(summary, source: :summary)
lineup.update_from_lineup_event(lineup_update_hash)
assert_equal lineup.home.length, 9
assert_equal lineup.away.length, 9
assert_equal 'Robbie', lineup.home.first['preferred_name']
end

it "sets the next upcoming batters" do
lineup = Sportradar::Api::Baseball::Lineup.new(nil, game: game)
lineup.update(summary, source: :summary)
pbp
next_batters = lineup.next_batters('home', 3)
assert_equal next_batters.length, 3
assert_equal 'Marco', next_batters.first['preferred_name']
assert_equal 'Dustin', next_batters.second['preferred_name']
assert_equal 'Andrew', next_batters.third['preferred_name']
end
end
describe "National" do
let(:game) { Sportradar::Api::Baseball::Game.new('id' => "1977122c-6e03-4668-ac96-d2ce670f3e55") }
let(:summary) { VCR.use_cassette('lineup game national summary') { game.get_summary } }
let(:pbp) { VCR.use_cassette('lineup game national play by play') { game.get_pbp } }
let(:lineup_update_hash) { {"lineup"=> {
"description"=>"Fernando Salas (P) replaces Tommy Milone (P), batting 9th.",
"id"=>"6a962ba1-2bbb-4ec1-8f0c-1d05cb980e6a",
"player_id"=>"e878885a-8e8f-4b50-a130-15a08748e99e",
"order"=>9,
"position"=>1,
"team_id"=>"f246a5e5-afdb-479c-9aaa-c68beeda7af6",
"last_name"=>"Salas",
"first_name"=>"Noel",
"preferred_name"=>"Fernando",
"jersey_number"=>"59" } } }
it "creates a lineup from a summary" do
lineup = Sportradar::Api::Baseball::Lineup.new(nil, game: game)
lineup.update(summary, source: :summary)
pbp
assert_equal lineup.home.length, 9
assert_equal lineup.away.length, 9
assert_equal lineup.home.first['preferred_name'], 'José'
end

it "creates a lineup from a pbp update" do
lineup = Sportradar::Api::Baseball::Lineup.new(nil, game: game)
lineup.update(summary, source: :summary)
lineup.update_from_lineup_event(lineup_update_hash)
assert_equal lineup.home.length, 9
assert_equal lineup.away.length, 9
assert_equal lineup.home[8]['preferred_name'], 'Fernando'
end

it "sets the next upcoming batters" do
lineup = Sportradar::Api::Baseball::Lineup.new(nil, game: game)
lineup.update(summary, source: :summary)
pbp
next_batters = lineup.next_batters('home', 3)
assert_equal next_batters.length, 3
assert_equal 'Juan', next_batters.first['preferred_name']
assert_equal 'Rafael', next_batters.second['preferred_name']
assert_equal 'José', next_batters.third['preferred_name']
end
end
end
end
Loading

0 comments on commit f28bb32

Please sign in to comment.