ahl_scraper 0.2.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +70 -0
  4. data/Gemfile +0 -19
  5. data/Gemfile.lock +46 -41
  6. data/ahl_scraper.gemspec +15 -1
  7. data/lib/ahl_scraper/fetchers/game_data_fetcher.rb +1 -1
  8. data/lib/ahl_scraper/fetchers/player_data_fetcher.rb +1 -1
  9. data/lib/ahl_scraper/fetchers/player_games/data_fetcher.rb +1 -1
  10. data/lib/ahl_scraper/fetchers/scoreboards/data_fetcher.rb +37 -0
  11. data/lib/ahl_scraper/fetchers/season_type_fetcher.rb +1 -2
  12. data/lib/ahl_scraper/fixed_games/1001050.json +18 -18
  13. data/lib/ahl_scraper/fixed_games/1003351.json +2728 -0
  14. data/lib/ahl_scraper/fixed_games/1018774.json +4 -4
  15. data/lib/ahl_scraper/fixed_games/1020527.json +8 -8
  16. data/lib/ahl_scraper/helpers/ice_time_helper.rb +3 -1
  17. data/lib/ahl_scraper/helpers/period_time_helper.rb +6 -2
  18. data/lib/ahl_scraper/resources/game.rb +7 -5
  19. data/lib/ahl_scraper/resources/game_list_item.rb +13 -13
  20. data/lib/ahl_scraper/resources/games/goalie.rb +1 -1
  21. data/lib/ahl_scraper/resources/games/info.rb +1 -1
  22. data/lib/ahl_scraper/resources/games/penalty.rb +2 -2
  23. data/lib/ahl_scraper/resources/games/penalty_shot.rb +0 -5
  24. data/lib/ahl_scraper/resources/games/team.rb +2 -2
  25. data/lib/ahl_scraper/resources/goalie_game_list_item.rb +2 -1
  26. data/lib/ahl_scraper/resources/player.rb +2 -2
  27. data/lib/ahl_scraper/resources/playoff_bracket.rb +5 -5
  28. data/lib/ahl_scraper/resources/playoff_brackets/round.rb +1 -1
  29. data/lib/ahl_scraper/resources/playoff_brackets/series.rb +60 -20
  30. data/lib/ahl_scraper/resources/roster_player.rb +1 -1
  31. data/lib/ahl_scraper/resources/scoreboard.rb +147 -0
  32. data/lib/ahl_scraper/resources/scoreboards/team.rb +67 -0
  33. data/lib/ahl_scraper/resources/season.rb +13 -8
  34. data/lib/ahl_scraper/resources/season_list_item.rb +2 -2
  35. data/lib/ahl_scraper/resources/seasons/team.rb +6 -5
  36. data/lib/ahl_scraper/resources/skater_game_list_item.rb +2 -2
  37. data/lib/ahl_scraper/resources/team_game_list_item.rb +2 -3
  38. data/lib/ahl_scraper/resources/team_list_item.rb +1 -1
  39. data/lib/ahl_scraper/scoreboards.rb +15 -0
  40. data/lib/ahl_scraper/services/games/create_skaters_service.rb +1 -1
  41. data/lib/ahl_scraper/services/games/on_ice_statlines_service.rb +1 -1
  42. data/lib/ahl_scraper/services/games/penalty_shots_service.rb +1 -6
  43. data/lib/ahl_scraper/services/games/scoring_statlines_service.rb +29 -25
  44. data/lib/ahl_scraper/services/games/team_on_ice_goals_service.rb +1 -1
  45. data/lib/ahl_scraper/team_games.rb +3 -1
  46. data/lib/ahl_scraper/version.rb +1 -1
  47. data/lib/ahl_scraper.rb +2 -0
  48. metadata +178 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 878af541d3e623e6e74955e4edb4fcb713b1ea05b6c536eac092508fce031914
4
- data.tar.gz: bf55cecdad52ef86b8a133ae920cbd1c40d0fd95beffe75a804f03e3163091bc
3
+ metadata.gz: 8fc138bb02a9563b2b9a4940a15dd9bd6e56f56d5b7352bddbb09fb2a63a7c0d
4
+ data.tar.gz: 4292c6ed3cd9c4da7f92aa6b861fa2d40a7cc1c933962c8c55610e34819317f0
5
5
  SHA512:
