stattleship-ruby 0.1.19

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 (264) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +263 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +8 -0
  7. data/CODE_OF_CONDUCT.md +13 -0
  8. data/Gemfile +15 -0
  9. data/LICENSE +1 -0
  10. data/README.md +75 -0
  11. data/Rakefile +1 -0
  12. data/bin/console +7 -0
  13. data/bin/game_log_officials +32 -0
  14. data/bin/game_logs +69 -0
  15. data/bin/games +42 -0
  16. data/bin/in_progress +19 -0
  17. data/bin/injuries +18 -0
  18. data/bin/officials +42 -0
  19. data/bin/players +45 -0
  20. data/bin/scoreboard +43 -0
  21. data/bin/setup +7 -0
  22. data/bin/stat_leaders +25 -0
  23. data/bin/team_game_logs +35 -0
  24. data/bin/teams +29 -0
  25. data/bin/top_stats +25 -0
  26. data/bin/total_player_stat +33 -0
  27. data/bin/total_team_stat +22 -0
  28. data/examples/README.md +118 -0
  29. data/examples/baseball_feats.rb +35 -0
  30. data/examples/baseball_games.rb +32 -0
  31. data/examples/baseball_player_game_logs.rb +33 -0
  32. data/examples/baseball_stat_leaders.rb +30 -0
  33. data/examples/basketball_game_logs.rb +33 -0
  34. data/examples/basketball_injuries.rb +36 -0
  35. data/examples/basketball_season_player_performance_rankings.rb +31 -0
  36. data/examples/basketball_stat_leaders.rb +40 -0
  37. data/examples/basketball_team_game_logs.rb +38 -0
  38. data/examples/basketball_top_stats.rb +43 -0
  39. data/examples/basketball_winning_streaks.rb +27 -0
  40. data/examples/bears_team_game_logs.rb +46 -0
  41. data/examples/football_feats.rb +49 -0
  42. data/examples/football_game_logs.rb +40 -0
  43. data/examples/football_players.rb +43 -0
  44. data/examples/football_stats.rb +50 -0
  45. data/examples/football_total_player_stat.rb +32 -0
  46. data/examples/hockey_games.rb +56 -0
  47. data/examples/hockey_penalties.rb +47 -0
  48. data/examples/hockey_scoring_plays.rb +55 -0
  49. data/examples/hockey_team_ranked_streaks.rb +27 -0
  50. data/examples/hockey_teams.rb +54 -0
  51. data/examples/hockey_total_team_stat.rb +32 -0
  52. data/examples/sample.env +2 -0
  53. data/lib/stattleship.rb +117 -0
  54. data/lib/stattleship/baseball_feats.rb +15 -0
  55. data/lib/stattleship/baseball_game_logs.rb +159 -0
  56. data/lib/stattleship/baseball_games.rb +15 -0
  57. data/lib/stattleship/baseball_injuries.rb +15 -0
  58. data/lib/stattleship/baseball_penalties.rb +15 -0
  59. data/lib/stattleship/baseball_players.rb +15 -0
  60. data/lib/stattleship/baseball_scoring_plays.rb +15 -0
  61. data/lib/stattleship/baseball_stat_leaders.rb +15 -0
  62. data/lib/stattleship/baseball_stats.rb +15 -0
  63. data/lib/stattleship/baseball_team_game_logs.rb +142 -0
  64. data/lib/stattleship/baseball_team_outcome_streaks.rb +15 -0
  65. data/lib/stattleship/baseball_teams.rb +15 -0
  66. data/lib/stattleship/baseball_top_stats.rb +15 -0
  67. data/lib/stattleship/baseball_total_player_stat.rb +15 -0
  68. data/lib/stattleship/baseball_total_team_stat.rb +15 -0
  69. data/lib/stattleship/basketball_feats.rb +15 -0
  70. data/lib/stattleship/basketball_game_logs.rb +111 -0
  71. data/lib/stattleship/basketball_games.rb +15 -0
  72. data/lib/stattleship/basketball_injuries.rb +15 -0
  73. data/lib/stattleship/basketball_penalties.rb +15 -0
  74. data/lib/stattleship/basketball_players.rb +15 -0
  75. data/lib/stattleship/basketball_scoring_plays.rb +15 -0
  76. data/lib/stattleship/basketball_stat_leaders.rb +15 -0
  77. data/lib/stattleship/basketball_stats.rb +15 -0
  78. data/lib/stattleship/basketball_team_game_logs.rb +113 -0
  79. data/lib/stattleship/basketball_team_outcome_streaks.rb +15 -0
  80. data/lib/stattleship/basketball_teams.rb +15 -0
  81. data/lib/stattleship/basketball_top_stats.rb +15 -0
  82. data/lib/stattleship/basketball_total_player_stat.rb +15 -0
  83. data/lib/stattleship/basketball_total_team_stat.rb +15 -0
  84. data/lib/stattleship/client/client.rb +101 -0
  85. data/lib/stattleship/client/configuration.rb +42 -0
  86. data/lib/stattleship/endpoint.rb +208 -0
  87. data/lib/stattleship/feats.rb +150 -0
  88. data/lib/stattleship/football_feats.rb +15 -0
  89. data/lib/stattleship/football_game_logs.rb +255 -0
  90. data/lib/stattleship/football_games.rb +15 -0
  91. data/lib/stattleship/football_injuries.rb +15 -0
  92. data/lib/stattleship/football_penalties.rb +15 -0
  93. data/lib/stattleship/football_players.rb +15 -0
  94. data/lib/stattleship/football_scoring_plays.rb +15 -0
  95. data/lib/stattleship/football_stat_leaders.rb +15 -0
  96. data/lib/stattleship/football_stats.rb +15 -0
  97. data/lib/stattleship/football_team_game_logs.rb +176 -0
  98. data/lib/stattleship/football_team_outcome_streaks.rb +15 -0
  99. data/lib/stattleship/football_teams.rb +15 -0
  100. data/lib/stattleship/football_top_stats.rb +15 -0
  101. data/lib/stattleship/football_total_player_stat.rb +15 -0
  102. data/lib/stattleship/football_total_team_stat.rb +15 -0
  103. data/lib/stattleship/formatters/stat_formatter.rb +28 -0
  104. data/lib/stattleship/game_logs.rb +97 -0
  105. data/lib/stattleship/games.rb +38 -0
  106. data/lib/stattleship/hockey_feats.rb +15 -0
  107. data/lib/stattleship/hockey_game_logs.rb +107 -0
  108. data/lib/stattleship/hockey_games.rb +15 -0
  109. data/lib/stattleship/hockey_injuries.rb +15 -0
  110. data/lib/stattleship/hockey_penalties.rb +32 -0
  111. data/lib/stattleship/hockey_players.rb +15 -0
  112. data/lib/stattleship/hockey_scoring_plays.rb +15 -0
  113. data/lib/stattleship/hockey_stat_leaders.rb +15 -0
  114. data/lib/stattleship/hockey_stats.rb +15 -0
  115. data/lib/stattleship/hockey_team_game_logs.rb +128 -0
  116. data/lib/stattleship/hockey_team_outcome_streaks.rb +15 -0
  117. data/lib/stattleship/hockey_teams.rb +15 -0
  118. data/lib/stattleship/hockey_top_stats.rb +15 -0
  119. data/lib/stattleship/hockey_total_player_stat.rb +15 -0
  120. data/lib/stattleship/hockey_total_team_stat.rb +15 -0
  121. data/lib/stattleship/injuries.rb +32 -0
  122. data/lib/stattleship/models.rb +19 -0
  123. data/lib/stattleship/models/game.rb +360 -0
  124. data/lib/stattleship/models/injury.rb +22 -0
  125. data/lib/stattleship/models/league.rb +35 -0
  126. data/lib/stattleship/models/official.rb +20 -0
  127. data/lib/stattleship/models/penalty.rb +133 -0
  128. data/lib/stattleship/models/player.rb +124 -0
  129. data/lib/stattleship/models/playing_position.rb +17 -0
  130. data/lib/stattleship/models/ranking.rb +96 -0
  131. data/lib/stattleship/models/scoring_play.rb +201 -0
  132. data/lib/stattleship/models/scoring_player.rb +22 -0
  133. data/lib/stattleship/models/season.rb +18 -0
  134. data/lib/stattleship/models/team.rb +78 -0
  135. data/lib/stattleship/models/team_outcome_streak.rb +88 -0
  136. data/lib/stattleship/models/venue.rb +32 -0
  137. data/lib/stattleship/params.rb +102 -0
  138. data/lib/stattleship/params/baseball_feats_params.rb +6 -0
  139. data/lib/stattleship/params/baseball_game_logs_params.rb +6 -0
  140. data/lib/stattleship/params/baseball_games_params.rb +6 -0
  141. data/lib/stattleship/params/baseball_injuries_params.rb +6 -0
  142. data/lib/stattleship/params/baseball_penalties_params.rb +6 -0
  143. data/lib/stattleship/params/baseball_players_params.rb +6 -0
  144. data/lib/stattleship/params/baseball_scoring_plays_params.rb +6 -0
  145. data/lib/stattleship/params/baseball_stat_leaders_params.rb +6 -0
  146. data/lib/stattleship/params/baseball_stats_params.rb +6 -0
  147. data/lib/stattleship/params/baseball_team_game_logs_params.rb +6 -0
  148. data/lib/stattleship/params/baseball_team_outcome_streaks_params.rb +9 -0
  149. data/lib/stattleship/params/baseball_team_stats_params.rb +10 -0
  150. data/lib/stattleship/params/baseball_teams_params.rb +6 -0
  151. data/lib/stattleship/params/baseball_top_stats_params.rb +6 -0
  152. data/lib/stattleship/params/baseball_total_player_stat_params.rb +6 -0
  153. data/lib/stattleship/params/baseball_total_team_stat_params.rb +11 -0
  154. data/lib/stattleship/params/basketball_feats_params.rb +6 -0
  155. data/lib/stattleship/params/basketball_game_logs_params.rb +6 -0
  156. data/lib/stattleship/params/basketball_games_params.rb +6 -0
  157. data/lib/stattleship/params/basketball_injuries_params.rb +6 -0
  158. data/lib/stattleship/params/basketball_penalties_params.rb +6 -0
  159. data/lib/stattleship/params/basketball_players_params.rb +6 -0
  160. data/lib/stattleship/params/basketball_scoring_plays_params.rb +6 -0
  161. data/lib/stattleship/params/basketball_stat_leaders_params.rb +6 -0
  162. data/lib/stattleship/params/basketball_stats_params.rb +6 -0
  163. data/lib/stattleship/params/basketball_team_game_logs_params.rb +6 -0
  164. data/lib/stattleship/params/basketball_team_outcome_streaks_params.rb +9 -0
  165. data/lib/stattleship/params/basketball_team_stats_params.rb +10 -0
  166. data/lib/stattleship/params/basketball_teams_params.rb +6 -0
  167. data/lib/stattleship/params/basketball_top_stats_params.rb +6 -0
  168. data/lib/stattleship/params/basketball_total_player_stat_params.rb +6 -0
  169. data/lib/stattleship/params/basketball_total_team_stat_params.rb +11 -0
  170. data/lib/stattleship/params/feats_params.rb +23 -0
  171. data/lib/stattleship/params/football_feats_params.rb +6 -0
  172. data/lib/stattleship/params/football_game_logs_params.rb +11 -0
  173. data/lib/stattleship/params/football_games_params.rb +6 -0
  174. data/lib/stattleship/params/football_injuries_params.rb +6 -0
  175. data/lib/stattleship/params/football_penalties_params.rb +6 -0
  176. data/lib/stattleship/params/football_players_params.rb +6 -0
  177. data/lib/stattleship/params/football_scoring_plays_params.rb +6 -0
  178. data/lib/stattleship/params/football_stat_leaders_params.rb +6 -0
  179. data/lib/stattleship/params/football_stats_params.rb +6 -0
  180. data/lib/stattleship/params/football_team_game_logs_params.rb +6 -0
  181. data/lib/stattleship/params/football_team_outcome_streaks_params.rb +9 -0
  182. data/lib/stattleship/params/football_team_stats_params.rb +10 -0
  183. data/lib/stattleship/params/football_teams_params.rb +6 -0
  184. data/lib/stattleship/params/football_top_stats_params.rb +6 -0
  185. data/lib/stattleship/params/football_total_player_stat_params.rb +6 -0
  186. data/lib/stattleship/params/football_total_team_stat_params.rb +11 -0
  187. data/lib/stattleship/params/game_logs_params.rb +13 -0
  188. data/lib/stattleship/params/game_time_params.rb +17 -0
  189. data/lib/stattleship/params/games_params.rb +13 -0
  190. data/lib/stattleship/params/hockey_feats_params.rb +6 -0
  191. data/lib/stattleship/params/hockey_game_logs_params.rb +6 -0
  192. data/lib/stattleship/params/hockey_games_params.rb +6 -0
  193. data/lib/stattleship/params/hockey_injuries_params.rb +6 -0
  194. data/lib/stattleship/params/hockey_penalties_params.rb +6 -0
  195. data/lib/stattleship/params/hockey_players_params.rb +6 -0
  196. data/lib/stattleship/params/hockey_scoring_plays_params.rb +6 -0
  197. data/lib/stattleship/params/hockey_stat_leaders_params.rb +6 -0
  198. data/lib/stattleship/params/hockey_stats_params.rb +6 -0
  199. data/lib/stattleship/params/hockey_team_game_logs_params.rb +6 -0
  200. data/lib/stattleship/params/hockey_team_outcome_streaks_params.rb +9 -0
  201. data/lib/stattleship/params/hockey_team_stats_params.rb +10 -0
  202. data/lib/stattleship/params/hockey_teams_params.rb +6 -0
  203. data/lib/stattleship/params/hockey_top_stats_params.rb +6 -0
  204. data/lib/stattleship/params/hockey_total_player_stat_params.rb +6 -0
  205. data/lib/stattleship/params/hockey_total_team_stat_params.rb +11 -0
  206. data/lib/stattleship/params/injuries_params.rb +11 -0
  207. data/lib/stattleship/params/penalties_params.rb +11 -0
  208. data/lib/stattleship/params/players_params.rb +12 -0
  209. data/lib/stattleship/params/query_params.rb +50 -0
  210. data/lib/stattleship/params/rankings_params.rb +15 -0
  211. data/lib/stattleship/params/scoring_plays_params.rb +12 -0
  212. data/lib/stattleship/params/stat_leaders_params.rb +17 -0
  213. data/lib/stattleship/params/stats_params.rb +17 -0
  214. data/lib/stattleship/params/team_game_logs_params.rb +12 -0
  215. data/lib/stattleship/params/team_outcome_streaks_params.rb +24 -0
  216. data/lib/stattleship/params/teams_params.rb +9 -0
  217. data/lib/stattleship/params/top_stats_params.rb +17 -0
  218. data/lib/stattleship/params/total_player_stat_params.rb +17 -0
  219. data/lib/stattleship/params/total_team_stat_params.rb +18 -0
  220. data/lib/stattleship/penalties.rb +26 -0
  221. data/lib/stattleship/players.rb +26 -0
  222. data/lib/stattleship/rankings.rb +51 -0
  223. data/lib/stattleship/scoring_plays.rb +30 -0
  224. data/lib/stattleship/stat_leaders.rb +43 -0
  225. data/lib/stattleship/stats.rb +76 -0
  226. data/lib/stattleship/team_game_logs.rb +90 -0
  227. data/lib/stattleship/team_outcome_streaks.rb +28 -0
  228. data/lib/stattleship/teams.rb +20 -0
  229. data/lib/stattleship/top_stats.rb +58 -0
  230. data/lib/stattleship/total_player_stat.rb +37 -0
  231. data/lib/stattleship/total_team_stat.rb +30 -0
  232. data/lib/stattleship/validators.rb +33 -0
  233. data/lib/stattleship/validators/base_validator.rb +117 -0
  234. data/lib/stattleship/validators/birth_date_validator.rb +9 -0
  235. data/lib/stattleship/validators/current_validator.rb +9 -0
  236. data/lib/stattleship/validators/feat_validator.rb +9 -0
  237. data/lib/stattleship/validators/game_id_validator.rb +9 -0
  238. data/lib/stattleship/validators/interval_type_validator.rb +9 -0
  239. data/lib/stattleship/validators/level_up_validator.rb +9 -0
  240. data/lib/stattleship/validators/level_validator.rb +16 -0
  241. data/lib/stattleship/validators/on_validator.rb +9 -0
  242. data/lib/stattleship/validators/outcome_validator.rb +9 -0
  243. data/lib/stattleship/validators/page_validator.rb +9 -0
  244. data/lib/stattleship/validators/penalty_validator.rb +9 -0
  245. data/lib/stattleship/validators/per_page_validator.rb +9 -0
  246. data/lib/stattleship/validators/place_validator.rb +9 -0
  247. data/lib/stattleship/validators/player_id_validator.rb +9 -0
  248. data/lib/stattleship/validators/rank_validator.rb +9 -0
  249. data/lib/stattleship/validators/ranked_validator.rb +9 -0
  250. data/lib/stattleship/validators/ranking_validator.rb +9 -0
  251. data/lib/stattleship/validators/scoring_method_validator.rb +9 -0
  252. data/lib/stattleship/validators/scoring_type_validator.rb +9 -0
  253. data/lib/stattleship/validators/season_id_validator.rb +9 -0
  254. data/lib/stattleship/validators/since_validator.rb +9 -0
  255. data/lib/stattleship/validators/stat_validator.rb +23 -0
  256. data/lib/stattleship/validators/status_validator.rb +16 -0
  257. data/lib/stattleship/validators/streak_length_validator.rb +9 -0
  258. data/lib/stattleship/validators/team_id_validator.rb +9 -0
  259. data/lib/stattleship/validators/type_validator.rb +9 -0
  260. data/lib/stattleship/validators/week_validator.rb +9 -0
  261. data/lib/stattleship/version.rb +5 -0
  262. data/sample.env +1 -0
  263. data/stattleship-ruby.gemspec +33 -0
  264. metadata +503 -0
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballInjuries < Stattleship::Injuries
3
+ BASKETBALL_INJURIES = 'basketball/nba/injuries'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_INJURIES,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballInjuriesRepresenter
12
+ include Roar::JSON
13
+ include InjuriesRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballPenalties < Stattleship::Penalties
3
+ BASKETBALL_PENALTIES = 'basketball/nba/penalties'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_PENALTIES,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballPenaltiesRepresenter
12
+ include Roar::JSON
13
+ include PenaltiesRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballPlayers < Stattleship::Players
3
+ BASKETBALL_PLAYERS = 'basketball/nba/players'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_PLAYERS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballPlayersRepresenter
12
+ include Roar::JSON
13
+ include PlayersRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballScoringPlays < Stattleship::ScoringPlays
3
+ BASKETBALL_SCORING_PLAYS = 'basketball/nba/scoring_plays'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_SCORING_PLAYS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballScoringPlaysRepresenter
12
+ include Roar::JSON
13
+ include ScoringPlaysRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballStatLeaders < Stattleship::StatLeaders
3
+ BASKETBALL_STAT_LEADERS = 'basketball/nba/stat_leaders'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_STAT_LEADERS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballStatLeadersRepresenter
12
+ include Roar::JSON
13
+ include StatLeadersRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballStats < Stattleship::Stats
3
+ BASKETBALL_STATS = 'basketball/nba/stats'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_STATS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballStatsRepresenter
12
+ include Roar::JSON
13
+ include StatsRepresenter
14
+ end
15
+ end
@@ -0,0 +1,113 @@
1
+ module Stattleship
2
+ class BasketballTeamGameLog < Stattleship::TeamGameLog
3
+ def stats
4
+ [
5
+ "#{field_goals_made.to_i} FGM",
6
+ "#{(field_goals_percentage.to_f * 100).round(1)} FG%",
7
+ "#{points_scored_total.to_i} PTS",
8
+ "#{rebounds_defensive.to_i} DRB",
9
+ "#{rebounds_offensive.to_i} ORB",
10
+ "#{rebounds_total} REB"
11
+ ]
12
+ end
13
+
14
+ def to_sentence
15
+ "#{team_name} #{stats.join(', ')} (#{game.name})"
16
+ end
17
+ end
18
+
19
+ class BasketballTeamGameLogs < Stattleship::TeamGameLogs
20
+ BASKETBALL_TEAM_GAME_LOGS = 'basketball/nba/team_game_logs'.freeze
21
+
22
+ def self.fetch(params:)
23
+ super(path: BASKETBALL_TEAM_GAME_LOGS,
24
+ params: params)
25
+ end
26
+ end
27
+
28
+ module BasketballTeamGameLogsRepresenter
29
+ include Roar::JSON
30
+ include Roar::Coercion
31
+ include Stattleship::TeamGameLogsRepresenter
32
+ include Virtus.model
33
+
34
+ collection :team_game_logs, class: Stattleship::BasketballTeamGameLog do
35
+
36
+ [
37
+ :away_team_outcome,
38
+ :home_team_outcome,
39
+ :team_outcome,
40
+ :opponent_outcome,
41
+ ].each do |attribute|
42
+ property attribute
43
+ end
44
+
45
+ [
46
+ :field_goals_percentage,
47
+ :free_throws_percentage,
48
+ :three_pointers_percentage,
49
+ ].each do |attribute|
50
+ property attribute, type: BigDecimal
51
+ end
52
+
53
+ [
54
+ :away_team_score,
55
+ :home_team_score,
56
+ :team_score,
57
+ :opponent_score,
58
+ :assists_total,
59
+ :blocks_total,
60
+ :coach_technical_fouls,
61
+ :field_goals_attempted,
62
+ :field_goals_made,
63
+ :free_throws_attempted,
64
+ :free_throws_made,
65
+ :personal_fouls,
66
+ :points_biggest_lead,
67
+ :points_fast_break,
68
+ :points_highest,
69
+ :points_in_paint,
70
+ :points_overtime,
71
+ :points_overtime_1,
72
+ :points_overtime_2,
73
+ :points_overtime_3,
74
+ :points_overtime_4,
75
+ :points_overtime_5,
76
+ :points_quarter_1,
77
+ :points_quarter_2,
78
+ :points_quarter_3,
79
+ :points_quarter_4,
80
+ :points_scored_off_turnovers,
81
+ :points_scored_total,
82
+ :points_unanswered,
83
+ :rebounds_defensive,
84
+ :rebounds_offensive,
85
+ :rebounds_total,
86
+ :steals_total,
87
+ :team_rebounds_total,
88
+ :team_turnovers_total,
89
+ :technical_fouls,
90
+ :three_pointers_attempted,
91
+ :three_pointers_made,
92
+ :turnovers_total,
93
+ ].each do |attribute|
94
+ property attribute, type: Integer
95
+ end
96
+
97
+ [
98
+ :is_home_team,
99
+ :is_away_team,
100
+ ].each do |attribute|
101
+ property attribute, type: Boolean, default: false
102
+ end
103
+
104
+ [
105
+ :game_id,
106
+ :opponent_id,
107
+ :team_id,
108
+ ].each do |relationship|
109
+ property relationship
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballTeamOutcomeStreaks < Stattleship::TeamOutcomeStreaks
3
+ BASKETBALL_TEAM_OUTCOME_STREAKS = 'basketball/nba/team_outcome_streaks'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_TEAM_OUTCOME_STREAKS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballTeamOutcomeStreaksRepresenter
12
+ include Roar::JSON
13
+ include TeamOutcomeStreaksRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballTeams < Stattleship::Teams
3
+ BASKETBALL_TEAMS = 'basketball/nba/teams'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_TEAMS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballTeamsRepresenter
12
+ include Roar::JSON
13
+ include TeamsRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballTopStats < Stattleship::TopStats
3
+ BASKETBALL_TOP_STATS = 'basketball/nba/top_stats'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_TOP_STATS,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballTopStatsRepresenter
12
+ include Roar::JSON
13
+ include TopStatsRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballTotalPlayerStat < Stattleship::TotalPlayerStat
3
+ BASKETBALL_TOTAL_PLAYER_STAT = 'basketball/nba/total_stats'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_TOTAL_PLAYER_STAT,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballTotalPlayerStatRepresenter
12
+ include Roar::JSON
13
+ include TotalPlayerStatRepresenter
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Stattleship
2
+ class BasketballTotalTeamStat < Stattleship::TotalTeamStat
3
+ BASKETBALL_TOTAL_TEAM_STAT = 'basketball/nba/total_stats'.freeze
4
+
5
+ def self.fetch(params:)
6
+ super(path: BASKETBALL_TOTAL_TEAM_STAT,
7
+ params: params)
8
+ end
9
+ end
10
+
11
+ module BasketballTotalTeamStatRepresenter
12
+ include Roar::JSON
13
+ include TotalTeamStatRepresenter
14
+ end
15
+ end
@@ -0,0 +1,101 @@
1
+ module Stattleship
2
+ class Client
3
+ def initialize(path:,
4
+ query: nil,
5
+ token: Stattleship.configuration.api_token)
6
+ @base_uri = Stattleship.configuration.base_uri.freeze
7
+ @path = path
8
+ @query = query
9
+ @token = token
10
+ end
11
+
12
+ def headers
13
+ {
14
+ 'Accept' => 'application/vnd.stattleship.com; version=1',
15
+ 'Authorization' => "Token token=#{token}",
16
+ 'Content-Type' => 'application/json',
17
+ 'User-Agent' =>
18
+ "Stattleship-Ruby/#{Stattleship::Ruby::VERSION} (#{RUBY_PLATFORM})"
19
+ }
20
+ end
21
+
22
+ def fetch
23
+ Stattleship.configuration.http.request(endpoint)
24
+ rescue StandardError => e
25
+ puts "HTTP Request failed (#{e.message})"
26
+ raise e
27
+ end
28
+
29
+ def paginate(model:)
30
+ data = []
31
+ response = fetch
32
+
33
+ while keep_fetching?(response: response)
34
+ data << build(model: model, response: response)
35
+
36
+ if next_url(response: response)
37
+ response = fetch_next_url
38
+ end
39
+ end
40
+
41
+ data.flatten
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :base_uri, :path, :query, :token
47
+
48
+ def build(model:, response:)
49
+ builder = model.new
50
+ builder.extend(Kernel.const_get("#{builder.class.name}Representer"))
51
+ builder.from_json(response.body).data
52
+ end
53
+
54
+ def keep_fetching?(response:)
55
+ response.is_a?(Net::HTTPSuccess) && @url
56
+ end
57
+
58
+ def fetch_next_url
59
+ sleep(0.25)
60
+
61
+ response = fetch
62
+
63
+ unless response.is_a?(Net::HTTPSuccess)
64
+ @url = nil
65
+ end
66
+
67
+ response
68
+ end
69
+
70
+ def next_url(response:)
71
+ @url = nil
72
+
73
+ headers = response.header.to_hash
74
+ links = (headers['link'] || []).first
75
+
76
+ LinkHeader.parse(links).links.map do |link|
77
+ if link.attrs['rel'] == 'next'
78
+ @url = link.href
79
+ return true
80
+ end
81
+ end
82
+
83
+ false
84
+ end
85
+
86
+ def url
87
+ @url ||= begin
88
+ if query
89
+ template = Addressable::Template.new("#{base_uri}/#{path}{?query*}")
90
+ template.partial_expand(query).pattern
91
+ else
92
+ "#{base_uri}/#{path}"
93
+ end
94
+ end
95
+ end
96
+
97
+ def endpoint
98
+ Net::HTTP::Get.new(url, headers)
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,42 @@
1
+ module Stattleship
2
+ class << self
3
+ attr_accessor :configuration
4
+
5
+ def configure
6
+ if block_given?
7
+ yield configuration
8
+ end
9
+
10
+ configuration
11
+ end
12
+
13
+ def configuration
14
+ @configuration ||= Configuration.new
15
+ end
16
+ end
17
+
18
+ class Configuration
19
+ attr_accessor :api_token
20
+ attr_reader :http
21
+ attr_writer :base_uri
22
+
23
+ def api_token=(token)
24
+ @api_token = token
25
+ end
26
+
27
+ def api_token
28
+ @api_token || ENV['STATTLESHIP_ACCESS_TOKEN']
29
+ end
30
+
31
+ def base_uri
32
+ @base_uri ||= URI('https://www.stattleship.com')
33
+ end
34
+
35
+ def http
36
+ Net::HTTP.new(base_uri.host, base_uri.port).tap do |http|
37
+ http.use_ssl = true
38
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,208 @@
1
+ module Stattleship
2
+ class Endpoint < OpenStruct
3
+ def self.fetch(path:, params:)
4
+ Stattleship::Client.new(path: path,
5
+ query: params.query).
6
+ paginate(model: self)
7
+ end
8
+
9
+ def data
10
+ @data ||= populate
11
+ end
12
+
13
+ def populate
14
+ raise 'Endpoint subclass must implement populate'
15
+ end
16
+
17
+ private
18
+
19
+ def populate_officials(model)
20
+ model.officials = []
21
+
22
+ return if model.official_ids.nil?
23
+ return if officials.nil?
24
+
25
+ model.official_ids.each do |official_id|
26
+ model.officials << officials.detect do |official|
27
+ official.id == official_id
28
+ end
29
+ end
30
+ end
31
+
32
+ def populate_opponents(model)
33
+ return if opponents.nil?
34
+
35
+ model.opponent = opponents.detect do |opponent|
36
+ opponent.id == model.opponent_id
37
+ end
38
+ end
39
+
40
+ def populate_players(model)
41
+ return if players.nil?
42
+
43
+ model.player = players.detect do |player|
44
+ player.id == model.player_id
45
+ end
46
+ end
47
+
48
+ def populate_player_teams(model)
49
+ return if teams.nil? || model.player.nil?
50
+
51
+ model.team = teams.detect do |team|
52
+ team.id == model.player.team_id
53
+ end
54
+
55
+ if model.player
56
+ model.player.team = model.team
57
+ populate_player_playing_position(model.player)
58
+ end
59
+ end
60
+
61
+ def populate_player(player)
62
+ populate_player_team(player)
63
+ end
64
+
65
+ def populate_player_team(player)
66
+ return if player.nil?
67
+ return if teams.nil?
68
+
69
+ player.team = teams.detect do |team|
70
+ team.id == player.team_id
71
+ end
72
+ end
73
+
74
+ def populate_player_playing_position(model)
75
+ return if playing_positions.nil?
76
+
77
+ model.playing_position = playing_positions.detect do |playing_position|
78
+ playing_position.id == model.player.playing_position_id
79
+ end
80
+ end
81
+
82
+ def populate_games(model)
83
+ return if games.nil?
84
+
85
+ model.game = games.detect do |game|
86
+ game.id == model.game_id
87
+ end
88
+
89
+ populate_model_game(model)
90
+ end
91
+
92
+ def populate_game(game)
93
+ populate_away_team(game)
94
+ populate_home_team(game)
95
+ populate_officials(game)
96
+ populate_winning_team(game)
97
+ populate_season(game)
98
+ populate_venue(game)
99
+
100
+ if game && game.season
101
+ populate_league(game.season)
102
+ game.league = game.season.league
103
+ end
104
+ end
105
+
106
+ def populate_model_game(model)
107
+ populate_season(model.game)
108
+ populate_venue(model.game)
109
+
110
+ if model.game && model.game.season
111
+ populate_league(model.game.season)
112
+ model.game.league = model.game.season.league
113
+ end
114
+
115
+ if model.game && model.game.league
116
+ model.league = model.game.league
117
+ end
118
+ end
119
+
120
+ def populate_season(model)
121
+ return if seasons.nil?
122
+
123
+ model.season = seasons.detect do |season|
124
+ season.id == model.season_id
125
+ end
126
+ end
127
+
128
+ def populate_season_league(model)
129
+ return if leagues.nil?
130
+ return if model.season.nil?
131
+
132
+ model.season.league = leagues.detect do |league|
133
+ league.id == model.season.league_id
134
+ end
135
+
136
+ model.league = model.season.league
137
+ end
138
+
139
+ def populate_league(model)
140
+ return if leagues.nil?
141
+
142
+ model.league = leagues.detect do |league|
143
+ league.id == model.league_id
144
+ end
145
+ end
146
+
147
+ def populate_team(team)
148
+ populate_league(team)
149
+ end
150
+
151
+ def populate_away_team(model)
152
+ return if away_teams.nil?
153
+ model.away_team = away_teams.detect do |away_team|
154
+ away_team.id == model.away_team_id
155
+ end
156
+ end
157
+
158
+ def populate_home_team(model)
159
+ return if home_teams.nil?
160
+
161
+ model.home_team = home_teams.detect do |home_team|
162
+ home_team.id == model.home_team_id
163
+ end
164
+ end
165
+
166
+ def populate_winning_team(model)
167
+ return if winning_teams.nil?
168
+
169
+ model.winning_team = winning_teams.detect do |winning_team|
170
+ winning_team.id == model.winning_team_id
171
+ end
172
+ end
173
+
174
+ def populate_teams(model)
175
+ return if teams.nil?
176
+
177
+ model.team = teams.detect do |team|
178
+ team.id == model.team_id
179
+ end
180
+ end
181
+
182
+ def populate_venue(model)
183
+ return if venues.nil?
184
+
185
+ model.venue = venues.detect do |venue|
186
+ venue.id == model.venue_id
187
+ end
188
+ end
189
+
190
+ def populate_scoring_players(model)
191
+ model.scoring_players = []
192
+
193
+ return if scoring_players.nil?
194
+
195
+ model.scoring_player_ids.each do |scoring_player_id|
196
+ model.scoring_players << scoring_players.detect do |scoring_player|
197
+ scoring_player.id == scoring_player_id
198
+ end
199
+ end
200
+
201
+ model.scoring_players.each do |scoring_player|
202
+ scoring_player.player = players.detect do |player|
203
+ player.id == scoring_player.player_id
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end