bstats 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +8 -0
- data/README.md +21 -0
- data/bin/bstats +3 -0
- data/db/db_config.rb +8 -0
- data/db/migrate/create_player_batting_stats_table.rb +33 -0
- data/db/migrate/create_players_table.rb +21 -0
- data/db/temp.db +0 -0
- data/lib/bstats.rb +45 -0
- data/lib/bstats/batting_average_winner.rb +11 -0
- data/lib/bstats/data_persistence.rb +16 -0
- data/lib/bstats/number_crunch.rb +57 -0
- data/lib/bstats/player.rb +22 -0
- data/lib/bstats/player_batting_stat.rb +47 -0
- data/lib/bstats/winner.rb +17 -0
- data/spec/bstats/batting_average_winner_spec.rb +28 -0
- data/spec/bstats/number_crunch_spec.rb +37 -0
- data/spec/bstats/player_batting_stat_spec.rb +28 -0
- data/spec/bstats/player_spec.rb +20 -0
- data/spec/bstats/winner_spec.rb +45 -0
- data/spec/spec_helper.rb +1 -0
- metadata +70 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2ed7bce6b33ac9e017f6c4687fdfc01916ee9548
|
4
|
+
data.tar.gz: 013caea171c873a166ba53dc6519ebd9a4215110
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f91e8469424b27379b0267fd299463ce3f69e0dd83b70be5f17867abf157464d81fae2573308b0068a0e81d03b1ba17722666254173f03e1734c01ac5b7c37ee
|
7
|
+
data.tar.gz: 0e50363c7cab885e707bd236a4bc75d6ab4e548e82fb76a2785ca48e7706ce602d6ac612a00b878bc3a7a1fcc6bb6c321607a4df22e54608aa1a9ec89564525b
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# ruby-baseball-stats
|
2
|
+
A ruby gem that takes a couple CSVs and does a bit of numbers crunching to generate a few statistics.
|
3
|
+
## How To Install
|
4
|
+
First, the gem depends on a few other libraries:
|
5
|
+
* Active Record
|
6
|
+
* SQLite3
|
7
|
+
* RSpec (only needed if running the tests from source)
|
8
|
+
If you already have those, great, just install the gem and go. If not, there's a Gemfile in the source you can use with Bundler to get all the needed dependencies. Alternately, just install the gems individually, that works too.
|
9
|
+
### Installing The Gem
|
10
|
+
Just like any other local gem:
|
11
|
+
`sudo gem install bstats-1.0.0.gem`
|
12
|
+
## Running The Script
|
13
|
+
It comes pre-loaded with the stats and players needed to determine the stat winners, so after installing you can just run `bstats` from anywhere and see the results.
|
14
|
+
### Loading New Data
|
15
|
+
To load in new player and statistical data, run `sudo bstats import` from a directory containing the 'Master-small.csv' and 'Batting-07-12.csv' files.
|
16
|
+
|
17
|
+
## TODO List
|
18
|
+
* Import needs work:
|
19
|
+
** Move DB out of /Library/Ruby/Gems into user writable space so that 'sudo' isn't needed to write to it
|
20
|
+
** Allow more dynamic command line management, like filenames (OptionParser)
|
21
|
+
* Data model addresses immediate requirements only, could be broken out for more granular and performant data analysis
|
data/bin/bstats
ADDED
data/db/db_config.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../db_config'
|
2
|
+
|
3
|
+
class CreatePlayerBattingStatsTable < ActiveRecord::Migration
|
4
|
+
|
5
|
+
def up
|
6
|
+
create_table :player_batting_stats do |t|
|
7
|
+
t.string :external_id
|
8
|
+
t.string :year
|
9
|
+
t.string :league
|
10
|
+
t.string :team_id
|
11
|
+
t.integer :games, :default => 0
|
12
|
+
t.integer :at_bats, :default => 0
|
13
|
+
t.integer :runs, :default => 0
|
14
|
+
t.integer :hits, :default => 0
|
15
|
+
t.integer :doubles, :default => 0
|
16
|
+
t.integer :triples, :default => 0
|
17
|
+
t.integer :home_runs, :default => 0
|
18
|
+
t.integer :runs_batted_in, :default => 0
|
19
|
+
t.integer :stolen_bases, :default => 0
|
20
|
+
t.integer :caught_stealing, :default => 0
|
21
|
+
t.decimal :batting_average, :default => 0.0, :precision => 1, :scale => 3
|
22
|
+
t.decimal :slugging_percentage, :default => 0.0, :precision => 1, :scale => 3
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def down
|
27
|
+
drop_table :player_batting_stats if table_exists?(:player_batting_stats)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.table_exists?(name)
|
31
|
+
ActiveRecord::Base.connection.tables.include?(name)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../db_config'
|
2
|
+
|
3
|
+
class CreatePlayersTable < ActiveRecord::Migration
|
4
|
+
|
5
|
+
def up
|
6
|
+
create_table :players do |t|
|
7
|
+
t.string :external_id
|
8
|
+
t.integer :birth_year
|
9
|
+
t.string :first_name
|
10
|
+
t.string :last_name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def down
|
15
|
+
drop_table :players if table_exists?(:players)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.table_exists?(name)
|
19
|
+
ActiveRecord::Base.connection.tables.include?(name)
|
20
|
+
end
|
21
|
+
end
|
data/db/temp.db
ADDED
Binary file
|
data/lib/bstats.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative 'bstats/player'
|
2
|
+
require_relative 'bstats/player_batting_stat'
|
3
|
+
require_relative 'bstats/data_persistence'
|
4
|
+
require_relative 'bstats/number_crunch'
|
5
|
+
|
6
|
+
begin
|
7
|
+
if ARGV[0] == 'import'
|
8
|
+
dp = BStats::DataPersistence.new()
|
9
|
+
dp.teardown_db()
|
10
|
+
dp.initialize_db()
|
11
|
+
puts "Importing data..."
|
12
|
+
player_file = File.join(Dir.pwd, 'Master-small.csv')
|
13
|
+
stats_file = File.join(Dir.pwd, 'Batting-07-12.csv')
|
14
|
+
BStats::Player.import_csv(player_file)
|
15
|
+
BStats::PlayerBattingStat.import_csv(stats_file)
|
16
|
+
end
|
17
|
+
|
18
|
+
ba_winner = BStats::NumberCrunch.most_improved_batting_average(from_year=2009, to_year=2010)
|
19
|
+
puts "Most Improved Batting Average (2009-2010):"
|
20
|
+
puts "\tName: #{ba_winner}"
|
21
|
+
puts "\tBatting Average Improvement: #{ba_winner.percent_improved}"
|
22
|
+
|
23
|
+
|
24
|
+
puts "\r\n2007 Oakland A's Slugging Percentage:"
|
25
|
+
puts "Name\t\t\tSlugging Percentage"
|
26
|
+
BStats::NumberCrunch.team_slugging_percentage('OAK', 2007).each do |stat|
|
27
|
+
puts "#{stat.player.last_name}, #{stat.player.first_name}\t\t#{'%.3f' % stat.slugging_percentage}"
|
28
|
+
end
|
29
|
+
|
30
|
+
al11 = BStats::NumberCrunch.triple_crown_winner('AL', 2011)
|
31
|
+
puts "2011 AL Triple Crown Winner: #{al11}"
|
32
|
+
nl11 = BStats::NumberCrunch.triple_crown_winner('NL', 2011)
|
33
|
+
puts "2011 NL Triple Crown Winner: #{nl11}"
|
34
|
+
al12 = BStats::NumberCrunch.triple_crown_winner('AL', 2012)
|
35
|
+
puts "2012 AL Triple Crown Winner: #{al12}"
|
36
|
+
nl12 = BStats::NumberCrunch.triple_crown_winner('NL', 2012)
|
37
|
+
puts "2012 NL Triple Crown Winner: #{nl12}"
|
38
|
+
|
39
|
+
rescue Errno::ENOENT => e
|
40
|
+
puts "Files needed to import aren't in the directory calling this script. Include 'Master-small.csv' and 'Batting-07-12.csv' in the directory from which you execute this script."
|
41
|
+
rescue Exception => e
|
42
|
+
puts e.class
|
43
|
+
puts e.inspect
|
44
|
+
puts e.backtrace
|
45
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative '../../db/migrate/create_players_table'
|
2
|
+
require_relative '../../db/migrate/create_player_batting_stats_table'
|
3
|
+
|
4
|
+
module BStats
|
5
|
+
class DataPersistence
|
6
|
+
def initialize_db()
|
7
|
+
CreatePlayersTable.migrate(:up)
|
8
|
+
CreatePlayerBattingStatsTable.migrate(:up)
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown_db()
|
12
|
+
CreatePlayersTable.migrate(:down)
|
13
|
+
CreatePlayerBattingStatsTable.migrate(:down)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative '../../lib/bstats/player'
|
2
|
+
require_relative '../../lib/bstats/player_batting_stat'
|
3
|
+
require_relative 'winner'
|
4
|
+
require_relative 'batting_average_winner'
|
5
|
+
|
6
|
+
module BStats
|
7
|
+
class NumberCrunch
|
8
|
+
def self.most_improved_batting_average(from_year, to_year, min_at_bats=200)
|
9
|
+
winner = BattingAverageWinner.new()
|
10
|
+
get_grouped_at_bats(from_year, min_at_bats).each do |y1stat|
|
11
|
+
get_grouped_at_bats(to_year, min_at_bats).each do | y2stat |
|
12
|
+
if ((y2stat.hits_sum.to_f / y2stat.at_bats_sum.to_f) - (y1stat.hits_sum.to_f / y1stat.at_bats_sum.to_f)) > winner.percent_improved
|
13
|
+
winner.percent_improved = ((y2stat.hits_sum.to_f / y2stat.at_bats_sum.to_f) - (y1stat.hits_sum.to_f / y1stat.at_bats_sum.to_f)).round(3)
|
14
|
+
winner.player = y2stat.player
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
return winner
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.team_slugging_percentage(team_id, year)
|
22
|
+
PlayerBattingStat.where("team_id = ? AND year = ?", team_id, year)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.triple_crown_winner(league, year, min_at_bats=400)
|
26
|
+
winner = Winner.new()
|
27
|
+
btwinner = get_batting_title_winner(league, year, min_at_bats)
|
28
|
+
home_run_king = get_home_run_king(league, year, min_at_bats)
|
29
|
+
if btwinner.external_id == home_run_king.external_id
|
30
|
+
most_rbis = get_most_rbis(league, year, min_at_bats)
|
31
|
+
if btwinner.external_id == most_rbis.external_id
|
32
|
+
winner.player = btwinner.player
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return winner
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def self.get_grouped_at_bats(year, min_at_bats=200)
|
41
|
+
PlayerBattingStat.select(:id, :external_id, :year, "SUM(at_bats) as at_bats_sum", "SUM(hits) as hits_sum").where("year = ?", year).group(:external_id).having("sum(at_bats) >= ?", min_at_bats)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.get_batting_title_winner(league, year, min_at_bats)
|
45
|
+
PlayerBattingStat.where("league = ? AND year = ? AND at_bats >= ?", league, year, min_at_bats).order('batting_average DESC').first
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get_home_run_king(league, year, min_at_bats)
|
49
|
+
PlayerBattingStat.where("league = ? AND year = ? AND at_bats >= ?", league, year, min_at_bats).order('home_runs DESC').first
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.get_most_rbis(league, year, min_at_bats)
|
53
|
+
PlayerBattingStat.where("league = ? AND year = ? AND at_bats >= ?", league, year, min_at_bats).order('runs_batted_in DESC').first
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../../db/db_config'
|
2
|
+
require 'csv'
|
3
|
+
|
4
|
+
module BStats
|
5
|
+
class Player < ActiveRecord::Base
|
6
|
+
has_many :player_batting_stats, :class_name => 'PlayerBattingStat', :foreign_key => 'external_id', :primary_key => 'external_id'
|
7
|
+
|
8
|
+
validates :external_id, presence: true
|
9
|
+
validates :birth_year, numericality: true
|
10
|
+
|
11
|
+
def self.import_csv(file)
|
12
|
+
CSV.foreach(file, headers: true) do |row|
|
13
|
+
player = Player.new()
|
14
|
+
player.external_id = row['playerID'].to_s
|
15
|
+
player.birth_year = row['birthYear'].to_i
|
16
|
+
player.first_name = row['nameFirst'].to_s
|
17
|
+
player.last_name = row['nameLast'].to_s
|
18
|
+
player.save
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative '../../db/db_config'
|
2
|
+
require 'csv'
|
3
|
+
|
4
|
+
module BStats
|
5
|
+
class PlayerBattingStat < ActiveRecord::Base
|
6
|
+
belongs_to :player, :class_name => "Player", :foreign_key => 'external_id', :primary_key => 'external_id'
|
7
|
+
|
8
|
+
validates :external_id, presence: true
|
9
|
+
validates :games, :at_bats, :runs, :hits, :doubles, :triples, :home_runs, :runs_batted_in, :stolen_bases, :caught_stealing, numericality: true
|
10
|
+
|
11
|
+
def self.import_csv(file)
|
12
|
+
begin
|
13
|
+
CSV.foreach(file, headers: true) do |row|
|
14
|
+
stat = PlayerBattingStat.new()
|
15
|
+
stat.external_id = row['playerID'].to_s
|
16
|
+
stat.year = row['yearID'].to_s
|
17
|
+
stat.league = row['league'].to_s
|
18
|
+
stat.team_id = row['teamID'].to_s
|
19
|
+
stat.games = row['G'].to_i
|
20
|
+
stat.at_bats = row['AB'].to_i
|
21
|
+
stat.runs = row['R'].to_i
|
22
|
+
stat.hits = row['H'].to_i
|
23
|
+
stat.doubles = row['2B'].to_i
|
24
|
+
stat.triples = row['3B'].to_i
|
25
|
+
stat.home_runs = row['HR'].to_i
|
26
|
+
stat.runs_batted_in = row['RBI'].to_i
|
27
|
+
stat.stolen_bases = row['SB'].to_i
|
28
|
+
stat.caught_stealing = row['CS'].to_i
|
29
|
+
stat.batting_average = self.calculate_batting_average(stat.hits, stat.at_bats)
|
30
|
+
stat.slugging_percentage = self.calculate_slugging_percentage(stat.hits, stat.doubles, stat.triples, stat.home_runs, stat.at_bats)
|
31
|
+
stat.save
|
32
|
+
end
|
33
|
+
rescue CSV::MalformedCSVError => e
|
34
|
+
# certain csv's have file endings that the CSV library doesn't like. Windows may or may not have something to do with that
|
35
|
+
# TODO: log file ending failure
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.calculate_batting_average(hits, at_bats)
|
40
|
+
[0, "0", ""].include?(at_bats) ? 0 : (hits.to_f / at_bats.to_f).round(3)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.calculate_slugging_percentage(hits, doubles, triples, home_runs, at_bats)
|
44
|
+
[0, "0", ""].include?(at_bats) ? 0 : (((hits - doubles - triples - home_runs) + (2 * doubles) + (3 * triples) + (4 * home_runs)).to_f / at_bats).round(3)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module BStats
|
2
|
+
class Winner
|
3
|
+
attr_accessor :player
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@player = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def awarded?
|
10
|
+
[nil, ""].include?(@player) ? false : true
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
awarded? ? "#{@player.last_name}, #{@player.first_name}" : "No winner."
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bstats/batting_average_winner'
|
3
|
+
require 'bstats/player'
|
4
|
+
|
5
|
+
module BStats
|
6
|
+
describe BattingAverageWinner do
|
7
|
+
describe "before being loaded with a player" do
|
8
|
+
before do
|
9
|
+
@winner = BattingAverageWinner.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return 0 improvement" do
|
13
|
+
expect(@winner.percent_improved).to eq(0)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "after being loaded" do
|
18
|
+
before do
|
19
|
+
@winner = BattingAverageWinner.new
|
20
|
+
@winner.percent_improved = 0.345
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return the right improvement percentage" do
|
24
|
+
expect(@winner.percent_improved).to eq(0.345)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bstats/number_crunch'
|
3
|
+
require 'bstats/batting_average_winner'
|
4
|
+
|
5
|
+
module BStats
|
6
|
+
describe NumberCrunch do
|
7
|
+
describe "calculating batting average" do
|
8
|
+
before do
|
9
|
+
@stat1 = mock_model(
|
10
|
+
PlayerBattingStat, :external_id => "cabremi01", :year => "2011", :league => "AL", :team_id => "DET", :games => 161, :at_bats => 622, :runs => 109, :hits => 205, :doubles => 40, :triples => 0, :home_runs => 44, :runs_batted_in => 139, :stolen_bases => 4, :caught_stealing => 1, :hits_sum => 205, :at_bats_sum => 622
|
11
|
+
)
|
12
|
+
@stat2 = mock_model(
|
13
|
+
PlayerBattingStat, :external_id => "cabremi01", :year => "2012", :league => "AL", :team_id => "DET", :games => 161, :at_bats => 622, :runs => 109, :hits => 205, :doubles => 40, :triples => 0, :home_runs => 44, :runs_batted_in => 139, :stolen_bases => 4, :caught_stealing => 1, :hits_sum => 205, :at_bats_sum => 622
|
14
|
+
)
|
15
|
+
@stats = [@stat1, @stat2]
|
16
|
+
allow(NumberCrunch).to receive(:get_grouped_at_bats).and_return(@stats)
|
17
|
+
end
|
18
|
+
it "finds the most improved batting average" do
|
19
|
+
expect(NumberCrunch.most_improved_batting_average('2007', '2008').percent_improved).to eq(0)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
describe "calculating triple crown winner" do
|
23
|
+
before do
|
24
|
+
@player = mock_model(Player, :external_id => "cabremi01" )
|
25
|
+
@stat2 = mock_model(
|
26
|
+
PlayerBattingStat, :external_id => "cabremi01", :year => "2012", :league => "AL", :team_id => "DET", :games => 161, :at_bats => 622, :runs => 109, :hits => 205, :doubles => 40, :triples => 0, :home_runs => 44, :runs_batted_in => 139, :stolen_bases => 4, :caught_stealing => 1, :hits_sum => 205, :at_bats_sum => 622, :player => @player
|
27
|
+
)
|
28
|
+
allow(NumberCrunch).to receive(:get_batting_title_winner).and_return(@stat2)
|
29
|
+
allow(NumberCrunch).to receive(:get_home_run_king).and_return(@stat2)
|
30
|
+
allow(NumberCrunch).to receive(:get_most_rbis).and_return(@stat2)
|
31
|
+
end
|
32
|
+
it "finds the triple crown winner" do
|
33
|
+
expect(NumberCrunch.triple_crown_winner("AL", "2012").player.external_id).to eq("cabremi01")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'csv'
|
3
|
+
require 'bstats/player_batting_stat'
|
4
|
+
|
5
|
+
module BStats
|
6
|
+
describe PlayerBattingStat do
|
7
|
+
|
8
|
+
describe "Importing a CSV" do
|
9
|
+
let(:data) { "abercre01\t2007\tNL\tFLO\t35\t76\t16\t15\t3\t0\t2\t5\t7\t1\rabreubo01\t2012\tAL\tLAA\t8\t24\t1\t5\t3\t0\t0\t5\t0\t0" }
|
10
|
+
before do
|
11
|
+
allow(CSV).to receive(:foreach).with("file_path", headers: true).and_return(data)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should read the CSV it is passed" do
|
15
|
+
expect(PlayerBattingStat.import_csv("file_path")).to eq(data)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "calculating stats" do
|
20
|
+
it "should calculate the batting average" do
|
21
|
+
expect(PlayerBattingStat.calculate_batting_average(3, 9)).to eq(0.333)
|
22
|
+
end
|
23
|
+
it "should calculate the slugging percentage" do
|
24
|
+
expect(PlayerBattingStat.calculate_slugging_percentage(15, 3, 0, 2, 76)).to eq(0.316)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'csv'
|
3
|
+
require 'bstats/player'
|
4
|
+
|
5
|
+
module BStats
|
6
|
+
describe Player do
|
7
|
+
|
8
|
+
describe "Importing a CSV" do
|
9
|
+
let(:data) { "id1\t1900\tfirst\tlast\rid2\t1901\tfirst2\tlast2"}
|
10
|
+
|
11
|
+
before do
|
12
|
+
allow(CSV).to receive(:foreach).with("file_path", headers: true).and_return(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should read the CSV it is passed" do
|
16
|
+
expect(Player.import_csv("file_path")).to eq(data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bstats/winner'
|
3
|
+
require 'bstats/player'
|
4
|
+
|
5
|
+
module BStats
|
6
|
+
describe Winner do
|
7
|
+
describe "before being loaded with a player" do
|
8
|
+
before do
|
9
|
+
@winner = Winner.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should have no player" do
|
13
|
+
expect(@winner.player).to eq(nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should not report awarded" do
|
17
|
+
expect(@winner.awarded?).to be_falsey
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should read no winner" do
|
21
|
+
expect(@winner.to_s).to eq("No winner.")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "after being loaded with a player" do
|
26
|
+
before do
|
27
|
+
@player = mock_model(Player, :last_name => "Baseball", :first_name => "Mr" )
|
28
|
+
@winner = Winner.new
|
29
|
+
@winner.player = @player
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should have a player" do
|
33
|
+
expect(@winner.player).to eq(@player)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should report awarded" do
|
37
|
+
expect(@winner.awarded?).to be_truthy
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should read winners name" do
|
41
|
+
expect(@winner.to_s).to eq("Baseball, Mr")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rspec/active_model/mocks'
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bstats
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Troy Stauffer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A ruby gem that takes a couple CSVs and does a bit of numbers crunching
|
14
|
+
to generate a few statistics.
|
15
|
+
email: troystauffer@gmail.com
|
16
|
+
executables:
|
17
|
+
- bstats
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/bstats
|
22
|
+
- db/db_config.rb
|
23
|
+
- db/migrate/create_player_batting_stats_table.rb
|
24
|
+
- db/migrate/create_players_table.rb
|
25
|
+
- db/temp.db
|
26
|
+
- lib/bstats/batting_average_winner.rb
|
27
|
+
- lib/bstats/data_persistence.rb
|
28
|
+
- lib/bstats/number_crunch.rb
|
29
|
+
- lib/bstats/player.rb
|
30
|
+
- lib/bstats/player_batting_stat.rb
|
31
|
+
- lib/bstats/winner.rb
|
32
|
+
- lib/bstats.rb
|
33
|
+
- spec/bstats/batting_average_winner_spec.rb
|
34
|
+
- spec/bstats/number_crunch_spec.rb
|
35
|
+
- spec/bstats/player_batting_stat_spec.rb
|
36
|
+
- spec/bstats/player_spec.rb
|
37
|
+
- spec/bstats/winner_spec.rb
|
38
|
+
- spec/spec_helper.rb
|
39
|
+
- Gemfile
|
40
|
+
- README.md
|
41
|
+
homepage:
|
42
|
+
licenses: []
|
43
|
+
metadata: {}
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '2.0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 2.0.14
|
61
|
+
signing_key:
|
62
|
+
specification_version: 4
|
63
|
+
summary: Baseball Statistics Analysis Tool
|
64
|
+
test_files:
|
65
|
+
- spec/bstats/batting_average_winner_spec.rb
|
66
|
+
- spec/bstats/number_crunch_spec.rb
|
67
|
+
- spec/bstats/player_batting_stat_spec.rb
|
68
|
+
- spec/bstats/player_spec.rb
|
69
|
+
- spec/bstats/winner_spec.rb
|
70
|
+
- spec/spec_helper.rb
|