ahl_scraper 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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