ahl_scraper 0.2.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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": {