6
- metadata.gz: 7d0270faf84de38e464e30aebc1e8db595f2310b3bf2a950573c538acee01cf766b3e06b4293f3aacfe2db1177a4f08164bc610a13a6e4406ca3dac3351f69fa
7
- data.tar.gz: e603bcb1f39ff49d68968a325aaa044d8287d9e0b40c1c72d9e61d79033d83d2cc03ca31717e28096516f9b05700922042a3679342a64b59c71ad9cdda5b6e24
6
+ metadata.gz: cc5998864a75a5a351c2f42eb97066340e681024af5da5d766077dc80d581a5c767340aa9b5125d06da1e40cd615e1c7805d86a831b28f5174d3632dd6d6f14f
7
+ data.tar.gz: 8cb1e8fa0b79e50bacf1b4755120f3e41382b8f1b0fb542352af6ea744e62719b2c0b9cb821631c3efa3ffdef1491828742a519023b7eb9d300689f947a526ec
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.7.2
1
+ ruby-2.7.3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,75 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.3.2
4
+
5
+ ## General
6
+
7
+ - Changed `.split` to `&.split` and use `.dig` more to not fail when fields don't exist (often on games that have not finished)
8
+
9
+ ### Game::Goalie
10
+
11
+ - Fix penalty minutes not being copied to the object because of a typo
12
+
13
+ ## 0.3.1
14
+
15
+ ### Scoreboards
16
+
17
+ - Add new module for getting the scores seen at the top of the AHL website
18
+ - Retrieve Scoreboards based on a passed in date range
19
+
20
+ ### Game
21
+
22
+ - Add postponed status to possible game statuses
23
+
24
+ ## 0.3.0
25
+
26
+ ### General
27
+
28
+ - Upgrade project Ruby version to `2.7.3`
29
+ - Update gem minimum version to `2.7.0`
30
+ - Use JSON override for game `1003351` where goalie boxscore stats don't match goal records (see wiki)
31
+ - Use term `handedness` for players
32
+ - Added penalty ids to JSON override games
33
+
34
+ ### GameInfo
35
+
36
+ - If game has not started set status to reflect that and include start time
37
+
38
+ ### Game
39
+
40
+ - Current time will check for whether a game has started so that games that haven't been played yet will return nil
41
+
42
+ ### GameListItem
43
+
44
+ - Use `dig` to be less error prone
45
+ - Set status to `Not Started` if game status still shows start time
46
+
47
+ ### Games::Penalty
48
+
49
+ - Add `id` field
50
+ - Add `bench?` attribute for when bench minor penalty
51
+ - Add `:penalty_shot` penalty type
52
+
53
+ ### PlayoffBracket
54
+
55
+ - Hardcode wins needed for series to allow for accurate series statuses
56
+ - Revamp `active?` logic to work even for finals (which remained set to active by AHL)
57
+ - Stick with `home` and `away` teams instead of `team1` and `team2` for:
58
+ - `feeder_series1` to `home_feeder_series`
59
+ - `feeder_series2` to `away_feeder_series`
60
+ - `team1` to `home_team_id`
61
+ - `team2` to `away_team_id`
62
+ - Change `winning_team` to `winning_team_id`
63
+ - Add `wins_needed` attribute
64
+
65
+ ### Game::Skater
66
+
67
+ - Use `p1_` for primary point short form instead of full words for `scoring_statline`
68
+
69
+ ### Season
70
+
71
+ - Add `preseason` season type with appropriate abbreviations
72
+
3
73
  ## 0.2.0
4
74
 
5
75
  ### RosterPlayers
data/Gemfile CHANGED
@@ -4,22 +4,3 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in ahl_scraper.gemspec
6
6
  gemspec
7
-
8
- gem "json"
9
- gem "nokogiri"
10
- gem "rake", "~> 12.0"
11
-
12
- group :development do
13
- gem "rubocop", "~> 0.89.0", require: false
14
- gem "rubocop-performance", "~> 1.8.1", require: false
15
- gem "solargraph"
16
- end
17
-
18
- group :development, :test do
19
- gem "byebug"
20
- gem "pry"
21
- gem "pry-byebug"
22
- gem "rspec", "~> 3.0"
23
- gem "vcr"
24
- gem "webmock", ">= 3.8.0"
25
- end
data/Gemfile.lock CHANGED
@@ -1,31 +1,37 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ahl_scraper (0.2.0)
4
+ ahl_scraper (0.3.1)
5
+ json (~> 2.5.1)
6
+ nokogiri (~> 1.12.4)
7
+ rake (~> 13.0.0)
5
8
 
