nba-stats 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 135e3449da27b9a969d28c42c820ff4c1339cd22
4
+ data.tar.gz: c18b967ef7fb3aca35e915b3c109bc97df995cf0
5
+ SHA512:
6
+ metadata.gz: 7f22a038243150407057d84d4a9c6c8022f38b1cc9ba10a8b57489008105cf1f3f61951569c1c3e9e8070d33cb8d1975020d2fe53decfcf2f5d69d15b77d2fe4
7
+ data.tar.gz: 80cfb062fa46fb28d61e68ecd2b0ebc1a3baf12f5afcfeffc56f55946ae6179d6bae28e0a8a58e482a83b0e0c112e3897aea69f2550064db5f1b30edf0433839
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/nba_stats'
4
+
5
+ NbaStats::CLI.new.call
@@ -0,0 +1,4 @@
1
+ module NbaStats
2
+ end
3
+
4
+ require_relative '../config/environment'
@@ -0,0 +1,73 @@
1
+ class NbaStats::CLI
2
+
3
+ def call
4
+ start
5
+ end
6
+
7
+ def start
8
+ puts "Welcome to the NBA Stats CLI Gem"
9
+ puts "Here's the list of current teams"
10
+ make_teams
11
+ NbaStats::Team.all.each do |team|
12
+ puts team.name
13
+ end
14
+
15
+ choose_team
16
+ choose_player
17
+
18
+ puts "Do you want to look up another player on this team? y/n"
19
+ response = gets.strip
20
+ while response == "y"
21
+ choose_player
22
+ puts "Do you want to look up another player on this team? y/n"
23
+ response = gets.strip
24
+ end
25
+
26
+ puts "Do you want to look up another team? y/n"
27
+ response = gets.strip
28
+ if response == "y"
29
+ start
30
+ end
31
+ end
32
+
33
+ def make_teams
34
+ teams_array = NbaStats::Scraper.get_teams
35
+ NbaStats::Team.create_from_collection(teams_array)
36
+ end
37
+
38
+ def choose_team
39
+ puts "Enter a team name to see their roster: "
40
+ requested_team = gets.strip
41
+ while !NbaStats::Team.team_names.include? requested_team
42
+ puts "That team doesn't exist. Try again."
43
+ requested_team = gets.strip
44
+ end
45
+ team = NbaStats::Team.all.detect {|team| team.name == requested_team}
46
+ team.add_players
47
+ puts team.name + " roster:"
48
+ rows = [["Number", "Name", "Position", "Height", "Experience"]]
49
+ team.players.each do |player|
50
+ rows << [player.number, player.name, player.position, player.height, player.experience]
51
+ end
52
+ roster_table = Terminal::Table.new rows: rows
53
+ puts roster_table
54
+ end
55
+
56
+ def choose_player
57
+ puts "Enter a player name to see their individual stats: "
58
+ requested_player = gets.strip
59
+ while !NbaStats::Player.player_names.include? requested_player
60
+ puts "That player isn't on this team. Try again."
61
+ requested_player = gets.strip
62
+ end
63
+ player = NbaStats::Player.all.detect {|player| player.name == requested_player}
64
+ stats_hash = NbaStats::Scraper.get_player_stats(player)
65
+ player.add_player_stats(stats_hash)
66
+ rows = [["Points/Game", "Assists/Game", "Rebounds/Game", "Blocks/Game", "Steals/Game", "FG%", "3P%", "FT%", "Minutes/Game",]]
67
+ rows << [player.points_pg, player.assists_pg, player.rebounds_pg, player.blocks_pg, player.steals_pg, player.fg_percentage, player.three_percentage, player.ft_percentage, player.minutes_pg]
68
+ puts "Here are #{player.name}'s 2015-16 stats: "
69
+ stats_table = Terminal::Table.new rows: rows
70
+ puts stats_table
71
+ end
72
+
73
+ end
@@ -0,0 +1,39 @@
1
+ class NbaStats::Player
2
+ attr_accessor :name, :team, :number, :player_url, :position, :height, :experience, :points_pg, :assists_pg, :rebounds_pg, :blocks_pg, :steals_pg, :minutes_pg, :fg_percentage, :three_percentage, :ft_percentage
3
+
4
+ @@all = []
5
+ def initialize(player_hash)
6
+ player_hash.each do |key, value|
7
+ self.send("#{key}=", value)
8
+ end
9
+ @@all << self
10
+ end
11
+
12
+ def self.create_from_collection(players_array)
13
+ players_array.each do |player|
14
+ new_player = NbaStats::Player.new(player)
15
+ end
16
+ end
17
+
18
+ def self.create_from_collection_with_team(players_array, team)
19
+ players_array.each do |player|
20
+ new_player = NbaStats::Player.new(player)
21
+ new_player.team = team
22
+ team.players << new_player
23
+ end
24
+ end
25
+
26
+ def add_player_stats(stats_hash)
27
+ stats_hash.each do |key,value|
28
+ self.send("#{key}=", value)
29
+ end
30
+ end
31
+
32
+ def self.all
33
+ @@all
34
+ end
35
+
36
+ def self.player_names
37
+ @@all.collect {|player| player.name}
38
+ end
39
+ end
@@ -0,0 +1,64 @@
1
+ class NbaStats::Scraper
2
+
3
+ def self.open_page(url)
4
+ Nokogiri::HTML(open(url))
5
+ end
6
+
7
+ # Returns an array of hashes with current team names and links to 2015-16 team page
8
+ def self.get_teams
9
+ page = open_page("http://www.basketball-reference.com/teams")
10
+ teams_array = []
11
+ teams = page.css("table#active tr.full_table a")
12
+ teams.each do |team|
13
+ name = team.text
14
+ team_url = "http://www.basketball-reference.com"+ team["href"] + "2016.html"
15
+ hash = {name: name, team_url: team_url}
16
+ teams_array << hash
17
+ end
18
+ teams_array
19
+ end
20
+
21
+ def self.get_roster(team)
22
+ page = open_page(team.team_url)
23
+ players_array = []
24
+ players = page.css("table#roster tr")
25
+ players.drop(1).each do |player|
26
+ data_array = player.text.split("\n").map {|x| x.strip}
27
+ number = data_array[1]
28
+ name = data_array[2]
29
+ position = data_array[3]
30
+ height = data_array[4]
31
+ data_array[8] == "R" ? experience = "Rookie" : experience = data_array[8] + " Years"
32
+
33
+ #Below is messy workaround
34
+ #Cleaner player.css("a").first["href"] works outside of .each loop, but returns "undefined method '[]' for nil" inside .each
35
+ player_url = player.css("a").map {|element| element["href"]}.first
36
+ player_url = "http://www.basketball-reference.com" + player_url.to_s
37
+
38
+ hash = {name: name, number: number, position: position, height: height, experience: experience, player_url: player_url}
39
+ players_array << hash
40
+ end
41
+ players_array
42
+ end
43
+
44
+ def self.get_player_stats(player)
45
+ page = open_page(player.player_url)
46
+
47
+ season = page.css("table#per_game tr.full_table").last
48
+ stats_array = season.text.gsub("\n", "").strip.split(" ")
49
+
50
+ stats_hash = {
51
+ points_pg: stats_array[29],
52
+ assists_pg: stats_array[24],
53
+ rebounds_pg: stats_array[23],
54
+ blocks_pg: stats_array[26],
55
+ steals_pg: stats_array[25],
56
+ minutes_pg: stats_array[7],
57
+ fg_percentage: stats_array[10],
58
+ three_percentage: stats_array[13],
59
+ ft_percentage: stats_array[20]
60
+ }
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,34 @@
1
+ class NbaStats::Team
2
+
3
+ attr_accessor :name, :team_url, :players
4
+
5
+ @@all = []
6
+
7
+ def initialize(team_hash)
8
+ team_hash.each do |key, value|
9
+ self.send("#{key}=", value)
10
+ end
11
+ @players = []
12
+ @@all << self
13
+ end
14
+
15
+ def add_players
16
+ players_array = NbaStats::Scraper.get_roster(self)
17
+ NbaStats::Player.create_from_collection_with_team(players_array, self)
18
+ end
19
+
20
+ def self.create_from_collection(teams_array)
21
+ teams_array.each do |team|
22
+ new_team = NbaStats::Team.new(team)
23
+ end
24
+ end
25
+
26
+ def self.all
27
+ @@all
28
+ end
29
+
30
+ def self.team_names
31
+ @@all.collect {|team| team.name }
32
+ end
33
+
34
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nba-stats
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alex Barron
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '1.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '1.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: term-ansicolor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: terminal-table
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.5.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.5.2
111
+ description: A command line interface for looking 2015-16 NBA player stats
112
+ email: alexbarron@gmail.com
113
+ executables:
114
+ - nba-stats
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - bin/nba-stats
119
+ - lib/nba_stats.rb
120
+ - lib/nba_stats/cli.rb
121
+ - lib/nba_stats/player.rb
122
+ - lib/nba_stats/scraper.rb
123
+ - lib/nba_stats/team.rb
124
+ homepage: http://rubygems.org/gems/nba-stats
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.4.8
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: NBA Stats
148
+ test_files: []