nba_stats 0.9.0

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 (111) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.idea/.name +1 -0
  4. data/.idea/.rakeTasks +7 -0
  5. data/.idea/encodings.xml +5 -0
  6. data/.idea/misc.xml +21 -0
  7. data/.idea/modules.xml +9 -0
  8. data/.idea/nba_stats.iml +43 -0
  9. data/.idea/scopes/scope_settings.xml +5 -0
  10. data/.idea/vcs.xml +7 -0
  11. data/.idea/workspace.xml +782 -0
  12. data/Gemfile +4 -0
  13. data/LICENSE.txt +22 -0
  14. data/README.md +68 -0
  15. data/Rakefile +45 -0
  16. data/lib/nba_stats/client.rb +135 -0
  17. data/lib/nba_stats/configuration.rb +37 -0
  18. data/lib/nba_stats/constants.rb +96 -0
  19. data/lib/nba_stats/discovery/discovery.rb +193 -0
  20. data/lib/nba_stats/errors.rb +9 -0
  21. data/lib/nba_stats/helper.rb +10 -0
  22. data/lib/nba_stats/resources/box_score.rb +35 -0
  23. data/lib/nba_stats/resources/box_score_advanced.rb +38 -0
  24. data/lib/nba_stats/resources/box_score_four_factors.rb +38 -0
  25. data/lib/nba_stats/resources/box_score_misc.rb +38 -0
  26. data/lib/nba_stats/resources/box_score_scoring.rb +38 -0
  27. data/lib/nba_stats/resources/box_score_usage.rb +38 -0
  28. data/lib/nba_stats/resources/common_all_players.rb +23 -0
  29. data/lib/nba_stats/resources/common_player_info.rb +24 -0
  30. data/lib/nba_stats/resources/common_team_roster.rb +24 -0
  31. data/lib/nba_stats/resources/common_team_years.rb +24 -0
  32. data/lib/nba_stats/resources/draft_combine_drill_results.rb +24 -0
  33. data/lib/nba_stats/resources/draft_combine_non_stationary_shooting.rb +24 -0
  34. data/lib/nba_stats/resources/draft_combine_player_anthro.rb +24 -0
  35. data/lib/nba_stats/resources/draft_combine_spot_shooting.rb +24 -0
  36. data/lib/nba_stats/resources/draft_combine_stats.rb +24 -0
  37. data/lib/nba_stats/resources/franchise_history.rb +25 -0
  38. data/lib/nba_stats/resources/home_page_leaders.rb +26 -0
  39. data/lib/nba_stats/resources/league_dash_lineups.rb +24 -0
  40. data/lib/nba_stats/resources/league_dash_player_stats.rb +24 -0
  41. data/lib/nba_stats/resources/play_by_play.rb +25 -0
  42. data/lib/nba_stats/resources/player_career_stats.rb +29 -0
  43. data/lib/nba_stats/resources/player_profile.rb +31 -0
  44. data/lib/nba_stats/resources/resource_base.rb +86 -0
  45. data/lib/nba_stats/resources/scoreboard.rb +29 -0
  46. data/lib/nba_stats/resources/shot_chart_detail.rb +25 -0
  47. data/lib/nba_stats/resources/team_game_log.rb +23 -0
  48. data/lib/nba_stats/resources/team_info_common.rb +24 -0
  49. data/lib/nba_stats/resources/team_year_by_year_stats.rb +24 -0
  50. data/lib/nba_stats/stats/box_score.rb +42 -0
  51. data/lib/nba_stats/stats/box_score_advanced.rb +41 -0
  52. data/lib/nba_stats/stats/box_score_four_factors.rb +41 -0
  53. data/lib/nba_stats/stats/box_score_misc.rb +41 -0
  54. data/lib/nba_stats/stats/box_score_scoring.rb +41 -0
  55. data/lib/nba_stats/stats/box_score_usage.rb +41 -0
  56. data/lib/nba_stats/stats/common_all_players.rb +33 -0
  57. data/lib/nba_stats/stats/common_player_info.rb +33 -0
  58. data/lib/nba_stats/stats/common_team_roster.rb +33 -0
  59. data/lib/nba_stats/stats/common_team_years.rb +26 -0
  60. data/lib/nba_stats/stats/draft_combine_drill_results.rb +29 -0
  61. data/lib/nba_stats/stats/draft_combine_non_stationary_shooting.rb +29 -0
  62. data/lib/nba_stats/stats/draft_combine_player_anthro.rb +29 -0
  63. data/lib/nba_stats/stats/draft_combine_spot_shooting.rb +29 -0
  64. data/lib/nba_stats/stats/draft_combine_stats.rb +29 -0
  65. data/lib/nba_stats/stats/franchise_history.rb +26 -0
  66. data/lib/nba_stats/stats/home_page_leaders.rb +44 -0
  67. data/lib/nba_stats/stats/league_dash_lineups.rb +107 -0
  68. data/lib/nba_stats/stats/league_dash_player_stats.rb +104 -0
  69. data/lib/nba_stats/stats/play_by_play.rb +32 -0
  70. data/lib/nba_stats/stats/player_career_stats.rb +32 -0
  71. data/lib/nba_stats/stats/player_profile.rb +45 -0
  72. data/lib/nba_stats/stats/scoreboard.rb +33 -0
  73. data/lib/nba_stats/stats/shot_chart_detail.rb +95 -0
  74. data/lib/nba_stats/stats/team_game_log.rb +36 -0
  75. data/lib/nba_stats/stats/team_info_common.rb +36 -0
  76. data/lib/nba_stats/stats/team_year_by_year_stats.rb +38 -0
  77. data/lib/nba_stats/version.rb +3 -0
  78. data/lib/nba_stats.rb +8 -0
  79. data/nba_stats.gemspec +28 -0
  80. data/spec/client/box_score_advanced_spec.rb +30 -0
  81. data/spec/client/box_score_four_factors_spec.rb +30 -0
  82. data/spec/client/box_score_misc_spec.rb +30 -0
  83. data/spec/client/box_score_scoring_spec.rb +30 -0
  84. data/spec/client/box_score_spec.rb +30 -0
  85. data/spec/client/box_score_usage_spec.rb +30 -0
  86. data/spec/client/common_all_players_spec.rb +27 -0
  87. data/spec/client/common_player_info_spec.rb +33 -0
  88. data/spec/client/common_team_roster_spec.rb +27 -0
  89. data/spec/client/common_team_years_spec.rb +27 -0
  90. data/spec/client/draft_combine_drill_results_spec.rb +27 -0
  91. data/spec/client/draft_combine_non_stationary_shooting_spec.rb +27 -0
  92. data/spec/client/draft_combine_player_anthro_spec.rb +27 -0
  93. data/spec/client/draft_combine_spot_shooting_spec.rb +27 -0
  94. data/spec/client/draft_combine_stats_spec.rb +27 -0
  95. data/spec/client/franchise_history_spec.rb +30 -0
  96. data/spec/client/home_page_leaders_spec.rb +27 -0
  97. data/spec/client/league_dash_lineups_spec.rb +27 -0
  98. data/spec/client/league_dash_player_stats_spec.rb +27 -0
  99. data/spec/client/play_by_play_spec.rb +30 -0
  100. data/spec/client/player_career_stats_spec.rb +30 -0
  101. data/spec/client/player_profile_spec.rb +30 -0
  102. data/spec/client/scoreboard_spec.rb +30 -0
  103. data/spec/client/shot_chart_detail_spec.rb +27 -0
  104. data/spec/client/team_game_log_spec.rb +27 -0
  105. data/spec/client/team_info_common_spec.rb +30 -0
  106. data/spec/client/team_year_by_year_stats_spec.rb +30 -0
  107. data/spec/client_spec.rb +17 -0
  108. data/spec/configuration_spec.rb +38 -0
  109. data/spec/nba_stats_spec.rb +13 -0
  110. data/spec/spec_helper.rb +21 -0
  111. metadata +268 -0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in nba_stats.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 TODO: Write your name
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # NbaStats
2
+
3
+ A ruby interface for the NBA.com stats JSON API.
4
+
5
+ ## Author
6
+
7
+ https://twitter.com/dagrz
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'nba_stats'
14
+
15
+ ## Usage
16
+
17
+ To get started, create a new client:
18
+
19
+ require 'nba_stats'
20
+
21
+ client = NbaStats::Client.new
22
+
23
+ Use the client to call a function, which returns a resource:
24
+
25
+ my_resource = client.an_nba_stats_function
26
+
27
+ Get the result set array you want to use:
28
+
29
+ my_result_set = my_resource.a_resource_result_set
30
+
31
+ Get a row from the result set:
32
+
33
+ my_row = my_result_set[0]
34
+
35
+ Get an item value from the row:
36
+
37
+ my_item = my_row[:an_item_name]
38
+
39
+ List of available functions:
40
+
41
+ # client.
42
+ scoreboard
43
+ box_score
44
+ box_score_four_factors
45
+ box_score_usage
46
+ box_score_scoring
47
+ box_score_misc
48
+ box_score_advanced
49
+ common_all_players
50
+ common_player_info
51
+ player_profile
52
+ player_career_stats
53
+ team_info_common
54
+ common_team_roster
55
+ team_game_log
56
+ team_year_by_year_stats
57
+ common_team_years
58
+ franchise_history
59
+ shot_chart_detail
60
+ play_by_play
61
+ league_dash_lineups
62
+ league_dash_player_stats
63
+ home_page_leaders
64
+ draft_combine_player_anthro
65
+ draft_combine_drill_results
66
+ draft_combine_non_stationary_shooting
67
+ draft_combine_spot_shooting
68
+ draft_combine_stats
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ require 'nba_stats'
7
+ require 'nba_stats/discovery/discovery'
8
+ desc 'Discover an NBA.com stats API endpoint'
9
+ task :discover do
10
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/scoreboard?LeagueID=00&gameDate=03%2F05%2F2014&DayOffset=0&date=Wed+Mar+05+2014+00%3A00%3A00+GMT%2B1100+(EST)')
11
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/boxscore?GameID=0021300904&RangeType=0&StartPeriod=0&EndPeriod=0&StartRange=0&EndRange=0')
12
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/commonallplayers?LeagueID=00&Season=2013-14&IsOnlyCurrentSeason=0')
13
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/commonplayerinfo?PlayerID=201567&SeasonType=Regular+Season&LeagueID=00')
14
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/playerprofile?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&PlayerID=201567&GraphStartSeason=2008-09&GraphEndSeason=2014-15&GraphStat=PTS')
15
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/teaminfocommon?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&TeamID=1610612746')
16
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/commonteamroster?Season=2013-14&LeagueID=00&TeamID=1610612746')
17
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/teamgamelog?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&TeamID=1610612746')
18
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/teamyearbyyearstats?LeagueID=00&PerMode=Totals&SeasonType=Regular+Season&TeamID=1610612755&Season=2013-14')
19
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/commonteamyears?LeagueID=00')
20
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/shotchartdetail?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&TeamID=1610612755&PlayerID=0&GameID=&Outcome=&Location=&Month=0&SeasonSegment=&DateFrom=&DateTo=&OpponentTeamID=0&VsConference=&VsDivision=&Position=&RookieYear=&GameSegment=&Period=0&LastNGames=0&ContextFilter=&ContextMeasure=FG_PCT')
21
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/playbyplay?GameID=0021300901&StartPeriod=0&EndPeriod=0')
22
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/boxscorefourfactors?GameID=0021300901&RangeType=0&StartPeriod=0&EndPeriod=0&StartRange=0&EndRange=0')
23
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/boxscoreusage?GameID=0021300901&RangeType=0&StartPeriod=0&EndPeriod=0&StartRange=0&EndRange=0')
24
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/boxscorescoring?GameID=0021300901&RangeType=0&StartPeriod=0&EndPeriod=0&StartRange=0&EndRange=0')
25
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/boxscoremisc?GameID=0021300901&RangeType=0&StartPeriod=0&EndPeriod=0&StartRange=0&EndRange=0')
26
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/boxscoreadvanced?GameID=0021300901&RangeType=0&StartPeriod=0&EndPeriod=0&StartRange=0&EndRange=0')
27
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/leaguedashlineups?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&TeamID=&MeasureType=Base&PerMode=PerGame&PlusMinus=N&PaceAdjust=N&Rank=N&Outcome=&Location=&Month=0&SeasonSegment=&DateFrom=&DateTo=&OpponentTeamID=0&VsConference=&VsDivision=&GameSegment=&Period=0&LastNGames=0&GroupQuantity=5&GameScope=&PlayerExperience=&PlayerPosition=&StarterBench=')
28
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/leaguedashplayerstats?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&MeasureType=Base&PerMode=PerGame&PlusMinus=N&PaceAdjust=N&Rank=N&Outcome=&Location=&Month=0&SeasonSegment=&DateFrom=&DateTo=&OpponentTeamID=0&VsConference=&VsDivision=&GameSegment=&Period=0&LastNGames=0&GameScope=&PlayerExperience=&PlayerPosition=&StarterBench=&Conf=Both')
29
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/playercareerstats?PlayerID=201609&LeagueID=00&PerMode=Totals')
30
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/homepageleaders?Season=2013-14&SeasonType=Playoffs&LeagueID=00&GameScope=Season&StatCategory=Points&PlayerScope=All+Players&PlayerOrTeam=Team')
31
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/franchisehistory?LeagueID=00')
32
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/draftcombineplayeranthro?LeagueID=00&SeasonYear=2014-15')
33
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/draftcombinedrillresults?LeagueID=00&SeasonYear=2014-15')
34
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/draftcombinenonstationaryshooting?LeagueID=00&SeasonYear=2014-15')
35
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/draftcombinespotshooting?LeagueID=00&SeasonYear=2014-15')
36
+ puts NbaStats::Discovery.discover('http://stats.nba.com/stats/draftcombinestats?LeagueID=00&SeasonYear=2014-15')
37
+
38
+ # These are non standard in some way
39
+ # puts NbaStats::Discovery.discover('http://stats.nba.com/stats/videoevents?LeagueID=00&Season=2012-13&SeasonType=Regular+Season&TeamID=0&PlayerID=0&GameID=0021300901&Outcome=&Location=&Month=0&SeasonSegment=&DateFrom=&DateTo=&OpponentTeamID=0&VsConference=&VsDivision=&Position=&RookieYear=&GameSegment=&Period=0&LastNGames=0&ClutchTime=&AheadBehind=&PointDiff=&RangeType=1&StartPeriod=1&EndPeriod=10&StartRange=0&EndRange=0&ContextFilter=&ContextMeasure=FG_PCT&GameEventID=4')
40
+ # puts NbaStats::Discovery.discover('http://stats.nba.com/stats/leaguedashteamstats?Season=2013-14&AllStarSeason=2013-14&SeasonType=All+Star&LeagueID=00&MeasureType=Base&PerMode=Totals&PlusMinus=N&PaceAdjust=N&Rank=N&Outcome=&Location=&Month=0&SeasonSegment=&DateFrom=&DateTo=&OpponentTeamID=0&VsConference=&VsDivision=&GameSegment=&Period=0&LastNGames=0&GameScope=&PlayerExperience=&PlayerPosition=&StarterBench=')
41
+ # puts NbaStats::Discovery.discover('http://stats.nba.com/stats/leaderstiles?Season=2013-14&SeasonType=Regular+Season&LeagueID=00&Stat=REB&PlayerOrTeam=Player&GameScope=Season&PlayerScope=All+Players')
42
+ # puts NbaStats::Discovery.discover('http://stats.nba.com/stats/leagueleaders?LeagueID=00&PerMode=PerGame&StatCategory=PTS&Season=All+Time&SeasonType=Regular+Season&Scope=S')
43
+ end
44
+
45
+
@@ -0,0 +1,135 @@
1
+ require 'rest_client'
2
+ require 'addressable/uri'
3
+ require 'nba_stats/configuration'
4
+ require 'nba_stats/stats/scoreboard'
5
+ require 'nba_stats/stats/box_score'
6
+ require 'nba_stats/stats/common_all_players'
7
+ require 'nba_stats/stats/common_player_info'
8
+ require 'nba_stats/stats/player_profile'
9
+ require 'nba_stats/stats/team_info_common'
10
+ require 'nba_stats/stats/common_team_roster'
11
+ require 'nba_stats/stats/team_game_log'
12
+ require 'nba_stats/stats/team_year_by_year_stats'
13
+ require 'nba_stats/stats/common_team_years'
14
+ require 'nba_stats/stats/shot_chart_detail'
15
+ require 'nba_stats/stats/play_by_play'
16
+ require 'nba_stats/stats/box_score_four_factors'
17
+ require 'nba_stats/stats/box_score_usage'
18
+ require 'nba_stats/stats/box_score_scoring'
19
+ require 'nba_stats/stats/box_score_misc'
20
+ require 'nba_stats/stats/box_score_advanced'
21
+ require 'nba_stats/stats/league_dash_lineups'
22
+ require 'nba_stats/stats/league_dash_player_stats'
23
+ require 'nba_stats/stats/player_career_stats'
24
+ require 'nba_stats/stats/home_page_leaders'
25
+ require 'nba_stats/stats/franchise_history'
26
+ require 'nba_stats/stats/draft_combine_player_anthro'
27
+ require 'nba_stats/stats/draft_combine_drill_results'
28
+ require 'nba_stats/stats/draft_combine_non_stationary_shooting'
29
+ require 'nba_stats/stats/draft_combine_spot_shooting'
30
+ require 'nba_stats/stats/draft_combine_stats'
31
+ require 'nba_stats/errors'
32
+
33
+ module NbaStats
34
+
35
+ class Client
36
+
37
+ include NbaStats::Scoreboard
38
+ include NbaStats::BoxScore
39
+ include NbaStats::CommonAllPlayers
40
+ include NbaStats::CommonPlayerInfo
41
+ include NbaStats::PlayerProfile
42
+ include NbaStats::TeamInfoCommon
43
+ include NbaStats::CommonTeamRoster
44
+ include NbaStats::TeamGameLog
45
+ include NbaStats::TeamYearByYearStats
46
+ include NbaStats::CommonTeamYears
47
+ include NbaStats::ShotChartDetail
48
+ include NbaStats::PlayByPlay
49
+ include NbaStats::BoxScoreFourFactors
50
+ include NbaStats::BoxScoreUsage
51
+ include NbaStats::BoxScoreScoring
52
+ include NbaStats::BoxScoreMisc
53
+ include NbaStats::BoxScoreAdvanced
54
+ include NbaStats::LeagueDashLineups
55
+ include NbaStats::LeagueDashPlayerStats
56
+ include NbaStats::PlayerCareerStats
57
+ include NbaStats::HomePageLeaders
58
+ include NbaStats::FranchiseHistory
59
+ include NbaStats::DraftCombinePlayerAnthro
60
+ include NbaStats::DraftCombineDrillResults
61
+ include NbaStats::DraftCombineNonStationaryShooting
62
+ include NbaStats::DraftCombineSpotShooting
63
+ include NbaStats::DraftCombineStats
64
+
65
+ # Define the same set of accessors as the Awesome module
66
+ attr_accessor *Configuration::VALID_CONFIG_KEYS
67
+
68
+ # Initialize a new Client object
69
+ #
70
+ # @param options [Hash]
71
+ # @return [NbaStats::Client]
72
+ def initialize(options={})
73
+ # Merge the config values from the module and those passed
74
+ # to the client.
75
+ merged_options = NbaStats.options.merge(options)
76
+
77
+ # Copy the merged values to this client and ignore those
78
+ # not part of our configuration
79
+ Configuration::VALID_CONFIG_KEYS.each do |key|
80
+ send("#{key}=", merged_options[key])
81
+ end
82
+ end
83
+
84
+ # @return [Hash]
85
+ def request_headers
86
+ @request_headers ||= {
87
+ :accept => accept,
88
+ :user_agent => user_agent
89
+ }
90
+ end
91
+
92
+ # Perform a HTTP GET request
93
+ #
94
+ # @param path [String]
95
+ # @param params [Hash]
96
+ # @return [Hash]
97
+ def get(path='/', params={})
98
+ uri = Addressable::URI.new
99
+ uri.query_values = params
100
+ full_path = "#{path}?#{uri.query}"
101
+ request(:get, full_path)
102
+ end
103
+
104
+ private
105
+
106
+ # @return [RestClient::Resource]
107
+ def resource
108
+ @resource ||= RestClient::Resource.new(endpoint)
109
+ end
110
+
111
+ # Send the HTTP request
112
+ #
113
+ # @param method [String]
114
+ # @param path [String]
115
+ # @return [RestClient::Response]
116
+ def request(method, path)
117
+ resource[path].send(method.to_sym, request_headers) { |response, request, result, &block|
118
+ case response.code
119
+ when 200
120
+ response
121
+ when 400
122
+ if response.include? ' is required'
123
+ raise ArgumentError.new(response)
124
+ else
125
+ raise BadRequestError.new(response)
126
+ end
127
+ else
128
+ response.return!(request, result, &block)
129
+ end
130
+ }
131
+ end
132
+
133
+ end # Client
134
+
135
+ end
@@ -0,0 +1,37 @@
1
+ module NbaStats
2
+
3
+ module Configuration
4
+ VALID_CONNECTION_KEYS = [:endpoint].freeze
5
+ VALID_OPTIONS_KEYS = [:user_agent, :accept].freeze
6
+ VALID_CONFIG_KEYS = VALID_CONNECTION_KEYS + VALID_OPTIONS_KEYS
7
+
8
+ DEFAULT_ENDPOINT = 'http://stats.nba.com'
9
+ DEFAULT_USER_AGENT = "nba_stats/#{NbaStats::VERSION} ruby gem (https://github.com/dagrz/nba_stats)"
10
+ DEFAULT_ACCEPT = 'application/json'
11
+
12
+ # Build accessor methods for every config options so we can do this
13
+ attr_accessor *VALID_CONFIG_KEYS
14
+
15
+ # Make sure we have the default values set when we get 'extended'
16
+ def self.extended(base)
17
+ base.reset
18
+ end
19
+
20
+ # Reset all options to default values
21
+ def reset
22
+ self.endpoint = DEFAULT_ENDPOINT
23
+ self.user_agent = DEFAULT_USER_AGENT
24
+ self.accept = DEFAULT_ACCEPT
25
+ end
26
+
27
+ def configure
28
+ yield self
29
+ end
30
+
31
+ def options
32
+ Hash[ * VALID_CONFIG_KEYS.map { |key| [key, send(key)] }.flatten ]
33
+ end
34
+
35
+ end # Configuration
36
+
37
+ end
@@ -0,0 +1,96 @@
1
+ module NbaStats
2
+
3
+ module Constants
4
+ LEAGUE_ID_NBA = '00'
5
+ LEAGUE_ID_WNBA = '10'
6
+ LEAGUE_ID_DLEAGUE = '20'
7
+ SEASON_TYPE_REGULAR = 'Regular Season'
8
+ SEASON_TYPE_PLAYOFFS = 'Playoffs'
9
+ SEASON_TYPE_ALL_STAR = 'All Star'
10
+ SEASON_SEGMENT_PRE_ALL_STAR = 'Pre All-Star'
11
+ SEASON_SEGMENT_POST_ALL_STAR = 'Post All-Star'
12
+ GRAPH_STAT_POINTS = 'PTS'
13
+ SEASON_FIRST = '1946-47'
14
+ PER_MODE_TOTALS = 'Totals'
15
+ PER_MODE_GAME = 'PerGame'
16
+ PER_MODE_MINUTES_PER = 'MinutesPer'
17
+ PER_MODE_48_MINUTES = 'Per48'
18
+ PER_MODE_40_MINUTES = 'Per40'
19
+ PER_MODE_36_MINUTES = 'Per36'
20
+ PER_MODE_MINUTE = 'PerMinute'
21
+ PER_MODE_POSSESSION = 'PerPossession'
22
+ PER_MODE_PLAY = 'PerPlay'
23
+ PER_MODE_100_POSSESSIONS = 'Per100Possessions'
24
+ PER_MODE_100_PLAYS = 'Per100Plays'
25
+ CONTEXT_MEASURE_FGM = 'FGM'
26
+ CONTEXT_MEASURE_FGA = 'FGA'
27
+ CONTEXT_MEASURE_FG_PCT = 'FG_PCT'
28
+ CONTEXT_MEASURE_FG3M = 'FG3M'
29
+ CONTEXT_MEASURE_FG3A = 'FG3A'
30
+ CONTEXT_MEASURE_FG3_PCT = 'FG3_PCT'
31
+ CONTEXT_MEASURE_PF = 'PF'
32
+ CONTEXT_MEASURE_EFG_PCT = 'EFG_PCT'
33
+ CONTEXT_MEASURE_TS_PCT = 'TS_PCT'
34
+ CONTEXT_MEASURE_PTS_FB = 'PTS_FB'
35
+ CONTEXT_MEASURE_PTS_OFF_TOV = 'PTS_OFF_TOV'
36
+ CONTEXT_MEASURE_PTS_2ND_CHANCE = 'PTS_2ND_CHANCE'
37
+ LOCATION_HOME = 'Home'
38
+ LOCATION_ROAD = 'Road'
39
+ OUTCOME_WIN = 'W'
40
+ OUTCOME_LOSS = 'L'
41
+ VS_CONFERENCE_EAST = 'East'
42
+ VS_CONFERENCE_WEST = 'West'
43
+ VS_DIVISION_ATLANTIC = 'Atlantic'
44
+ VS_DIVISION_CENTRAL = 'Central'
45
+ VS_DIVISION_NORTH_WEST = 'Northwest'
46
+ VS_DIVISION_PACIFIC = 'Pacific'
47
+ VS_DIVISION_SOUTH_EAST = 'Southeast'
48
+ VS_DIVISION_SOUTH_WEST = 'Southwest'
49
+ VS_DIVISION_EAST = 'East'
50
+ VS_DIVISION_WEST = 'West'
51
+ POSITION_GUARD = 'Guard'
52
+ POSITION_CENTER = 'Center'
53
+ POSITION_FORWARD = 'Forward'
54
+ GAME_SEGMENT_FIRST_HALF = 'First Half'
55
+ GAME_SEGMENT_SECOND_HALF = 'Overtime'
56
+ GAME_SEGMENT_OVERTIME = 'Second Half'
57
+ MEASURE_TYPE_BASE = 'Base'
58
+ MEASURE_TYPE_ADVANCED = 'Advanced'
59
+ MEASURE_TYPE_MISC = 'Misc'
60
+ MEASURE_TYPE_FOUR_FACTORS = 'Four Factors'
61
+ MEASURE_TYPE_SCORING = 'Scoring'
62
+ MEASURE_TYPE_OPPONENT = 'Opponent'
63
+ YES = 'Y'
64
+ NO = 'N'
65
+ GAME_SCOPE_SEASON = 'Season'
66
+ GAME_SCOPE_YESTERDAY = 'Yesterday'
67
+ GAME_SCOPE_LAST_10 = 'Last 10'
68
+ PLAYER_EXPERIENCE_ROOKIE = 'Rookie'
69
+ PLAYER_EXPERIENCE_SOPHOMORE = 'Sophomore'
70
+ PLAYER_EXPERIENCE_VETERAN = 'Veteran'
71
+ STARTER_BENCH_STARTERS = 'Starters'
72
+ STARTER_BENCH_BENCH = 'Bench'
73
+ PLAYER_POSITION_FORWARD = 'F'
74
+ PLAYER_POSITION_CENTER = 'C'
75
+ PLAYER_POSITION_GUARD = 'G'
76
+ PLAYER_POSITION_CENTER_FORWARD = 'C-F'
77
+ PLAYER_POSITION_FORWARD_CENTER = 'F-C'
78
+ PLAYER_POSITION_FORWARD_GUARD = 'F-G'
79
+ PLAYER_POSITION_GUARD_FORWARD = 'G-F'
80
+ CONF_BOTH = 'Both'
81
+ PLAYER_OR_TEAM_PLAYER = 'Player'
82
+ PLAYER_OR_TEAM_TEAM = 'Team'
83
+ PLAYER_SCOPE_ALL_PLAYERS = 'All Players'
84
+ PLAYER_SCOPE_ROOKIES = 'Rookies'
85
+ STAT_CATEGORY_POINTS = 'Points'
86
+ STAT_CATEGORY_REBOUNDS = 'Rebounds'
87
+ STAT_CATEGORY_ASSISTS = 'Assists'
88
+ STAT_CATEGORY_DEFENSE = 'Defense'
89
+ STAT_CATEGORY_CLUTCH = 'Clutch'
90
+ STAT_CATEGORY_PLAYMAKING = 'Playmaking'
91
+ STAT_CATEGORY_EFFICIENCY = 'Efficiency'
92
+ STAT_CATEGORY_FAST_BREAK = 'Fast Break'
93
+ STAT_CATEGORY_SCORING_BREAKDOWN = 'Scoring Breakdown'
94
+ end
95
+
96
+ end
@@ -0,0 +1,193 @@
1
+ require 'addressable/uri'
2
+ require 'nba_stats/client'
3
+
4
+ module NbaStats
5
+
6
+ module Discovery
7
+
8
+ # Given a full API call URI, generates template resource and stats classes
9
+ #
10
+ # @param discovery_uri [String]
11
+ # @return [String]
12
+ def self.discover(discovery_uri)
13
+ uri = Addressable::URI.parse(discovery_uri)
14
+ client = NbaStats::Client.new
15
+
16
+ output = ''
17
+ output += "Discovering #{class_name(uri.path).upcase}\n"
18
+ output += "------------------------------------------------\n"
19
+ output += "Path: #{uri.path}\n"
20
+ begin
21
+ client.get(uri.path, {})
22
+ rescue Exception => e
23
+ output += "Required parameters: #{e.message}\n"
24
+ end
25
+
26
+ uri.query_values.each do |key, value|
27
+ output += "#{key.underscore}=#{value}, "
28
+ end
29
+ output += "\n"
30
+
31
+ json = JSON.parse(client.get(uri.path, uri.query_values))
32
+ result_sets = json['resultSets']
33
+
34
+ output += stats(uri)
35
+ output += "\n"
36
+ output += resources(uri, result_sets)
37
+ output += "\n"
38
+ output += spec(uri)
39
+ output += "\n"
40
+ output
41
+ end
42
+
43
+ # Returns a best guess at the potential api name given a path
44
+ #
45
+ # @param path [String]
46
+ # @return [String]
47
+ def self.class_name(path)
48
+ path.split('/').last
49
+ end
50
+
51
+ # Generates a rough stats ruby file for the api call
52
+ #
53
+ # @param uri [String]
54
+ # @return [String]
55
+ def self.stats(uri)
56
+ output = "------------------------------------------------\n"
57
+ output += "/nba_stats/stats/#{class_name(uri.path)}.rb\n"
58
+ output += "------------------------------------------------\n"
59
+ output += "require 'nba_stats/resources/#{class_name(uri.path)}'
60
+
61
+ module NbaStats
62
+
63
+ module #{class_name(uri.path)}
64
+
65
+ # The path of the #{class_name(uri.path)} API
66
+ #{class_name(uri.path).upcase}_PATH = '#{uri.path}'
67
+
68
+ # Calls the #{class_name(uri.path)} API and returns a #{class_name(uri.path)} resource.
69
+ #
70
+ "
71
+ uri.query_values.each do |key, value|
72
+ output += " # @param #{key.underscore} [xxxxxxxxxx]\n"
73
+ end
74
+ output+=" # @return [NbaStats::Resources::#{class_name(uri.path)}]
75
+ def #{class_name(uri.path)}(\n"
76
+ uri.query_values.each do |key, value|
77
+ output += " #{key.underscore}=#{value},\n"
78
+ end
79
+ output += " )
80
+ NbaStats::Resources::#{class_name(uri.path)}.new(
81
+ get(#{class_name(uri.path).upcase}_PATH, {
82
+ "
83
+ uri.query_values.each do |key, value|
84
+ output += " :#{key} => #{key.underscore},\n"
85
+ end
86
+ output += " })
87
+ )
88
+ end
89
+
90
+ end # #{class_name(uri.path)}
91
+
92
+ end
93
+ "
94
+ output += '------------------------------------------------'
95
+ output
96
+ end
97
+
98
+ # Generates a rough resource ruby file for the api call
99
+ #
100
+ # @param uri [String]
101
+ # @param result_sets [Array]
102
+ # @return [String]
103
+ def self.resources(uri, result_sets)
104
+ output = "------------------------------------------------\n"
105
+ output += "/nba_stats/resources/#{class_name(uri.path)}.rb\n"
106
+ output += "------------------------------------------------\n"
107
+
108
+ output += "require 'nba_stats/resources/resource_base'
109
+ require 'nba_stats/constants'
110
+
111
+ module NbaStats
112
+
113
+ module Resources
114
+
115
+ class #{class_name(uri.path)} < ResourceBase
116
+
117
+ # Array of valid result set names for this resource
118
+ VALID_RESULT_SETS = [\n"
119
+
120
+ result_sets.each do |result_set|
121
+ output += " :#{result_set['name'].underscore},"
122
+ output += " #"
123
+ result_set['headers'].each do |h|
124
+ output += ":#{h.underscore}, "
125
+ end
126
+ output += "\n"
127
+ end
128
+
129
+ output +=" ].freeze
130
+
131
+ # @return [Array]
132
+ def valid_result_sets
133
+ VALID_RESULT_SETS
134
+ end
135
+
136
+ end # #{class_name(uri.path)}
137
+
138
+ end
139
+
140
+ end\n"
141
+ output += '------------------------------------------------'
142
+ output
143
+ end
144
+
145
+ # Generates a rough spec ruby file for the api call
146
+ #
147
+ # @param uri [String]
148
+ # @return [String]
149
+ def self.spec(uri)
150
+ output = "------------------------------------------------\n"
151
+ output += "/spec/client/#{class_name(uri.path)}_spec.rb\n"
152
+ output += "------------------------------------------------\n"
153
+
154
+ output += "require 'spec_helper'
155
+
156
+ describe 'NbaStats' do
157
+
158
+ describe 'client' do
159
+ client = NbaStats::Client.new
160
+
161
+ describe '.#{class_name(uri.path)}' do
162
+ #{class_name(uri.path)} = client.#{class_name(uri.path)}("
163
+
164
+ uri.query_values.each do |key, value|
165
+ output += "#{value}, "
166
+ end
167
+
168
+ output += ")
169
+ it 'should return a #{class_name(uri.path)} resource' do
170
+ expect(#{class_name(uri.path)}).to be_a NbaStats::Resources::#{class_name(uri.path)}
171
+ end
172
+ it 'should be named #{class_name(uri.path)}' do
173
+ expect(#{class_name(uri.path)}.name).to eq '#{class_name(uri.path)}'
174
+ end
175
+ NbaStats::Resources::#{class_name(uri.path)}::VALID_RESULT_SETS.each do |valid_result_set|
176
+ describe \".\#{valid_result_set}\" do
177
+ it 'should return an Array' do
178
+ expect(#{class_name(uri.path)}.send(valid_result_set)).to be_a Array
179
+ end
180
+ end
181
+ end
182
+ end # .#{class_name(uri.path)}
183
+
184
+ end # client
185
+
186
+ end\n"
187
+ output += '------------------------------------------------'
188
+ output
189
+ end
190
+
191
+ end # Discovery
192
+
193
+ end
@@ -0,0 +1,9 @@
1
+ module NbaStats
2
+
3
+ class BadRequestError < StandardError
4
+ end
5
+
6
+ class BadResponseError < StandardError
7
+ end
8
+
9
+ end
@@ -0,0 +1,10 @@
1
+ class String
2
+ def underscore
3
+ self.gsub(/::/, '/').
4
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
5
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
6
+ tr("-", "_").
7
+ downcase
8
+ end
9
+ end
10
+
@@ -0,0 +1,35 @@
1
+ require 'nba_stats/resources/resource_base'
2
+
3
+ module NbaStats
4
+
5
+ module Resources
6
+
7
+ class BoxScore < ResourceBase
8
+
9
+ # Array of valid result set names for this resource
10
+ VALID_RESULT_SETS = [
11
+ :game_summary, # :game_date_est, :game_sequence, :game_id, :game_status_id, :game_status_text, :gamecode, :home_team_id, :visitor_team_id, :season, :live_period, :live_pc_time, :natl_tv_broadcaster_abbreviation, :live_period_time_bcast, :wh_status
12
+ :line_score, # :game_date_est, :game_sequence, :game_id, :team_id, :team_abbreviation, :team_city_name, :team_wins_losses, :pts_qtr1, :pts_qtr2, :pts_qtr3, :pts_qtr4, :pts_ot1, :pts_ot2, :pts_ot3, :pts_ot4, :pts_ot5, :pts_ot6, :pts_ot7, :pts_ot8, :pts_ot9, :pts_ot10, :pts
13
+ :season_series, # :game_id, :home_team_id, :visitor_team_id, :game_date_est, :home_team_wins, :home_team_losses, :series_leader
14
+ :last_meeting, # :game_id, :last_game_id, :last_game_date_est, :last_game_home_team_id, :last_game_home_team_city, :last_game_home_team_name, :last_game_home_team_abbreviation, :last_game_home_team_points, :last_game_visitor_team_id, :last_game_visitor_team_city, :last_game_visitor_team_name, :last_game_visitor_team_city1, :last_game_visitor_team_points
15
+ :player_stats, # :game_id, :team_id, :team_abbreviation, :team_city, :player_id, :player_name, :start_position, :comment, :min, :fgm, :fga, :fg_pct, :fg3_m, :fg3_a, :fg3_pct, :ftm, :fta, :ft_pct, :oreb, :dreb, :reb, :ast, :stl, :blk, :to, :pf, :pts, :plus_minus
16
+ :team_stats, # :game_id, :team_id, :team_name, :team_abbreviation, :team_city, :min, :fgm, :fga, :fg_pct, :fg3_m, :fg3_a, :fg3_pct, :ftm, :fta, :ft_pct, :oreb, :dreb, :reb, :ast, :stl, :blk, :to, :pf, :pts, :plus_minus
17
+ :other_stats, # :league_id, :season_id, :team_id, :team_abbreviation, :team_city, :pts_paint, :pts_2_nd_chance, :pts_fb, :largest_lead, :lead_changes, :times_tied
18
+ :officials, # :official_id, :first_name, :last_name, :jersey_num
19
+ :game_info, # :game_date, :attendance, :game_time
20
+ :inactive_players, # :player_id, :first_name, :last_name, :jersey_num, :team_id, :team_city, :team_name, :team_abbreviation
21
+ :available_video, # :game_id, :video_available_flag, :pt_available
22
+ :player_track, # :game_id, :team_id, :team_abbreviation, :team_city, :player_id, :player_name, :start_position, :comment, :min, :spd, :dist, :orbc, :drbc, :rbc, :tchs, :sast, :ftast, :pass, :ast, :cfgm, :cfga, :cfg_pct, :ufgm, :ufga, :ufg_pct, :fg_pct, :dfgm, :dfga, :dfg_pct
23
+ :player_track_team # :game_id, :team_id, :team_nickname, :team_abbreviation, :team_city, :min, :dist, :orbc, :drbc, :rbc, :tchs, :sast, :ftast, :pass, :ast, :cfgm, :cfga, :cfg_pct, :ufgm, :ufga, :ufg_pct, :fg_pct, :dfgm, :dfga, :dfg_pct
24
+ ].freeze
25
+
26
+ # @return [Array]
27
+ def valid_result_sets
28
+ VALID_RESULT_SETS
29
+ end
30
+
31
+ end # BoxScore
32
+
33
+ end
34
+
35
+ end