6
9
  GEM
7
10
  remote: https://rubygems.org/
8
11
  specs:
9
- addressable (2.7.0)
12
+ addressable (2.8.0)
10
13
  public_suffix (>= 2.0.2, < 5.0)
11
- ast (2.4.1)
12
- backport (1.1.2)
13
- benchmark (0.1.0)
14
+ ast (2.4.2)
15
+ backport (1.2.0)
16
+ benchmark (0.1.1)
14
17
  byebug (11.1.3)
15
18
  coderay (1.1.3)
16
- crack (0.4.4)
19
+ crack (0.4.5)
20
+ rexml
17
21
  diff-lcs (1.4.4)
18
22
  e2mmap (0.1.0)
19
23
  hashdiff (1.0.1)
20
24
  jaro_winkler (1.5.4)
21
- json (2.3.1)
22
- maruku (0.7.3)
25
+ json (2.5.1)
26
+ kramdown (2.3.1)
27
+ rexml
28
+ kramdown-parser-gfm (1.1.0)
29
+ kramdown (~> 2.0)
23
30
  method_source (1.0.0)
24
- mini_portile2 (2.4.0)
25
- nokogiri (1.10.10)
26
- mini_portile2 (~> 2.4.0)
27
- parallel (1.20.1)
28
- parser (2.7.2.0)
31
+ nokogiri (1.12.5-x86_64-darwin)
32
+ racc (~> 1.4)
33
+ parallel (1.21.0)
34
+ parser (3.0.2.0)
29
35
  ast (~> 2.4.1)
30
36
  pry (0.13.1)
31
37
  coderay (~> 1.1)
@@ -34,25 +40,26 @@ GEM
34
40
  byebug (~> 11.0)
35
41
  pry (~> 0.13.0)
36
42
  public_suffix (4.0.6)
43
+ racc (1.5.2)
37
44
  rainbow (3.0.0)
38
- rake (12.3.3)
39
- regexp_parser (2.0.0)
45
+ rake (13.0.6)
46
+ regexp_parser (2.1.1)
40
47
  reverse_markdown (2.0.0)
41
48
  nokogiri
42
- rexml (3.2.4)
49
+ rexml (3.2.5)
43
50
  rspec (3.10.0)
44
51
  rspec-core (~> 3.10.0)
45
52
  rspec-expectations (~> 3.10.0)
46
53
  rspec-mocks (~> 3.10.0)
47
- rspec-core (3.10.0)
54
+ rspec-core (3.10.1)
48
55
  rspec-support (~> 3.10.0)
49
- rspec-expectations (3.10.0)
56
+ rspec-expectations (3.10.1)
50
57
  diff-lcs (>= 1.2.0, < 2.0)
51
58
  rspec-support (~> 3.10.0)
52
- rspec-mocks (3.10.0)
59
+ rspec-mocks (3.10.2)
53
60
  diff-lcs (>= 1.2.0, < 2.0)
54
61
  rspec-support (~> 3.10.0)
55
- rspec-support (3.10.0)
62
+ rspec-support (3.10.2)
56
63
  rubocop (0.89.1)
57
64
  parallel (~> 1.10)
58
65
  parser (>= 2.7.1.1)
@@ -67,47 +74,45 @@ GEM
67
74
  rubocop-performance (1.8.1)
68
75
  rubocop (>= 0.87.0)
69
76
  rubocop-ast (>= 0.4.0)
70
- ruby-progressbar (1.10.1)
71
- solargraph (0.39.17)
72
- backport (~> 1.1)
77
+ ruby-progressbar (1.11.0)
78
+ solargraph (0.43.3)
79
+ backport (~> 1.2)
73
80
  benchmark
74
81
  bundler (>= 1.17.2)
82
+ diff-lcs (~> 1.4)
75
83
  e2mmap
76
84
  jaro_winkler (~> 1.5)
