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,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ class Star < Resource
6
+ def id
7
+ @id ||= @raw_data[:player][:info][:id]
8
+ end
9
+
10
+ def number
11
+ @number ||= @opts[:number]
12
+ end
13
+
14
+ def first_name
15
+ @first_name ||= @raw_data[:player][:info][:firstName]
16
+ end
17
+
18
+ def last_name
19
+ @last_name ||= @raw_data[:player][:info][:lastName]
20
+ end
21
+
22
+ def team_id
23
+ @team_id ||= @raw_data[:team][:id]
24
+ end
25
+
26
+ def jersey_name
27
+ @jersey_name ||= @raw_data[:player][:info][:jerseyNumber]
28
+ end
29
+
30
+ def position
31
+ @position ||= @raw_data[:player][:info][:position]
32
+ end
33
+
34
+ def birthdate
35
+ @birthdate ||= @raw_data[:player][:info][:birthDate]
36
+ end
37
+
38
+ def goalie?
39
+ @goalie ||= @raw_data[:isGoalie]
40
+ end
41
+
42
+ def image_url
43
+ @image_url ||= @raw_data[:playerImage]
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module Games
5
+ class Team < Resource
6
+ def id
7
+ @id ||= @raw_data[:info][:id]
8
+ end
9
+
10
+ def full_name
11
+ @full_name ||= @raw_data[:info][:name]
12
+ end
13
+
14
+ def city
15
+ @city ||= @raw_data[:info][:city]
16
+ end
17
+
18
+ def name
19
+ @name ||= @raw_data[:info][:nickname] == @raw_data[:info][:city] ? parse_nickname : @raw_data[:info][:nickname]
20
+ end
21
+
22
+ def abbreviation
23
+ @abbreviation ||= @raw_data[:info][:abbreviation]
24
+ end
25
+
26
+ def logo_url
27
+ @logo_url ||= @raw_data[:info][:logo]
28
+ end
29
+
30
+ def home_team?
31
+ @home_team ||= @opts[:home_team]
32
+ end
33
+
34
+ def stats
35
+ @stats ||= {
36
+ score: score,
37
+ hits: @raw_data[:stats][:hits],
38
+ power_play_goals: @raw_data[:stats][:powerPlayGoals],
39
+ power_play_opportunities: @raw_data[:stats][:powerPlayOpportunities],
40
+ goals: @raw_data[:stats][:goalCount],
41
+ penalty_minute_count: @raw_data[:stats][:penaltyMinuteCount],
42
+ infraction_count: @raw_data[:stats][:infractionCount],
43
+ }
44
+ end
45
+
46
+ def shot_stats
47
+ @shot_stats ||= {
48
+ sog: @opts[:shots].map { |period| period[home_team? ? :home : :away] }.reduce(:+),
49
+ p1_sog: @opts[:shots].dig(0, home_team? ? :home : :away),
50
+ p2_sog: @opts[:shots].dig(1, home_team? ? :home : :away),
51
+ p3_sog: @opts[:shots].dig(2, home_team? ? :home : :away),
52
+ ot_sog: @opts[:shots][3..-1]&.map { |ot| ot[home_team? ? :home : :away].to_i },
53
+ }
54
+ end
55
+
56
+ def goal_stats
57
+ @goal_stats ||= {
58
+ goals: @opts[:goal_totals].map { |period| period[home_team? ? :home : :away] }.reduce(:+),
59
+ p1_goals: @opts[:goal_totals].dig(0, home_team? ? :home : :away),
60
+ p2_goals: @opts[:goal_totals].dig(1, home_team? ? :home : :away),
61
+ p3_goals: @opts[:goal_totals].dig(2, home_team? ? :home : :away),
62
+ ot_goals: @opts[:goal_totals][3..-1]&.map { |ot| ot[home_team? ? :home : :away].to_i },
63
+ }
64
+ end
65
+
66
+ def on_ice_stats
67
+ @on_ice_stats ||= TeamOnIceGoalsService.new(id, @opts[:goals]).call
68
+ end
69
+
70
+ def time_splits
71
+ @time_splits ||= TimeSplitsService.new(@opts[:goals], id, @opts[:current_state], @opts[:game_properties]).call
72
+ end
73
+
74
+ private
75
+
76
+ def score
77
+ @score ||= @opts[:shootout] && @opts[:winning_team_id] == id ? @raw_data[:stats][:goals] + 1 : @raw_data[:stats][:goals]
78
+ end
79
+
80
+ def parse_nickname
81
+ @raw_data[:info][:name].gsub(@raw_data[:info][:nickname], "").strip
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ class GoalieGameListItem < Resource
5
+ def initialize(raw_data)
6
+ @raw_data = raw_data
7
+ end
8
+
9
+ def game_id
10
+ @game_id ||= @raw_data[:prop][:game][:gameLink].to_i
11
+ end
12
+
13
+ def game_name
14
+ @game_name ||= @raw_data[:row][:game]
15
+ end
16
+
17
+ def date
18
+ @date ||= @raw_data[:row][:date_played]
19
+ end
20
+
21
+ def goals_against
22
+ @goals_against ||= @raw_data[:row][:goals_against].to_i
23
+ end
24
+
25
+ def shots_against
26
+ @shots_against ||= @raw_data[:row][:shots_against].to_i
27
+ end
28
+
29
+ def saves
30
+ @saves ||= @raw_data[:row][:saves].to_i
31
+ end
32
+
33
+ def goals_against_average
34
+ @goals_against_average ||= @raw_data[:row][:gaa].to_f
35
+ end
36
+
37
+ def save_percent
38
+ @save_percent ||= @raw_data[:row][:svpct].to_f
39
+ end
40
+
41
+ def minutes
42
+ @minutes ||= @raw_data[:row][:minutes]
43
+ end
44
+
45
+ def result
46
+ @result ||= set_result
47
+ end
48
+
49
+ def shutout?
50
+ @shutout ||= @raw_data[:row][:shutout] == "1"
51
+ end
52
+
53
+ private
54
+
55
+ def set_result
56
+ return "won" if @raw_data[:row][:win] == "1"
57
+
58
+ # return "so_loss" if @raw_data[:row][:so_loss] == "1"
59
+
60
+ return "ot_loss" if @raw_data[:row][:ot_loss] == "1"
61
+
62
+ return "loss" if @raw_data[:row][:loss] == "1"
63
+
64
+ return "played_but_no_result" if @raw_data[:row][:minutes] != "0:00"
65
+
66
+ "did_not_play"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ class Player < Resource
5
+ def initialize(raw_data)
6
+ @raw_data = raw_data
7
+ end
8
+
9
+ def id
10
+ @id ||= @raw_data.dig(:info, :playerId).to_i
11
+ end
12
+
13
+ def name
14
+ @name ||= "#{first_name} #{last_name}"
15
+ end
16
+
17
+ def first_name
18
+ @first_name ||= @raw_data.dig(:info, :firstName)
19
+ end
20
+
21
+ def last_name
22
+ @last_name ||= @raw_data.dig(:info, :lastName)
23
+ end
24
+
25
+ def shoots
26
+ @shoots ||= @raw_data.dig(:info, :shoots)
27
+ end
28
+
29
+ def catches
30
+ @catches ||= @raw_data.dig(:info, :catches)
31
+ end
32
+
33
+ def birthplace
34
+ @birthplace ||= @raw_data.dig(:info, :birthPlace)&.strip
35
+ end
36
+
37
+ def height
38
+ @height ||= @raw_data.dig(:info, :height_hyphenated)
39
+ end
40
+
41
+ def birthdate
42
+ @birthdate ||= valid_birthdate? ? @raw_data.dig(:info, :birthDate) : nil
43
+ end
44
+
45
+ def draft_year
46
+ @draft_year ||= valid_birthdate? ? BirthdateHelper.new(birthdate).draft_year : nil
47
+ end
48
+
49
+ def current_age
50
+ @current_age ||= valid_birthdate? ? BirthdateHelper.new(birthdate).current_age : nil
51
+ end
52
+
53
+ def jersey_number
54
+ @jersey_number ||= @raw_data.dig(:info, :jerseyNumber).to_i
55
+ end
56
+
57
+ def position
58
+ @position ||= @raw_data.dig(:info, :position)
59
+ end
60
+
61
+ def weight
62
+ @weight ||= @raw_data.dig(:info, :weight).to_i
63
+ end
64
+
65
+ private
66
+
67
+ def valid_birthdate?
68
+ @valid_birthdate ||= !@raw_data.dig(:info, :birthDate).empty? && @raw_data.dig(:info, :birthDate) != "0000-00-00"
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ class PlayoffBracket < Resource
5
+ def initialize(bracket_data)
6
+ @bracket_data = bracket_data
7
+ end
8
+
9
+ def teams
10
+ @teams ||= @bracket_data[:teams].map { |_team_id, team_data| PlayoffBrackets::Team.new(team_data) }
11
+ end
12
+
13
+ def rounds
14
+ @rounds ||= @bracket_data[:rounds].map { |round| PlayoffBrackets::Round.new(round) }
15
+ end
16
+
17
+ def logo_url
18
+ @logo_url ||= @bracket_data[:logo]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module PlayoffBrackets
5
+ class Game < Resource
6
+ def id
7
+ @id ||= @raw_data[:game_id].to_i
8
+ end
9
+
10
+ def home_team
11
+ @home_team ||= @raw_data[:home_team].to_i
12
+ end
13
+
14
+ def home_score
15
+ @home_score ||= @raw_data[:home_goal_count].to_i
16
+ end
17
+
18
+ def away_team
19
+ @away_team ||= @raw_data[:visiting_team].to_i
20
+ end
21
+
22
+ def away_score
23
+ @away_score ||= @raw_data[:visiting_goal_count].to_i
24
+ end
25
+
26
+ def status
27
+ @status ||= @raw_data[:game_status]
28
+ end
29
+
30
+ def date
31
+ @date ||= @raw_data[:date_time]
32
+ end
33
+
34
+ def if_necessary?
35
+ @if_necessary ||= @raw_data[:if_necessary] == "1"
36
+ end
37
+
38
+ def notes
39
+ @notes ||= @raw_data[:game_notes]
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module PlayoffBrackets
5
+ class Round < Resource
6
+ def id
7
+ @id ||= @raw_data[:round].to_i
8
+ end
9
+
10
+ def name
11
+ @name ||= @raw_data[:round_name]
12
+ end
13
+
14
+ def season_id
15
+ @season_id ||= @raw_data[:season_id].to_i
16
+ end
17
+
18
+ def round_type_id
19
+ @round_type_id ||= @raw_data[:round_type_id].to_i
20
+ end
21
+
22
+ def round_type_name
23
+ @round_type_name ||= @raw_data[:round_type_name]
24
+ end
25
+
26
+ def series
27
+ @series ||= @raw_data[:matchups].map { |series| Series.new(series) }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhlScraper
4
+ module PlayoffBrackets
5
+ class Series < Resource
6
+ def id
7
+ @id ||= @raw_data[:series_letter]
8
+ end
9
+
10
+ def name
11
+ @name ||= @raw_data[:series_name]
12
+ end
13
+
14
+ def logo_url
15
+ @logo_url ||= @raw_data[:series_logo]
16
+ end
17
+
18
+ def round
19
+ @round ||= @raw_data[:round].to_i
20
+ end
21
+
22
+ def active?
23
+ @active ||= @raw_data[:active] == "1"
24
+ end
25
+
26
+ def feeder_series1
27
+ @feeder_series1 ||= @raw_data[:feeder_series1]
28
+ end
29
+
30
+ def feeder_series2
31
+ @feeder_series2 ||= @raw_data[:feeder_series2]
32
+ end
33
+
34
+ def team1
35
+ @team1 ||= @raw_data[:team1].to_i
36
+ end
37
+
38
+ def team2
39
+ @team2 ||= @raw_data[:team2].to_i
40
+ end
41
+
42
+ def team1_wins
43
+ @team1_wins ||= @raw_data[:team1_wins]
44
+ end
45
+
46
+ def team2_wins
47
+ @team2_wins ||= @raw_data[:team2_wins]
48
+ end
49
+
50
+ def winning_team
51
+ @winning_team ||= @raw_data[:winner].empty? ? nil : @raw_data[:winner].to_i
52
+ end
53
+
54
+ def ties
55
+ @ties ||= @raw_data[:ties]
56
+ end
57
+
58
+ def home_team_id
59
+ @home_team_id ||= first_game[:home_team].to_i
60
+ end
61
+
62
+ def games
63
+ @games ||= @raw_data[:games].map { |game| Game.new(game) }
64
+ end
65
+
66
+ private
67
+
68
+ def first_game
69
+ @first_game ||= @raw_data[:games][0]
70
+ end
71
+ end
72
+ end
73
+ end