gameday_api 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,205 @@
1
+ require 'pitchfx_db_manager'
2
+ require 'game'
3
+ require 'date'
4
+
5
+
6
+
7
+ class DbImporter
8
+
9
+ # player
10
+
11
+ # team
12
+ # game
13
+ # atbat
14
+ # pitch
15
+ # pitch type
16
+ # game type
17
+ # umpire
18
+
19
+ def initialize(host, user, password, db_name)
20
+ @db = PitchfxDbManager.new(host, user, password, db_name)
21
+ end
22
+
23
+
24
+ def import_team_for_month(team_abbrev, year, month)
25
+ start_date = Date.new(year.to_i, month.to_i) # first day of month
26
+ end_date = (start_date >> 1)-1 # last day of month
27
+ ((start_date)..(end_date)).each do |dt|
28
+ puts year.to_s + '/' + month.to_s + '/' + dt.day
29
+ team = Team.new('det')
30
+ games = team.games_for_date(year, month, dt.day.to_s)
31
+ games.each do |game|
32
+ import_for_game(game.gid)
33
+ end
34
+ end
35
+ end
36
+
37
+
38
+ def import_for_month(year, month)
39
+ start_date = Date.new(year.to_i, month.to_i) # first day of month
40
+ end_date = (start_date >> 1)-1 # last day of month
41
+ ((start_date)..(end_date)).each do |dt|
42
+ puts dt.year.to_s + '/' + dt.month.to_s + '/' + dt.day.to_s
43
+ import_for_date(dt.year.to_s, dt.month.to_s, dt.day.to_s)
44
+ end
45
+ end
46
+
47
+
48
+ def import_for_range(year, start_month, start_day, end_month, end_day)
49
+ start_date = Date.new(year.to_i, start_month.to_i, start_day.to_i)
50
+ end_date = Date.new(year.to_i, end_month.to_i, end_day.to_i)
51
+ ((start_date)..(end_date)).each do |dt|
52
+ puts dt.year.to_s + '/' + dt.month.to_s + '/' + dt.day.to_s
53
+ import_for_date(dt.year.to_s, dt.month.to_s, dt.day.to_s)
54
+ end
55
+ end
56
+
57
+
58
+ def import_for_date(year, month, day)
59
+ games = Game.find_by_date(year, month, day)
60
+ if games && games.length > 0
61
+ games.each do |game|
62
+ import_for_game(game.gid)
63
+ end
64
+ end
65
+ end
66
+
67
+
68
+ def import_for_game(gid)
69
+ game = Game.new(gid)
70
+ visitor_id = @db.find_or_create_team(game.visiting_team)
71
+ home_id = @db.find_or_create_team(game.home_team)
72
+ import_players_for_game(gid, visitor_id, home_id)
73
+ game_id = @db.find_or_create_game(game, visitor_id, home_id)
74
+ abs = game.get_atbats
75
+ abs.each do |ab|
76
+ atbat_id = @db.find_or_create_atbat(ab, game_id)
77
+ pitches = ab.pitches
78
+ pitches.each do |pitch|
79
+ @db.find_or_create_pitch(pitch, atbat_id)
80
+ end
81
+ end
82
+ import_pitcher_lines_for_game(gid)
83
+ end
84
+
85
+
86
+ def import_players_for_game(gid, visitor_id, home_id)
87
+ players = Players.new
88
+ players.load_from_id(gid)
89
+ away = players.rosters[0]
90
+ home = players.rosters[1]
91
+ away.players.each do |player|
92
+ @db.find_or_create_player(player, visitor_id)
93
+ end
94
+ home.players.each do |player|
95
+ @db.find_or_create_player(player, home_id)
96
+ end
97
+ end
98
+
99
+
100
+ def import_pitcher_lines_for_month(year, month)
101
+ start_date = Date.new(year.to_i, month.to_i) # first day of month
102
+ end_date = (start_date >> 1)-1 # last day of month
103
+ ((start_date)..(end_date)).each do |dt|
104
+ puts dt.year.to_s + '/' + dt.month.to_s + '/' + dt.day.to_s
105
+ import_pitcher_lines_for_date(dt.year.to_s, dt.month.to_s, dt.day.to_s)
106
+ end
107
+ end
108
+
109
+
110
+ def import_pitcher_lines_for_date(year, month, day)
111
+ games = Game.find_by_date(year, month, day)
112
+ if games && games.length > 0
113
+ games.each do |game|
114
+ import_pitcher_lines_for_game(game.gid)
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+ def import_pitcher_lines_for_range(year, start_month, start_day, end_month, end_day)
121
+ start_date = Date.new(year.to_i, start_month.to_i, start_day.to_i)
122
+ end_date = Date.new(year.to_i, end_month.to_i, end_day.to_i)
123
+ ((start_date)..(end_date)).each do |dt|
124
+ puts dt.year.to_s + '/' + dt.month.to_s + '/' + dt.day.to_s
125
+ import_pitcher_lines_for_date(dt.year.to_s, dt.month.to_s, dt.day.to_s)
126
+ end
127
+ end
128
+
129
+
130
+ def import_pitcher_lines_for_game(gid)
131
+ game = Game.new(gid)
132
+ pitchers = game.get_boxscore.pitchers
133
+ pitchers.each do |h_or_a_pitchers|
134
+ h_or_a_pitchers.each do |pitcher|
135
+ @db.find_or_create_pitcher_line(pitcher, game)
136
+ end
137
+ end
138
+ end
139
+
140
+
141
+ def set_status_for_range(year, start_month, start_day, end_month, end_day)
142
+ start_date = Date.new(year.to_i, start_month.to_i, start_day.to_i)
143
+ end_date = Date.new(year.to_i, end_month.to_i, end_day.to_i)
144
+ ((start_date)..(end_date)).each do |dt|
145
+ puts dt.year.to_s + '/' + dt.month.to_s + '/' + dt.day.to_s
146
+ set_status_for_date(dt.year.to_s, dt.month.to_s, dt.day.to_s)
147
+ end
148
+ end
149
+
150
+
151
+ def set_status_for_date(year, month, day)
152
+ games = Game.find_by_date(year, month, day)
153
+ if games && games.length > 0
154
+ games.each do |game|
155
+ set_status_for_game(game.gid)
156
+ end
157
+ end
158
+ end
159
+
160
+
161
+ def set_status_for_game(gid)
162
+ game = Game.new(gid)
163
+ @db.update_status_for_game(game)
164
+ end
165
+
166
+
167
+ def import_rosters_for_range(year, start_month, start_day, end_month, end_day)
168
+ start_date = Date.new(year.to_i, start_month.to_i, start_day.to_i)
169
+ end_date = Date.new(year.to_i, end_month.to_i, end_day.to_i)
170
+ ((start_date)..(end_date)).each do |dt|
171
+ puts dt.year.to_s + '/' + dt.month.to_s + '/' + dt.day.to_s
172
+ import_rosters_for_date(dt.year.to_s, dt.month.to_s, dt.day.to_s)
173
+ end
174
+ end
175
+
176
+
177
+ def import_rosters_for_date(year, month, day)
178
+ games = Game.find_by_date(year, month, day)
179
+ if games && games.length > 0
180
+ games.each do |game|
181
+ import_rosters_for_game(game.gid)
182
+ end
183
+ end
184
+ end
185
+
186
+
187
+ def import_rosters_for_game(gid)
188
+ game = Game.new(gid)
189
+ away_id = @db.find_or_create_team(game.visiting_team)
190
+ home_id = @db.find_or_create_team(game.home_team)
191
+ players = Players.new
192
+ players.load_from_id(gid)
193
+ away = players.rosters[0]
194
+ home = players.rosters[1]
195
+ roster_ids = @db.find_or_create_rosters(gid, away_id, home_id)
196
+ away.players.each do |player|
197
+ @db.find_or_create_roster_player(player, roster_ids[0])
198
+ end
199
+ home.players.each do |player|
200
+ @db.find_or_create_roster_player(player, roster_ids[1])
201
+ end
202
+ end
203
+
204
+
205
+ end
data/lib/event.rb ADDED
@@ -0,0 +1,14 @@
1
+ class Event
2
+
3
+ attr_accessor :number, :inning, :description, :team
4
+
5
+ def load(element, home_or_away)
6
+ @xml_doc = element
7
+ @team = home_or_away
8
+ @number = element.attributes["number"]
9
+ @inning = element.attributes["inning"]
10
+ @description = element.attributes["description"]
11
+ end
12
+
13
+
14
+ end
data/lib/event_log.rb ADDED
@@ -0,0 +1,103 @@
1
+ require 'event'
2
+ require 'gameday_fetcher'
3
+
4
+
5
+ # Parses the MLB Gameday eventLog.xml file
6
+ class EventLog
7
+
8
+ attr_accessor :home_team, :away_team, :gid
9
+ attr_accessor :home_events, :away_events
10
+ attr_accessor :max_inning
11
+
12
+
13
+ # Loads the eventLog XML from the MLB gameday server and parses it using REXML
14
+ def load_from_id(gid)
15
+ @gid = gid
16
+ @xml_data = GamedayFetcher.fetch_eventlog(gid)
17
+ @xml_doc = REXML::Document.new(@xml_data)
18
+ if @xml_doc.root
19
+ set_teams
20
+ set_events
21
+ end
22
+ end
23
+
24
+
25
+ # Sets the team names for the teams involved in this game
26
+ def set_teams
27
+ @xml_doc.elements.each("game/team[@home_team='false']") do |element|
28
+ @away_team = element.attributes["name"]
29
+ end
30
+ @xml_doc.elements.each("game/team[@home_team='true']") do |element|
31
+ @home_team = element.attributes["name"]
32
+ end
33
+ end
34
+
35
+
36
+ def set_events
37
+ @home_events, @away_events = [], []
38
+ @max_inning = 0
39
+ # set away team events
40
+ @xml_doc.elements.each("game/team[@home_team='false']/event") { |element|
41
+ event = Event.new
42
+ event.load(element, 'away')
43
+ @max_inning = event.inning.to_i unless event.inning.to_i < @max_inning
44
+ @away_events.push event
45
+ }
46
+ # set home team events
47
+ @xml_doc.elements.each("game/team[@home_team='true']/event") { |element|
48
+ event = Event.new
49
+ event.load(element, 'home')
50
+ @home_events.push event
51
+ }
52
+ end
53
+
54
+
55
+ def events_by_inning(inning)
56
+ events = []
57
+ @away_events.each do |event|
58
+ if event.inning == inning
59
+ events << event
60
+ end
61
+ end
62
+ @home_events.each do |event|
63
+ if event.inning == inning
64
+ events << event
65
+ end
66
+ end
67
+ events
68
+ end
69
+
70
+
71
+ def dump
72
+ (1..@max_inning).each do |inning|
73
+ dump_inning(inning.to_s)
74
+ end
75
+ end
76
+
77
+
78
+ def dump_inning(inning)
79
+ puts 'Inning - ' + inning.to_s
80
+ events = events_by_inning(inning)
81
+ events.each do |event|
82
+ puts event.description
83
+ end
84
+ end
85
+
86
+
87
+ # NOT IMPLEMENTED YET
88
+ def dump_to_file
89
+ GamedayUtil.save_file("eventlog.html", self.to_html('eventlog.html.erb'))
90
+ end
91
+
92
+
93
+ # NOT IMPLEMENTED YET
94
+ # Converts the eventlog into a formatted HTML representation.
95
+ # Relies on the eventlog.html.erb template for describing the layout
96
+ def to_html(template_filename)
97
+ gameday_info = GamedayUtil.parse_gameday_id('gid_' + gid)
98
+ template = ERB.new File.new(File.expand_path(File.dirname(__FILE__) + "/" + template_filename)).read, nil, "%"
99
+ return template.result(binding)
100
+ end
101
+
102
+
103
+ end