77
- maruku (~> 0.7, >= 0.7.3)
78
- nokogiri (~> 1.9, >= 1.9.1)
79
- parser (~> 2.3)
85
+ kramdown (~> 2.3)
86
+ kramdown-parser-gfm (~> 1.1)
87
+ parser (~> 3.0)
80
88
  reverse_markdown (>= 1.0.5, < 3)
81
- rubocop (~> 0.52)
89
+ rubocop (>= 0.52)
82
90
  thor (~> 1.0)
83
91
  tilt (~> 2.0)
84
92
  yard (~> 0.9, >= 0.9.24)
85
- thor (1.0.1)
93
+ thor (1.1.0)
86
94
  tilt (2.0.10)
87
- unicode-display_width (1.7.0)
95
+ unicode-display_width (1.8.0)
88
96
  vcr (6.0.0)
89
- webmock (3.10.0)
90
- addressable (>= 2.3.6)
97
+ webmock (3.14.0)
98
+ addressable (>= 2.8.0)
91
99
  crack (>= 0.3.2)
92
100
  hashdiff (>= 0.4.0, < 2.0.0)
93
- yard (0.9.25)
101
+ yard (0.9.26)
94
102
 
95
103
  PLATFORMS
96
- ruby
104
+ x86_64-darwin-19
97
105
 
98
106
  DEPENDENCIES
99
107
  ahl_scraper!
100
- byebug
101
- json
102
- nokogiri
103
- pry
104
- pry-byebug
105
- rake (~> 12.0)
108
+ byebug (~> 11.1.3)
109
+ pry (~> 0.13.1)
110
+ pry-byebug (~> 3.9.0)
106
111
  rspec (~> 3.0)
107
112
  rubocop (~> 0.89.0)
108
113
  rubocop-performance (~> 1.8.1)
109
- solargraph
110
- vcr
114
+ solargraph (~> 0.43.0)
115
+ vcr (~> 6.0.0)
111
116
  webmock (>= 3.8.0)
112
117
 
113
118
  BUNDLED WITH
data/ahl_scraper.gemspec CHANGED
@@ -12,12 +12,26 @@ Gem::Specification.new do |spec|
12
12
  spec.description = "Allows users to gather game, season, and player data from the AHL website"
13
13
  spec.homepage = "http://www.ahltracker.com"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
16
16
 
17
17
  spec.metadata["homepage_uri"] = "https://github.com/notnotjeff/ahl_scraper"
18
18
  spec.metadata["source_code_uri"] = "https://github.com/notnotjeff/ahl_scraper"
19
19
  spec.metadata["changelog_uri"] = "https://github.com/notnotjeff/ahl_scraper"
20
20
 
21
+ spec.add_dependency "json", "~> 2.5.1"
22
+ spec.add_dependency "nokogiri", "~> 1.12.4"
23
+ spec.add_dependency "rake", "~> 13.0.0"
24
+
25
+ spec.add_development_dependency "byebug", "~> 11.1.3"
26
+ spec.add_development_dependency "pry", "~> 0.13.1"
27
+ spec.add_development_dependency "pry-byebug", "~> 3.9.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_development_dependency "rubocop", "~> 0.89.0"
30
+ spec.add_development_dependency "rubocop-performance", "~> 1.8.1"
31
+ spec.add_development_dependency "solargraph", "~> 0.43.0"
32
+ spec.add_development_dependency "vcr", "~> 6.0.0"
33
+ spec.add_development_dependency "webmock", ">= 3.8.0"
34
+
21
35
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
36
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
23
37
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module AhlScraper
4
4
  class GameDataFetcher
5
- BROKEN_GAMES = [1_018_774, 1_001_050, 1_020_527].freeze
5
+ BROKEN_GAMES = [1_018_774, 1_001_050, 1_020_527, 1_003_351].freeze
6
6
 
7
7
  def initialize(game_id)
8
8
  @game_id = game_id
@@ -18,7 +18,7 @@ module AhlScraper
18
18
 
19
19
  def player_data_without_bio
20
20
  data = Nokogiri::HTML(URI.parse(url).open).text[5..-2]
