ahl_scraper 0.1.1

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 (94) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +85 -0
  5. data/.ruby-version +1 -0
  6. data/.solargraph.yml +15 -0
  7. data/.travis.yml +6 -0
  8. data/.vscode/settings.json +11 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Gemfile +25 -0
  11. data/Gemfile.lock +114 -0
  12. data/LICENSE.txt +21 -0
  13. data/README.md +235 -0
  14. data/Rakefile +8 -0
  15. data/ahl_scraper.gemspec +27 -0
  16. data/bin/console +16 -0
  17. data/bin/setup +8 -0
  18. data/lib/ahl_scraper.rb +55 -0
  19. data/lib/ahl_scraper/fetchers/division_data_fetcher.rb +19 -0
  20. data/lib/ahl_scraper/fetchers/game_data_fetcher.rb +29 -0
  21. data/lib/ahl_scraper/fetchers/game_event_data_fetcher.rb +19 -0
  22. data/lib/ahl_scraper/fetchers/player_data_fetcher.rb +25 -0
  23. data/lib/ahl_scraper/fetchers/player_games/data_fetcher.rb +30 -0
  24. data/lib/ahl_scraper/fetchers/playoff_bracket_data_fetcher.rb +19 -0
  25. data/lib/ahl_scraper/fetchers/season_data_fetcher.rb +15 -0
  26. data/lib/ahl_scraper/fetchers/season_end_date_fetcher.rb +34 -0
  27. data/lib/ahl_scraper/fetchers/season_game_ids_fetcher.rb +21 -0
  28. data/lib/ahl_scraper/fetchers/season_start_date_fetcher.rb +30 -0
  29. data/lib/ahl_scraper/fetchers/season_type_fetcher.rb +33 -0
  30. data/lib/ahl_scraper/fetchers/team_data_fetcher.rb +19 -0
  31. data/lib/ahl_scraper/fetchers/team_games/data_fetcher.rb +22 -0
  32. data/lib/ahl_scraper/fetchers/team_roster_data_fetcher.rb +67 -0
  33. data/lib/ahl_scraper/fixed_games/1001050.json +2182 -0
  34. data/lib/ahl_scraper/fixed_games/1018774.json +2573 -0
  35. data/lib/ahl_scraper/fixed_games/1020527.json +2483 -0
  36. data/lib/ahl_scraper/games.rb +46 -0
  37. data/lib/ahl_scraper/games/events.rb +8 -0
  38. data/lib/ahl_scraper/helpers/birthdate_helper.rb +27 -0
  39. data/lib/ahl_scraper/helpers/elapsed_time_helper.rb +24 -0
  40. data/lib/ahl_scraper/helpers/ice_time_helper.rb +18 -0
  41. data/lib/ahl_scraper/helpers/parameterize_helper.rb +35 -0
  42. data/lib/ahl_scraper/helpers/period_time_helper.rb +25 -0
  43. data/lib/ahl_scraper/helpers/season_dates_helper.rb +14 -0
  44. data/lib/ahl_scraper/player_games.rb +19 -0
  45. data/lib/ahl_scraper/players.rb +12 -0
  46. data/lib/ahl_scraper/playoff_brackets.rb +17 -0
  47. data/lib/ahl_scraper/resource.rb +38 -0
  48. data/lib/ahl_scraper/resources/game.rb +373 -0
  49. data/lib/ahl_scraper/resources/game_list_item.rb +57 -0
  50. data/lib/ahl_scraper/resources/games/coach.rb +23 -0
  51. data/lib/ahl_scraper/resources/games/events/shot.rb +10 -0
  52. data/lib/ahl_scraper/resources/games/goal.rb +161 -0
  53. data/lib/ahl_scraper/resources/games/goalie.rb +106 -0
  54. data/lib/ahl_scraper/resources/games/info.rb +83 -0
  55. data/lib/ahl_scraper/resources/games/on_ice_skater.rb +35 -0
  56. data/lib/ahl_scraper/resources/games/overtime.rb +48 -0
  57. data/lib/ahl_scraper/resources/games/penalty.rb +101 -0
  58. data/lib/ahl_scraper/resources/games/penalty_shot.rb +82 -0
  59. data/lib/ahl_scraper/resources/games/period.rb +31 -0
  60. data/lib/ahl_scraper/resources/games/referee.rb +23 -0
  61. data/lib/ahl_scraper/resources/games/shootout_attempt.rb +61 -0
  62. data/lib/ahl_scraper/resources/games/skater.rb +94 -0
  63. data/lib/ahl_scraper/resources/games/star.rb +47 -0
  64. data/lib/ahl_scraper/resources/games/team.rb +85 -0
  65. data/lib/ahl_scraper/resources/goalie_game_list_item.rb +69 -0
  66. data/lib/ahl_scraper/resources/player.rb +71 -0
  67. data/lib/ahl_scraper/resources/playoff_bracket.rb +21 -0
  68. data/lib/ahl_scraper/resources/playoff_brackets/game.rb +43 -0
  69. data/lib/ahl_scraper/resources/playoff_brackets/round.rb +31 -0
  70. data/lib/ahl_scraper/resources/playoff_brackets/series.rb +73 -0
  71. data/lib/ahl_scraper/resources/playoff_brackets/team.rb +39 -0
  72. data/lib/ahl_scraper/resources/roster_player.rb +71 -0
  73. data/lib/ahl_scraper/resources/season.rb +93 -0
  74. data/lib/ahl_scraper/resources/season_list_item.rb +30 -0
  75. data/lib/ahl_scraper/resources/seasons/team.rb +77 -0
  76. data/lib/ahl_scraper/resources/skater_game_list_item.rb +65 -0
  77. data/lib/ahl_scraper/resources/team_game_list_item.rb +64 -0
  78. data/lib/ahl_scraper/resources/team_list_item.rb +20 -0
  79. data/lib/ahl_scraper/roster_players.rb +11 -0
  80. data/lib/ahl_scraper/seasons.rb +31 -0
  81. data/lib/ahl_scraper/services/games/create_skaters_service.rb +72 -0
  82. data/lib/ahl_scraper/services/games/on_ice_statlines_service.rb +117 -0
  83. data/lib/ahl_scraper/services/games/penalty_shot_statlines_service.rb +38 -0
  84. data/lib/ahl_scraper/services/games/penalty_shots_service.rb +30 -0
  85. data/lib/ahl_scraper/services/games/penalty_statlines_service.rb +62 -0
  86. data/lib/ahl_scraper/services/games/scoring_statlines_service.rb +115 -0
  87. data/lib/ahl_scraper/services/games/shootout_statlines_service.rb +42 -0
  88. data/lib/ahl_scraper/services/games/team_on_ice_goals_service.rb +152 -0
  89. data/lib/ahl_scraper/services/games/time_splits_service.rb +70 -0
  90. data/lib/ahl_scraper/services/seasons/teams_service.rb +20 -0
  91. data/lib/ahl_scraper/team_games.rb +17 -0
  92. data/lib/ahl_scraper/teams.rb +11 -0
  93. data/lib/ahl_scraper/version.rb +5 -0
  94. metadata +138 -0
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ class GameListItem < Resource
5
+ def initialize(raw_data)
6
+ @raw_data = raw_data
7
+ end
8
+
9
+ def id
10
+ @id ||= @raw_data[:row][:game_id].to_i
11
+ end
12
+
13
+ def home_team_city
14
+ @home_team_city ||= @raw_data[:row][:home_team_city]
15
+ end
16
+
17
+ def home_team_score
18
+ @home_team_score ||= @raw_data[:row][:home_goal_count].to_i
19
+ end
20
+
21
+ def home_team_id
22
+ @home_team_id ||= @raw_data[:prop][:home_team_city][:teamLink].to_i
23
+ end
24
+
25
+ def away_team_city
26
+ @away_team_city ||= @raw_data[:row][:visiting_team_city]
27
+ end
28
+
29
+ def away_team_score
30
+ @away_team_score ||= @raw_data[:row][:visiting_goal_count].to_i
31
+ end
32
+
33
+ def away_team_id
34
+ @away_team_id ||= @raw_data[:prop][:visiting_team_city][:teamLink].to_i
35
+ end
36
+
37
+ def date
38
+ @date ||= @raw_data[:row][:date_with_day]
39
+ end
40
+
41
+ def status
42
+ @status ||= @raw_data[:row][:game_status]
43
+ end
44
+
45
+ def game_report_url
46
+ @game_report_url ||= @raw_data[:prop][:game_report][:link]
47
+ end
48
+
49
+ def game_sheet_url
50
+ @game_sheet_url ||= @raw_data[:prop][:game_sheet][:link]
51
+ end
52
+
53
+ def game_center_url
54
+ @game_center_url ||= "https://theahl.com/stats/game-center/#{id}"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ class Coach < Resource
6
+ def first_name
7
+ @first_name ||= @raw_data[:firstName]
8
+ end
9
+
10
+ def last_name
11
+ @last_name ||= @raw_data[:lastName]
12
+ end
13
+
14
+ def position
15
+ @position ||= @raw_data[:role]
16
+ end
17
+
18
+ def team_id
19
+ @team_id ||= @opts[:team_id]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ module Events
6
+ class Shot < Resource
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ class Goal < Resource
6
+ def id
7
+ @id ||= @raw_data[:game_goal_id]
8
+ end
9
+
10
+ def number
11
+ @number ||= @opts[:number]
12
+ end
13
+
14
+ def period
15
+ @period ||= @raw_data[:period][:id].to_i
16
+ end
17
+
18
+ def time
19
+ @time ||= @raw_data[:time]
20
+ end
21
+
22
+ def period_time_in_seconds
23
+ @period_time_in_seconds ||= period_time.to_sec
24
+ end
25
+
26
+ def game_time_elapsed
27
+ @game_time_elapsed ||= period_time.to_elapsed
28
+ end
29
+
30
+ def scorer_goal_number
31
+ @scorer_goal_number ||= @raw_data[:scorerGoalNumber]
32
+ end
33
+
34
+ def scored_by
35
+ @scored_by ||= {
36
+ id: @raw_data[:scoredBy][:id],
37
+ first_name: @raw_data[:scoredBy][:firstName],
38
+ last_name: @raw_data[:scoredBy][:lastName],
39
+ number: @raw_data[:scoredBy][:jerseyNumber],
40
+ position: @raw_data[:scoredBy][:position],
41
+ }
42
+ end
43
+
44
+ def assists
45
+ @assists ||= @raw_data[:assists].map do |assist|
46
+ {
47
+ id: assist[:id],
48
+ first_name: assist[:firstName],
49
+ last_name: assist[:lastName],
50
+ number: assist[:jerseyNumber],
51
+ position: assist[:position],
52
+ }
53
+ end
54
+ end
55
+
56
+ def assist_numbers
57
+ @assist_numbers ||= @raw_data[:assistNumbers]
58
+ end
59
+
60
+ def scoring_team
61
+ @scoring_team ||= @raw_data[:team]
62
+ end
63
+
64
+ def power_play?
65
+ @power_play ||= @raw_data[:properties][:isPowerPlay] == "1"
66
+ end
67
+
68
+ def short_handed?
69
+ @short_handed ||= @raw_data[:properties][:isShortHanded] == "1"
70
+ end
71
+
72
+ def empty_net?
73
+ @empty_net ||= @raw_data[:properties][:isEmptyNet] == "1"
74
+ end
75
+
76
+ def extra_skater?
77
+ @extra_skater ||= set_extra_skater
78
+ end
79
+
80
+ def penalty_shot?
81
+ @penalty_shot ||= @raw_data[:properties][:isPenaltyShot] == "1"
82
+ end
83
+
84
+ def insurance_goal?
85
+ @insurance_goal ||= @raw_data[:properties][:isInsuranceGoal] == "1"
86
+ end
87
+
88
+ def game_winner?
89
+ @game_winner ||= @raw_data[:properties][:isGameWinningGoal] == "1"
90
+ end
91
+
92
+ def plus_players
93
+ @plus_players ||= @raw_data[:plus_players].map { |player| OnIceSkater.new(player, { scoring_team: true, goal_id: id }) }
94
+ end
95
+
96
+ def minus_players
97
+ @minus_players ||= @raw_data[:minus_players].map { |player| OnIceSkater.new(player, { scoring_team: false, goal_id: id }) }
98
+ end
99
+
100
+ def situation
101
+ @situation ||=
102
+ if @raw_data[:properties][:isPowerPlay] == "1"
103
+ "PP"
104
+ elsif @raw_data[:properties][:isShortHanded] == "1"
105
+ "SH"
106
+ elsif @raw_data[:properties][:isEmptyNet] == "1"
107
+ "EN"
108
+ elsif extra_skater? == true
109
+ "EX"
110
+ elsif @raw_data[:properties][:isPenaltyShot] == "1"
111
+ "PS"
112
+ else
113
+ "EV"
114
+ end
115
+ end
116
+
117
+ def description
118
+ @description ||=
119
+ if assists.nil? || assists.empty?
120
+ goalscorer_name
121
+ elsif assists.length == 1
122
+ "#{goalscorer_name} (#{a1_name})"
123
+ else
124
+ "#{goalscorer_name} (#{a1_name}, #{a2_name})"
125
+ end
126
+ end
127
+
128
+ def special_teams?
129
+ @special_teams ||= short_handed? || power_play?
130
+ end
131
+
132
+ private
133
+
134
+ def set_extra_skater
135
+ return true if plus_players.length > minus_players.length && !special_teams? && !penalty_shot?
136
+
137
+ return true if plus_players.length == minus_players.length && short_handed?
138
+
139
+ return true if plus_players.length == 6
140
+
141
+ false
142
+ end
143
+
144
+ def goalscorer_name
145
+ @goalscorer_name ||= "#{scored_by[:first_name]} #{scored_by[:last_name]}"
146
+ end
147
+
148
+ def a1_name
149
+ @a1_name ||= "#{assists.dig(0, :first_name)} #{assists.dig(0, :last_name)}"
150
+ end
151
+
152
+ def a2_name
153
+ @a2_name ||= "#{assists.dig(1, :first_name)} #{assists.dig(1, :last_name)}"
154
+ end
155
+
156
+ def period_time
157
+ @period_time ||= PeriodTimeHelper.new(time, period)
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ class Goalie < Resource
6
+ def id
7
+ @id ||= @raw_data[:info][:id]
8
+ end
9
+
10
+ def first_name
11
+ @first_name ||= @raw_data[:info][:firstName]
12
+ end
13
+
14
+ def last_name
15
+ @last_name ||= @raw_data[:info][:lastName]
16
+ end
17
+
18
+ def jersey_number
19
+ @jersey_number ||= @raw_data[:info][:jerseyNumber]
20
+ end
21
+
22
+ def team_id
23
+ @team_id ||= @opts[:team_id]
24
+ end
25
+
26
+ def home_team
27
+ @home_team ||= @opts[:home_team]
28
+ end
29
+
30
+ def position
31
+ @position ||= @raw_data[:info][:position]
32
+ end
33
+
34
+ def birthdate
35
+ @birthdate ||= valid_birthdate? ? @raw_data[:info][:birthDate] : nil
36
+ end
37
+
38
+ def current_age
39
+ @current_age ||= valid_birthdate? ? BirthdateHelper.new(birthdate).age_on_date(@opts[:game_date]) : nil
40
+ end
41
+
42
+ def stats
43
+ @stats ||= {
44
+ goals: @raw_data[:stats][:goals],
45
+ assists: @raw_data[:stats][:assists],
46
+ points: @raw_data[:stats][:points],
47
+ penalty_minutes: @raw_data[:stats][:penaltyMinute],
48
+ toi: @raw_data[:stats][:timeOnIce],
49
+ toi_in_seconds: set_time_on_ice_in_seconds,
50
+ shots_against: @raw_data[:stats][:shotsAgainst],
51
+ goals_against: @raw_data[:stats][:goalsAgainst],
52
+ saves: @raw_data[:stats][:saves],
53
+ save_percent: @raw_data[:stats][:shotsAgainst].positive? ? set_save_percent : nil,
54
+ }
55
+ end
56
+
57
+ def starting
58
+ @starting ||= @raw_data[:starting]
59
+ end
60
+
61
+ def status
62
+ @status ||= @raw_data[:status]
63
+ end
64
+
65
+ def captaincy
66
+ nil
67
+ end
68
+
69
+ def shootout
70
+ @shootout ||= {
71
+ attempts_against: shootout_data.size,
72
+ goals_against: shootout_data.filter { |attempt| attempt[:isGoal] == true }.size,
73
+ }
74
+ end
75
+
76
+ def penalty_shots
77
+ @penalty_shots ||= {
78
+ attempts_against: penalty_shot_data.size,
79
+ goals_against: penalty_shot_data.filter { |attempt| attempt[:isGoal] == true }.size,
80
+ }
81
+ end
82
+
83
+ private
84
+
85
+ def set_save_percent
86
+ BigDecimal(@raw_data[:stats][:shotsAgainst] - @raw_data[:stats][:goalsAgainst]) / @raw_data[:stats][:shotsAgainst] * 100
87
+ end
88
+
89
+ def set_time_on_ice_in_seconds
90
+ @raw_data[:stats][:timeOnIce].nil? ? nil : IceTimeHelper.new(@raw_data[:stats][:timeOnIce]).to_sec
91
+ end
92
+
93
+ def shootout_data
94
+ @shootout_data ||= (@opts[:shootout_data] || []).filter { |so| so[:goalie][:id] == id }
95
+ end
96
+
97
+ def penalty_shot_data
98
+ @penalty_shot_data ||= (@opts[:penalty_shot_data] || []).filter { |so| so[:goalie][:id] == id }
99
+ end
100
+
101
+ def valid_birthdate?
102
+ @valid_birthdate ||= !@raw_data.dig(:info, :birthDate).empty? && @raw_data.dig(:info, :birthDate) != "0000-00-00"
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ class Info < Resource
6
+ def id
7
+ @id ||= @raw_data[:id]
8
+ end
9
+
10
+ def name
11
+ @name ||= @opts[:name]
12
+ end
13
+
14
+ def date
15
+ @date ||= @raw_data[:date]
16
+ end
17
+
18
+ def game_number
19
+ @game_number ||= @raw_data[:gameNumber].to_i
20
+ end
21
+
22
+ def venue
23
+ @venue ||= @raw_data[:venue]
24
+ end
25
+
26
+ def attendance
27
+ @attendance ||= @raw_data[:attendance].to_i
28
+ end
29
+
30
+ def start_time
31
+ @start_time ||= @raw_data[:startTime]
32
+ end
33
+
34
+ def end_time
35
+ @end_time ||= @raw_data[:endTime]
36
+ end
37
+
38
+ def duration
39
+ @duration ||= @raw_data[:duration]
40
+ end
41
+
42
+ def game_report_url
43
+ @game_report_url ||= @raw_data[:gameReportUrl]
44
+ end
45
+
46
+ def text_boxscore_url
47
+ @text_boxscore_url ||= @raw_data[:textBoxscoreUrl]
48
+ end
49
+
50
+ def tickets_url
51
+ @tickets_url ||= @raw_data[:ticketsUrl]
52
+ end
53
+
54
+ def started
55
+ @started ||= @raw_data[:started] == "1"
56
+ end
57
+
58
+ def final
59
+ @final ||= @raw_data[:final] == "1"
60
+ end
61
+
62
+ def public_notes
63
+ @public_notes ||= @raw_data[:publicNotes]
64
+ end
65
+
66
+ def status
67
+ @status ||= @raw_data[:status]
68
+ end
69
+
70
+ def season_id
71
+ @season_id ||= @raw_data[:seasonId].to_i
72
+ end
73
+
74
+ def htv_game_id
75
+ @htv_game_id ||= @raw_data[:htvGameId]
76
+ end
77
+
78
+ def datetime
79
+ @datetime ||= @raw_data[:GameDateISO8601]
80
+ end
81
+ end
82
+ end
83
+ end