21
- bio = data[/\"bio"\:(.*?)\,\"teamName/m, 1]
21
+ bio = data[/"bio":(.*?),"teamName/m, 1]
22
22
  data.gsub(bio, "\"\"")
23
23
  end
24
24
  end
@@ -22,7 +22,7 @@ module AhlScraper
22
22
 
23
23
  def player_data_without_bio
24
24
  data = Nokogiri::HTML(URI.parse(url).open).text[5..-2]
25
- bio = data[/\"bio"\:(.*?)\,\"teamName/m, 1]
25
+ bio = data[/"bio":(.*?),"teamName/m, 1]
26
26
  data.gsub(bio, "\"\"")
27
27
  end
28
28
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Scoreboards
5
+ class DataFetcher
6
+ def initialize(start_date:, end_date:)
7
+ @start_date = start_date
8
+ @end_date = end_date
9
+ end
10
+
11
+ def call
12
+ JSON.parse(Nokogiri::HTML(URI.parse(url).open).text[5..-2], symbolize_names: true)&.dig(:SiteKit, :Scorebar)&.filter do |game|
13
+ game_date = Date.parse(game[:Date])
14
+ game_date >= @start_date && game_date <= @end_date
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def url
21
+ "https://lscluster.hockeytech.com/feed/index.php?feed=modulekit&key=ccb91f29d6744675&client_code=ahl&view=scorebar&numberofdaysahead=#{days_ahead}&numberofdaysback=#{days_back}&fmt=json&site_id=3&lang=en&league_id=4&division_id=undefined&callback=json" # rubocop:disable Layout/LineLength
22
+ end
23
+
24
+ def days_back
25
+ date_today > @start_date ? (date_today - @start_date).to_i : 0
26
+ end
27
+
28
+ def days_ahead
29
+ date_today < @end_date ? (@end_date - date_today).to_i : 0
30
+ end
31
+
32
+ def date_today
33
+ @date_today ||= Date.today
34
+ end
35
+ end
36
+ end
37
+ end
@@ -7,8 +7,7 @@ module AhlScraper
7
7
  end
8
8
 
9
9
  def call
10
- season = JSON.parse(Nokogiri::HTML(URI.parse(url).open).text[5..-2], symbolize_names: true)
11
- .dig(:seasons)
10
+ season = JSON.parse(Nokogiri::HTML(URI.parse(url).open).text[5..-2], symbolize_names: true)[:seasons]
12
11
  &.find { |s| s[:id].to_i == @season_id.to_i }
13
12
  return nil unless season
14
13
 
@@ -1224,7 +1224,7 @@
1224
1224
  ],
1225
1225
  "penalties": [
1226
1226
  {
1227
- "game_penalty_id": null,
1227
+ "game_penalty_id": 202,
1228
1228
  "period": { "id": "1", "shortName": "", "longName": "1st" },
1229
1229
  "time": "0:40",
1230
1230
  "againstTeam": {
@@ -1259,7 +1259,7 @@
1259
1259
  "isBench": false
1260
1260
  },
1261
1261
  {
1262
- "game_penalty_id": null,
1262
+ "game_penalty_id": 203,
1263
1263
  "period": { "id": "1", "shortName": "", "longName": "1st" },
1264
1264
  "time": "3:00",
1265
1265
  "againstTeam": {
@@ -1294,7 +1294,7 @@
1294
1294
  "isBench": false
1295
1295
  },
1296
1296
  {
1297
- "game_penalty_id": null,
1297
+ "game_penalty_id": 204,
1298
1298
  "period": { "id": "1", "shortName": "", "longName": "1st" },
1299
1299
  "time": "6:29",
1300
1300
  "againstTeam": {
@@ -1329,7 +1329,7 @@
1329
1329
  "isBench": false
1330
1330
  },
1331
1331
  {
1332
- "game_penalty_id": null,
1332
+ "game_penalty_id": 207,
1333
1333
  "period": { "id": "1", "shortName": "", "longName": "1st" },
1334
1334
  "time": "8:19",
1335
1335
  "againstTeam": {
@@ -1364,7 +1364,7 @@
1364
1364
  "isBench": false
1365
1365
  },
1366
1366
  {
1367
- "game_penalty_id": null,
1367
+ "game_penalty_id": 211,
1368
1368
  "period": { "id": "1", "shortName": "", "longName": "1st" },
1369
1369
  "time": "8:59",
1370
1370
  "againstTeam": {
@@ -1399,7 +1399,7 @@
1399
1399
  "isBench": false
1400
1400
  },
1401
1401
  {
1402
- "game_penalty_id": null,
1402
+ "game_penalty_id": 227,
1403
1403
  "period": { "id": "1", "shortName": "", "longName": "1st" },
1404
1404
  "time": "17:54",
1405
1405
  "againstTeam": {
@@ -1446,7 +1446,7 @@
1446
1446
  "goals": [],
1447
1447
  "penalties": [
1448
1448
  {
1449
- "game_penalty_id": null,
1449
+ "game_penalty_id": 243,
1450
1450
  "period": { "id": "2", "shortName": "", "longName": "2nd" },
1451
1451
  "time": "2:52",
1452
1452
  "againstTeam": {
@@ -1481,7 +1481,7 @@
1481
1481
  "isBench": false
1482
1482
  },
1483
1483
  {
1484
- "game_penalty_id": null,
1484
+ "game_penalty_id": 252,
1485
1485
  "period": { "id": "2", "shortName": "", "longName": "2nd" },
1486
1486
  "time": "5:31",
1487
1487
  "againstTeam": {
@@ -1516,7 +1516,7 @@
1516
1516
  "isBench": false
1517
1517
  },
1518
1518
  {
1519
- "game_penalty_id": null,
1519
+ "game_penalty_id": 254,
1520
1520
  "period": { "id": "2", "shortName": "", "longName": "2nd" },
1521
1521
  "time": "8:05",
1522
1522
  "againstTeam": {
@@ -1551,7 +1551,7 @@
1551
1551
  "isBench": false
1552
1552
  },
1553
1553
  {
1554
- "game_penalty_id": null,
1554
+ "game_penalty_id": 255,
1555
1555
  "period": { "id": "2", "shortName": "", "longName": "2nd" },
1556
1556
  "time": "13:02",
1557
1557
  "againstTeam": {
@@ -1586,7 +1586,7 @@
1586
1586
  "isBench": false
1587
1587
  },
1588
1588
  {
1589
- "game_penalty_id": null,
1589
+ "game_penalty_id": 260,
1590
1590
  "period": { "id": "2", "shortName": "", "longName": "2nd" },
1591
1591
  "time": "14:16",
1592
1592
  "againstTeam": {
@@ -1894,7 +1894,7 @@
1894
1894
  ],
1895
1895
  "penalties": [
1896
1896
  {
1897
- "game_penalty_id": null,
1897
+ "game_penalty_id": 261,
1898
1898
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
1899
1899
  "time": "1:32",
1900
1900
  "againstTeam": {
@@ -1929,7 +1929,7 @@
1929
1929
  "isBench": false
1930
1930
  },
1931
1931
  {
1932
- "game_penalty_id": null,
1932
+ "game_penalty_id": 278,
1933
1933
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
1934
1934
  "time": "5:51",
1935
1935
  "againstTeam": {
@@ -1964,7 +1964,7 @@
1964
1964
  "isBench": false
1965
1965
  },
1966
1966
  {
1967
- "game_penalty_id": null,
1967
+ "game_penalty_id": 281,
1968
1968
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
1969
1969
  "time": "10:22",
1970
1970
  "againstTeam": {
@@ -1999,7 +1999,7 @@
1999
1999
  "isBench": false
2000
2000
  },
2001
2001
  {
2002
- "game_penalty_id": null,
2002
+ "game_penalty_id": 332,
2003
2003
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
2004
2004
  "time": "12:05",
2005
2005
  "againstTeam": {
@@ -2034,7 +2034,7 @@
2034
2034
  "isBench": false
2035
2035
  },
2036
2036
  {
2037
- "game_penalty_id": null,
2037
+ "game_penalty_id": 340,
2038
2038
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
2039
2039
  "time": "15:53",
2040
2040
  "againstTeam": {
@@ -2069,7 +2069,7 @@
2069
2069
  "isBench": false
2070
2070
  },
2071
2071
  {
2072
- "game_penalty_id": null,
2072
+ "game_penalty_id": 355,
2073
2073
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
2074
2074
  "time": "15:53",
2075
2075
  "againstTeam": {
@@ -2104,7 +2104,7 @@
2104
2104
  "isBench": false
2105
2105
  },
2106
2106
  {
2107
- "game_penalty_id": null,
2107
+ "game_penalty_id": 363,
2108
2108
  "period": { "id": "3", "shortName": "", "longName": "3rd" },
2109
2109
  "time": "17:11",
2110
2110
  "againstTeam": {