pokerstats 2.0.14 → 2.0.16

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.14
1
+ 2.0.16
@@ -1,22 +1,22 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/hand_constants")
2
2
  module Pokerstats
3
- def class_index_from_hand_string(hand_string)
3
+ def class_index_from_hand_string(hand_string)
4
4
  return class_index_from_hand_string!(hand_string)
5
- rescue ArgumentError
5
+ rescue ArgumentError
6
6
  nil
7
- end
8
-
9
- def class_index_from_hand_string!(hand_string)
7
+ end
8
+
9
+ def class_index_from_hand_string!(hand_string)
10
10
  class_index_from_class_string!(class_string_from_hand_string!(hand_string))
11
- end
12
-
13
- def class_string_from_hand_string(hand_string)
11
+ end
12
+
13
+ def class_string_from_hand_string(hand_string)
14
14
  class_string_from_hand_string!(hand_string)
15
- rescue
15
+ rescue
16
16
  nil
17
- end
18
-
19
- def class_string_from_hand_string!(hand_string)
17
+ end
18
+
19
+ def class_string_from_hand_string!(hand_string)
20
20
  raise ArgumentError, "hand_string '#{hand_string}' must be a String" unless hand_string.kind_of?(String)
21
21
  hand_string = hand_string.gsub(/ /,'')
22
22
  hand_string = hand_string.upcase
@@ -39,15 +39,15 @@ module Pokerstats
39
39
  end
40
40
  result
41
41
  end
42
- end
43
-
44
- def class_index_from_class_string(class_string)
42
+ end
43
+
44
+ def class_index_from_class_string(class_string)
45
45
  class_index_from_class_string!(class_string)
46
- rescue
46
+ rescue
47
47
  nil
48
- end
49
-
50
- def class_index_from_class_string!(class_string)
48
+ end
49
+
50
+ def class_index_from_class_string!(class_string)
51
51
  raise ArgumentError, "class_string #{class_string.inspect} must be a String" unless class_string.kind_of?(String)
52
52
  class_string.upcase!
53
53
  first = Pokerstats::HandConstants::CARDS.index(class_string[0..0])
@@ -61,16 +61,16 @@ module Pokerstats
61
61
  13*second+first
62
62
  else raise ArgumentError, "class_string is malformed"
63
63
  end
64
- end
65
-
66
- def class_string_from_class_index(class_index)
64
+ end
65
+
66
+ def class_string_from_class_index(class_index)
67
67
  class_string_from_class_index!(class_index)
68
- rescue ArgumentError
68
+ rescue ArgumentError
69
69
  nil
70
- end
71
-
72
- def class_string_from_class_index!(class_index)
73
- raise ArgumentError, "class_index must be an integer" unless class_index.kind_of? Integer
70
+ end
71
+
72
+ def class_string_from_class_index!(class_index)
73
+ raise ArgumentError, "class_index (#{class_index.inspect}) must be an integer between 0 and 168" unless class_index.kind_of? Integer and class_index.between?(0,168)
74
74
  row, col = row_from_class_index(class_index), col_from_class_index(class_index)
75
75
  case row <=> col
76
76
  when 1
@@ -80,17 +80,21 @@ module Pokerstats
80
80
  when -1
81
81
  Pokerstats::HandConstants::CARDS[row..row] + Pokerstats::HandConstants::CARDS[col..col] + "s"
82
82
  end
83
- end
84
-
85
- def row_from_class_index(classIndex)
83
+ end
84
+
85
+ def row_from_class_index(classIndex)
86
86
  classIndex / 13
87
- end
88
-
89
- def col_from_class_index(classIndex)
87
+ end
88
+
89
+ def col_from_class_index(classIndex)
90
90
  classIndex % 13
91
- end
92
-
93
- def class_index_from_row_and_col(row, col)
94
- row*13 + col
95
- end
91
+ end
92
+
93
+ def class_index_from_row_and_col(row, col)
94
+ row*13 + col
95
+ end
96
+
97
+ class HandClass
98
+ extend Pokerstats
99
+ end
96
100
  end
@@ -15,6 +15,7 @@ module Pokerstats
15
15
  end
16
16
 
17
17
  def game
18
+ return nil if lines.empty?
18
19
  @parser_class.game lines.first
19
20
  end
20
21
 
@@ -241,6 +241,6 @@ module Pokerstats
241
241
  Dir[File.dirname(__FILE__) + "/plugins/*_statistics.rb"].each {|filename| require File.expand_path(filename)}
242
242
  HandStatistics.delegate_plugin_public_methods_except HandStatisticsAPI.public_methods
243
243
  end
244
- # Load Plugins and Delegate non-api public methods to plugins
244
+ # Load Plugins and Delegate non-api public methods to plugins#
245
245
  # puts Pokerstats::HandStatistics.hand_statistics_migration_data
246
246
  # puts Pokerstats::HandStatistics.player_statistics_migration_data
@@ -1,3 +1,4 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../hand_classification")
1
2
  module Pokerstats
2
3
  class CashStatistics < HandStatistics::Plugin
3
4
  def initialize handstatistics
@@ -107,7 +108,7 @@ module Pokerstats
107
108
  end
108
109
 
109
110
  def card_category_index(player)
110
- Pokerstats::class_index_from_hand_string(cards(player))
111
+ Pokerstats::HandClass.class_index_from_hand_string(cards(player))
111
112
  end
112
113
 
113
114
  def self.report_specification
@@ -66,6 +66,7 @@ module Pokerstats
66
66
 
67
67
  def self.game(lines)
68
68
  lines.lstrip!
69
+ return nil if lines.empty?
69
70
  case lines[/[^\n]+/].chomp
70
71
  when /PokerStars Game #([0-9]+): Tournament #([0-9]+), (\$[0-9+$]+) ([^\-]*) - Level ([IVXL]+) \((#{CASH})\/(#{CASH})\) - (.*)$/
71
72
  "PS#{$1}"
@@ -113,7 +114,19 @@ module Pokerstats
113
114
  :sb=> $6.to_d, :bb=> $7.to_d, :ante => "0.0".to_d,
114
115
  :played_at=> PokerstarsTimeStringConverter.new($8).as_utc_datetime,
115
116
  :street => :prelude, :board => "", :max_players => 0, :number_players => 0, :table_name => "",
116
- :game_type => "Hold'em", :limit_type => "No Limit", :stakes_type => cash_to_d($3)
117
+ :game_type => "Hold'em", :limit_type => "No Limit", :stakes_type => cash_to_d($3)
118
+ # when /PokerStars Game #([0-9]+): Tournament #([0-9]+), (#{CASH})\+(#{CASH}) USD Hold'em No Limit - Level ([IVXL]+) \((#{CASH})\/(#{CASH})\) - (.*)$/
119
+ # @stats.update_hand :name => "PS#{$1}", :description=> "#{$2}, #{$3}+#{$4} Hold'em No Limit", :tournament=> $2,
120
+ # :sb=> $6.to_d, :bb=> $7.to_d, :ante => "0.0".to_d,
121
+ # :played_at=> PokerstarsTimeStringConverter.new($8).as_utc_datetime,
122
+ # :street => :prelude, :board => "", :max_players => 0, :number_players => 0, :table_name => "",
123
+ # :game_type => "Hold'em", :limit_type => "No Limit", :stakes_type => cash_to_d($3)
124
+ when /PokerStars Game #([0-9]+): Tournament #([0-9]+), (Freeroll|(#{CASH})\+(#{CASH}) *(USD)?) +Hold'em No Limit - Level ([IVXL]+) \((#{CASH})\/(#{CASH})\) - (.*)$/
125
+ @stats.update_hand :name => "PS#{$1}", :description=> "#{$2}, #{$3} Hold'em No Limit", :tournament=> $2,
126
+ :sb=> $8.to_d, :bb=> $9.to_d, :ante => "0.0".to_d,
127
+ :played_at=> PokerstarsTimeStringConverter.new($10).as_utc_datetime,
128
+ :street => :prelude, :board => "", :max_players => 0, :number_players => 0, :table_name => "",
129
+ :game_type => "Hold'em", :limit_type => "No Limit", :stakes_type => cash_to_d($4)
117
130
  when /PokerStars Game #([0-9]+): +([^(]*)Hold'em No Limit \((#{CASH})\/(#{CASH})\) - (.*)$/
118
131
  @stats.update_hand :name => "PS#{$1}", :description=> "#{$2}Hold'em No Limit (#{$3}/#{$4})", :tournament=> nil,
119
132
  :sb=> cash_to_d($3), :bb=> cash_to_d($4), :ante => "0.0".to_d,
@@ -173,7 +186,7 @@ module Pokerstats
173
186
  @stats.register_action($1, 'raises', :result => :pay_to, :amount => cash_to_d($3))
174
187
  when /(.*) collected (.*) from ((side )|(main ))?pot/
175
188
  @stats.register_action($1, "wins", :result => :win, :amount => cash_to_d($2))
176
- when /(.*) mucks hand/
189
+ when /(.*): mucks hand/
177
190
  @stats.register_action($1, 'mucks', :result => :neutral)
178
191
  when /Seat [0-9]+: (.*) (\((small blind)|(big blind)|(button)\) )?showed \[([^\]]+)\] and ((won) \(#{CASH}\)|(lost)) with (.*)/
179
192
  when /Seat [0-9]+: (.*) mucked \[([^\]]+)\]/
@@ -185,6 +198,7 @@ module Pokerstats
185
198
  private
186
199
 
187
200
  def cash_to_d(string)
201
+ return "0".to_d if string.nil? || string.empty?
188
202
  string.gsub!(/[$, ]/,"")
189
203
  string.to_d
190
204
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{pokerstats}
8
- s.version = "2.0.14"
8
+ s.version = "2.0.16"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Andrew C. Greenberg"]
12
- s.date = %q{2009-11-18}
12
+ s.date = %q{2009-11-20}
13
13
  s.default_executable = %q{checkps}
14
14
  s.description = %q{a library for extracting, computing and reporting statistics of poker hands parsed from hand history files}
15
15
  s.email = %q{wizardwerdna@gmail.com}
@@ -53,6 +53,7 @@ Gem::Specification.new do |s|
53
53
  "spec/file_many_hands.txt",
54
54
  "spec/file_one_hand.txt",
55
55
  "spec/hand_classification_spec.rb",
56
+ "spec/hand_history_spec.rb",
56
57
  "spec/hand_statistics_spec.rb",
57
58
  "spec/hand_statistics_spec_helper.rb",
58
59
  "spec/player_statistics_spec.rb",
@@ -69,6 +70,7 @@ Gem::Specification.new do |s|
69
70
  s.summary = %q{poker hand history statistics library}
70
71
  s.test_files = [
71
72
  "spec/hand_classification_spec.rb",
73
+ "spec/hand_history_spec.rb",
72
74
  "spec/hand_statistics_spec.rb",
73
75
  "spec/hand_statistics_spec_helper.rb",
74
76
  "spec/player_statistics_spec.rb",
@@ -1,136 +1,135 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../lib/pokerstats/hand_classification')
3
3
 
4
- include Pokerstats
5
4
  describe "class_index_from_hand_string" do
6
5
  it "should recognize pairs" do
7
- Pokerstats::class_index_from_hand_string("AS AH").should == 0
8
- Pokerstats::class_index_from_hand_string("kd kc").should == 14
9
- Pokerstats::class_index_from_hand_string("2H 2D").should == 168
10
- Pokerstats::class_index_from_hand_string("KdkC").should == 14
11
- Pokerstats::class_index_from_hand_string(" Kd kC").should == 14
12
- Pokerstats::class_index_from_hand_string(" Kd kC ").should == 14
6
+ Pokerstats::HandClass.class_index_from_hand_string("AS AH").should == 0
7
+ Pokerstats::HandClass.class_index_from_hand_string("kd kc").should == 14
8
+ Pokerstats::HandClass.class_index_from_hand_string("2H 2D").should == 168
9
+ Pokerstats::HandClass.class_index_from_hand_string("KdkC").should == 14
10
+ Pokerstats::HandClass.class_index_from_hand_string(" Kd kC").should == 14
11
+ Pokerstats::HandClass.class_index_from_hand_string(" Kd kC ").should == 14
13
12
  end
14
13
  it "should recognize suited hands" do
15
- Pokerstats::class_index_from_hand_string("AS KS").should == 1
16
- Pokerstats::class_index_from_hand_string("AS 2S").should == 12
17
- Pokerstats::class_index_from_hand_string("3S 2S").should == 155
18
- Pokerstats::class_index_from_hand_string("AS 2s").should == 12
19
- Pokerstats::class_index_from_hand_string("aS 2S").should == 12
20
- Pokerstats::class_index_from_hand_string("As 2s").should == 12
14
+ Pokerstats::HandClass.class_index_from_hand_string("AS KS").should == 1
15
+ Pokerstats::HandClass.class_index_from_hand_string("AS 2S").should == 12
16
+ Pokerstats::HandClass.class_index_from_hand_string("3S 2S").should == 155
17
+ Pokerstats::HandClass.class_index_from_hand_string("AS 2s").should == 12
18
+ Pokerstats::HandClass.class_index_from_hand_string("aS 2S").should == 12
19
+ Pokerstats::HandClass.class_index_from_hand_string("As 2s").should == 12
21
20
  end
22
21
  it "should recognize unsuited hands" do
23
- Pokerstats::class_index_from_hand_string("AS Kh").should == 13
24
- Pokerstats::class_index_from_hand_string("Ad 2c").should == 156
25
- Pokerstats::class_index_from_hand_string("3c 2S").should == 167
26
- Pokerstats::class_index_from_hand_string("AS 2h").should == 156
27
- Pokerstats::class_index_from_hand_string("aS 2d").should == 156
28
- Pokerstats::class_index_from_hand_string("As 2c").should == 156
22
+ Pokerstats::HandClass.class_index_from_hand_string("AS Kh").should == 13
23
+ Pokerstats::HandClass.class_index_from_hand_string("Ad 2c").should == 156
24
+ Pokerstats::HandClass.class_index_from_hand_string("3c 2S").should == 167
25
+ Pokerstats::HandClass.class_index_from_hand_string("AS 2h").should == 156
26
+ Pokerstats::HandClass.class_index_from_hand_string("aS 2d").should == 156
27
+ Pokerstats::HandClass.class_index_from_hand_string("As 2c").should == 156
29
28
  end
30
29
  it "should not recognize malformed hands" do
31
- Pokerstats::class_index_from_hand_string("AS AS").should be_nil
32
- Pokerstats::class_index_from_hand_string("XS AH").should be_nil
33
- Pokerstats::class_index_from_hand_string("AS XH").should be_nil
34
- Pokerstats::class_index_from_hand_string("AX AS").should be_nil
35
- Pokerstats::class_index_from_hand_string("AX AX").should be_nil
36
- lambda{Pokerstats::class_index_from_hand_string!("AS AS")}.should raise_error(ArgumentError)
37
- lambda{Pokerstats::class_index_from_hand_string!("XS AH")}.should raise_error(ArgumentError)
38
- lambda{Pokerstats::class_index_from_hand_string!("AS XH")}.should raise_error(ArgumentError)
39
- lambda{Pokerstats::class_index_from_hand_string!("AX AS")}.should raise_error(ArgumentError)
40
- lambda{Pokerstats::class_index_from_hand_string!("AX AX")}.should raise_error(ArgumentError)
30
+ Pokerstats::HandClass.class_index_from_hand_string("AS AS").should be_nil
31
+ Pokerstats::HandClass.class_index_from_hand_string("XS AH").should be_nil
32
+ Pokerstats::HandClass.class_index_from_hand_string("AS XH").should be_nil
33
+ Pokerstats::HandClass.class_index_from_hand_string("AX AS").should be_nil
34
+ Pokerstats::HandClass.class_index_from_hand_string("AX AX").should be_nil
35
+ lambda{Pokerstats::HandClass.class_index_from_hand_string!("AS AS")}.should raise_error(ArgumentError)
36
+ lambda{Pokerstats::HandClass.class_index_from_hand_string!("XS AH")}.should raise_error(ArgumentError)
37
+ lambda{Pokerstats::HandClass.class_index_from_hand_string!("AS XH")}.should raise_error(ArgumentError)
38
+ lambda{Pokerstats::HandClass.class_index_from_hand_string!("AX AS")}.should raise_error(ArgumentError)
39
+ lambda{Pokerstats::HandClass.class_index_from_hand_string!("AX AX")}.should raise_error(ArgumentError)
41
40
  end
42
41
  end
43
42
  describe "class_index_from_class_string" do
44
43
  it "should recognize pairs" do
45
- Pokerstats::class_index_from_class_string("AA").should == 0
46
- Pokerstats::class_index_from_class_string("KK").should == 14
47
- Pokerstats::class_index_from_class_string("22").should == 168
48
- Pokerstats::class_index_from_class_string("KKp").should == 14
49
- Pokerstats::class_index_from_class_string("KKP").should == 14
44
+ Pokerstats::HandClass.class_index_from_class_string("AA").should == 0
45
+ Pokerstats::HandClass.class_index_from_class_string("KK").should == 14
46
+ Pokerstats::HandClass.class_index_from_class_string("22").should == 168
47
+ Pokerstats::HandClass.class_index_from_class_string("KKp").should == 14
48
+ Pokerstats::HandClass.class_index_from_class_string("KKP").should == 14
50
49
  end
51
50
  it "should recognize suited hands" do
52
- Pokerstats::class_index_from_class_string("AKs").should == 1
53
- Pokerstats::class_index_from_class_string("A2s").should == 12
54
- Pokerstats::class_index_from_class_string("32s").should == 155
55
- Pokerstats::class_index_from_class_string("A2S").should == 12
56
- Pokerstats::class_index_from_class_string("2As").should == 12
51
+ Pokerstats::HandClass.class_index_from_class_string("AKs").should == 1
52
+ Pokerstats::HandClass.class_index_from_class_string("A2s").should == 12
53
+ Pokerstats::HandClass.class_index_from_class_string("32s").should == 155
54
+ Pokerstats::HandClass.class_index_from_class_string("A2S").should == 12
55
+ Pokerstats::HandClass.class_index_from_class_string("2As").should == 12
57
56
  end
58
57
  it "should recognize unsuited hands" do
59
- Pokerstats::class_index_from_class_string("AKo").should == 13
60
- Pokerstats::class_index_from_class_string("A2o").should == 156
61
- Pokerstats::class_index_from_class_string("32o").should == 167
62
- Pokerstats::class_index_from_class_string("A2O").should == 156
63
- Pokerstats::class_index_from_class_string("A2").should == 156
64
- Pokerstats::class_index_from_class_string("2AO").should == 156
58
+ Pokerstats::HandClass.class_index_from_class_string("AKo").should == 13
59
+ Pokerstats::HandClass.class_index_from_class_string("A2o").should == 156
60
+ Pokerstats::HandClass.class_index_from_class_string("32o").should == 167
61
+ Pokerstats::HandClass.class_index_from_class_string("A2O").should == 156
62
+ Pokerstats::HandClass.class_index_from_class_string("A2").should == 156
63
+ Pokerstats::HandClass.class_index_from_class_string("2AO").should == 156
65
64
  end
66
65
  end
67
66
  describe "class_string_from_class_index" do
68
67
  it "should recognize pairs" do
69
- Pokerstats::class_string_from_class_index(0).should == "AA"
70
- Pokerstats::class_string_from_class_index(14).should == "KK"
71
- Pokerstats::class_string_from_class_index(168).should == "22"
68
+ Pokerstats::HandClass.class_string_from_class_index(0).should == "AA"
69
+ Pokerstats::HandClass.class_string_from_class_index(14).should == "KK"
70
+ Pokerstats::HandClass.class_string_from_class_index(168).should == "22"
72
71
  end
73
72
  it "should recognize suited hands" do
74
- Pokerstats::class_string_from_class_index(1).should == "AKs"
75
- Pokerstats::class_string_from_class_index(12).should == "A2s"
76
- Pokerstats::class_string_from_class_index(155).should == "32s"
73
+ Pokerstats::HandClass.class_string_from_class_index(1).should == "AKs"
74
+ Pokerstats::HandClass.class_string_from_class_index(12).should == "A2s"
75
+ Pokerstats::HandClass.class_string_from_class_index(155).should == "32s"
77
76
  end
78
77
  it "should recognize unsuited hands" do
79
- Pokerstats::class_string_from_class_index(13).should == "AKo"
80
- Pokerstats::class_string_from_class_index(156).should == "A2o"
81
- Pokerstats::class_string_from_class_index(167).should == "32o"
78
+ Pokerstats::HandClass.class_string_from_class_index(13).should == "AKo"
79
+ Pokerstats::HandClass.class_string_from_class_index(156).should == "A2o"
80
+ Pokerstats::HandClass.class_string_from_class_index(167).should == "32o"
82
81
  end
83
82
  end
84
83
  describe "row_from_class_index" do
85
84
  it "should recognize first row indices" do
86
- Pokerstats::row_from_class_index(0).should == 0
87
- Pokerstats::row_from_class_index(7).should == 0
88
- Pokerstats::row_from_class_index(12).should == 0
85
+ Pokerstats::HandClass.row_from_class_index(0).should == 0
86
+ Pokerstats::HandClass.row_from_class_index(7).should == 0
87
+ Pokerstats::HandClass.row_from_class_index(12).should == 0
89
88
  end
90
89
  it "should recognize middle row indices" do
91
- Pokerstats::row_from_class_index(78).should == 6
92
- Pokerstats::row_from_class_index(88).should == 6
93
- Pokerstats::row_from_class_index(90).should == 6
90
+ Pokerstats::HandClass.row_from_class_index(78).should == 6
91
+ Pokerstats::HandClass.row_from_class_index(88).should == 6
92
+ Pokerstats::HandClass.row_from_class_index(90).should == 6
94
93
  end
95
94
  it "should recognize last row indices" do
96
- Pokerstats::row_from_class_index(156).should == 12
97
- Pokerstats::row_from_class_index(165).should == 12
98
- Pokerstats::row_from_class_index(168).should == 12
95
+ Pokerstats::HandClass.row_from_class_index(156).should == 12
96
+ Pokerstats::HandClass.row_from_class_index(165).should == 12
97
+ Pokerstats::HandClass.row_from_class_index(168).should == 12
99
98
  end
100
99
  end
101
100
  describe "col_from_class_index" do
102
101
  it "should recognize first col indices" do
103
- Pokerstats::col_from_class_index(0).should == 0
104
- Pokerstats::col_from_class_index(78).should == 0
105
- Pokerstats::col_from_class_index(156).should == 0
102
+ Pokerstats::HandClass.col_from_class_index(0).should == 0
103
+ Pokerstats::HandClass.col_from_class_index(78).should == 0
104
+ Pokerstats::HandClass.col_from_class_index(156).should == 0
106
105
 
107
106
  end
108
107
  it "should recognize middle col indices" do
109
- Pokerstats::col_from_class_index(7).should == 7
110
- Pokerstats::col_from_class_index(85).should == 7
111
- Pokerstats::col_from_class_index(163).should == 7
108
+ Pokerstats::HandClass.col_from_class_index(7).should == 7
109
+ Pokerstats::HandClass.col_from_class_index(85).should == 7
110
+ Pokerstats::HandClass.col_from_class_index(163).should == 7
112
111
 
113
112
  end
114
113
  it "should recognize last col indices" do
115
- Pokerstats::col_from_class_index(12).should == 12
116
- Pokerstats::col_from_class_index(90).should == 12
117
- Pokerstats::col_from_class_index(168).should == 12
114
+ Pokerstats::HandClass.col_from_class_index(12).should == 12
115
+ Pokerstats::HandClass.col_from_class_index(90).should == 12
116
+ Pokerstats::HandClass.col_from_class_index(168).should == 12
118
117
  end
119
118
  end
120
119
  describe "class_index_from_row_and_col" do
121
120
  it "should recognize top row" do
122
- Pokerstats::class_index_from_row_and_col(0,0) == 0
123
- Pokerstats::class_index_from_row_and_col(0,7) == 7
124
- Pokerstats::class_index_from_row_and_col(0,12) == 12
121
+ Pokerstats::HandClass.class_index_from_row_and_col(0,0) == 0
122
+ Pokerstats::HandClass.class_index_from_row_and_col(0,7) == 7
123
+ Pokerstats::HandClass.class_index_from_row_and_col(0,12) == 12
125
124
  end
126
125
  it "should recognize middle row pairs" do
127
- Pokerstats::class_index_from_row_and_col(7,0) == 84
128
- Pokerstats::class_index_from_row_and_col(7,7) == 91
129
- Pokerstats::class_index_from_row_and_col(7,12) == 96
126
+ Pokerstats::HandClass.class_index_from_row_and_col(7,0) == 84
127
+ Pokerstats::HandClass.class_index_from_row_and_col(7,7) == 91
128
+ Pokerstats::HandClass.class_index_from_row_and_col(7,12) == 96
130
129
  end
131
130
  it "should recognize last row pairs" do
132
- Pokerstats::class_index_from_row_and_col(12,0) == 156
133
- Pokerstats::class_index_from_row_and_col(12,7) == 163
134
- Pokerstats::class_index_from_row_and_col(12,12) == 168
131
+ Pokerstats::HandClass.class_index_from_row_and_col(12,0) == 156
132
+ Pokerstats::HandClass.class_index_from_row_and_col(12,7) == 163
133
+ Pokerstats::HandClass.class_index_from_row_and_col(12,12) == 168
135
134
  end
136
135
  end
@@ -0,0 +1,86 @@
1
+ require 'rubygems'
2
+ require 'activesupport'
3
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/pokerstats/hand_history')
5
+
6
+ describe Pokerstats::HandHistory do
7
+ context "when created on an empty string" do
8
+ before(:each) do
9
+ @hand_history = Pokerstats::HandHistory.new([], "", 0)
10
+ end
11
+
12
+ it {@hand_history.should be_kind_of(Pokerstats::HandHistory)}
13
+ it {@hand_history.should_not be_parsed}
14
+ it "should not find a game" do
15
+ @hand_history.game.should be_nil
16
+ end
17
+ end
18
+
19
+ context "when created on a hand record" do
20
+ before(:each) do
21
+ lines = <<-HAND_HISTORY
22
+ PokerStars Game #24759011305: Tournament #139359808, $10+$1 Hold'em No Limit - Level I (10/20) - 2009/02/09 14:02:39 ET
23
+ Table '139359808 122' 9-max Seat #5 is the button
24
+ Seat 2: wizardwerdna (3000 in chips)
25
+ Seat 3: EEYORE_Q6 (3000 in chips)
26
+ Seat 4: bimbi76 (3020 in chips)
27
+ Seat 5: izibi (2970 in chips)
28
+ Seat 6: Spidar (2980 in chips) is sitting out
29
+ Seat 7: Little Dee (2900 in chips)
30
+ Seat 8: Gwünni (3000 in chips)
31
+ Seat 9: MartinBOF84 (3130 in chips)
32
+ Spidar: posts small blind 10
33
+ Little Dee: posts big blind 20
34
+ *** HOLE CARDS ***
35
+ Dealt to wizardwerdna [Qc 4d]
36
+ Gwünni: folds
37
+ MartinBOF84: folds
38
+ wizardwerdna: folds
39
+ EEYORE_Q6: calls 20
40
+ bimbi76: folds
41
+ izibi: calls 20
42
+ Spidar: folds
43
+ Little Dee: checks ""
44
+ *** FLOP *** [Ac Qs Ks]
45
+ Little Dee: checks
46
+ EEYORE_Q6: bets 20
47
+ izibi: raises 60 to 80
48
+ Little Dee: folds
49
+ EEYORE_Q6: calls 60
50
+ *** TURN *** [Ac Qs Ks] [Js]
51
+ EEYORE_Q6: checks
52
+ izibi: checks
53
+ *** RIVER *** [Ac Qs Ks Js] [8d]
54
+ EEYORE_Q6: bets 60
55
+ izibi: calls 60
56
+ *** SHOW DOWN ***
57
+ EEYORE_Q6: shows [2s Ah] (a pair of Aces)
58
+ izibi: shows [Ad 6d] (a pair of Aces)
59
+ EEYORE_Q6 collected 175 from pot
60
+ izibi collected 175 from pot
61
+ *** SUMMARY ***
62
+ Total pot 350 | Rake 0
63
+ Board [Ac Qs Ks Js 8d]
64
+ Seat 2: wizardwerdna folded before Flop (didn't bet)
65
+ Seat 3: EEYORE_Q6 showed [2s Ah] and won (175) with a pair of Aces
66
+ Seat 4: bimbi76 folded before Flop (didn't bet)
67
+ Seat 5: izibi (button) showed [Ad 6d] and won (175) with a pair of Aces
68
+ Seat 6: Spidar (small blind) folded before Flop
69
+ Seat 7: Little Dee (big blind) folded on the Flop
70
+ Seat 8: Gwünni folded before Flop (didn't bet)
71
+ Seat 9: MartinBOF84 folded before Flop (didn't bet)
72
+ HAND_HISTORY
73
+ @hand_history = Pokerstats::HandHistory.new(lines.split("\n"),"",0)
74
+ end
75
+ it "should have a game" do
76
+ @hand_history.game.should == "PS24759011305"
77
+ end
78
+ it "should have a parse" do
79
+ @hand_history.parse
80
+ @hand_history.should be_parsed
81
+ end
82
+ it "should have a report" do
83
+ lambda{@hand_history.reports}.should_not raise_error
84
+ end
85
+ end
86
+ end
@@ -1531,7 +1531,6 @@ describe HandStatistics do
1531
1531
  register_check @sb
1532
1532
  register_check @bb
1533
1533
  register_bet @button, 2
1534
- puts "last_aggr_player = #{@stats.last_aggr_player.inspect}"
1535
1534
  ["sb", "bb", "button"].each do |player|
1536
1535
  @stats.cbet_flop(player).should be_nil
1537
1536
  @stats.call_cbet_flop(player).should be_nil
@@ -54,6 +54,12 @@ describe PokerstarsHandHistoryParser, "recognizes valid hand history" do
54
54
  first_line = "PokerStars Game #21650436825: Tournament #117620218, $10+$1 Hold'em No Limit - Level I (10/20) - 2008/10/31 17:25:42 ET"
55
55
  PokerstarsHandHistoryParser.game(first_line).should == "PS21650436825"
56
56
  end
57
+
58
+ it "should recognize a valid tournament hand history" do
59
+ first_line = "PokerStars Game #33566683789: Tournament #199550385, $10+$1 USD Hold'em No Limit - Level XVIII (2000/4000) - 2009/10/02 22:00:29 ET"
60
+ PokerstarsHandHistoryParser.game(first_line).should == "PS33566683789"
61
+ end
62
+
57
63
  it "should recognize a valid cash game hand history" do
58
64
  first_line = "PokerStars Game #21650146783: Hold'em No Limit ($0.25/$0.50) - 2008/10/31 17:14:44 ET"
59
65
  PokerstarsHandHistoryParser.game(first_line).should == "PS21650146783"
@@ -89,6 +95,48 @@ describe PokerstarsHandHistoryParser, "when parsing structural matter" do
89
95
  )
90
96
  @parser.parse("PokerStars Game #21650436825: Tournament #117620218, $10+$1 Hold'em No Limit - Level I (10/20) - 2008/10/31 17:25:42 ET")
91
97
  end
98
+
99
+ it "should recognize a valid tournament hand history" do
100
+ @stats.should_receive(:update_hand).with(
101
+ :name => "PS33566683789",
102
+ :description => "199550385, $10+$1 USD Hold'em No Limit",
103
+ :ante => "0.0".to_d,
104
+ :table_name => "",
105
+ :max_players => 0,
106
+ :number_players => 0,
107
+ :sb => "2000".to_d,
108
+ :bb => "4000".to_d,
109
+ :played_at => DateTime.parse("2009/10/03 02:00:29 UDT"),
110
+ :tournament => "199550385",
111
+ :street => :prelude,
112
+ :board => "",
113
+ :game_type => "Hold'em",
114
+ :stakes_type => "10".to_d,
115
+ :limit_type => "No Limit"
116
+ )
117
+ @parser.parse("PokerStars Game #33566683789: Tournament #199550385, $10+$1 USD Hold'em No Limit - Level XVIII (2000/4000) - 2009/10/02 22:00:29 ET")
118
+ end
119
+
120
+ it "should recognize a freeroll tournament hand history" do
121
+ @stats.should_receive(:update_hand).with(
122
+ :name => "PS24703545200",
123
+ :description => "137653257, Freeroll Hold'em No Limit",
124
+ :ante => "0.0".to_d,
125
+ :table_name => "",
126
+ :max_players => 0,
127
+ :number_players => 0,
128
+ :sb => "10".to_d,
129
+ :bb => "20".to_d,
130
+ :played_at => DateTime.parse("Sun, 08 Feb 2009 00:24:12 +0000"),
131
+ :tournament => "137653257",
132
+ :street => :prelude,
133
+ :board => "",
134
+ :game_type => "Hold'em",
135
+ :stakes_type => "0".to_d,
136
+ :limit_type => "No Limit"
137
+ )
138
+ @parser.parse("PokerStars Game #24703545200: Tournament #137653257, Freeroll Hold'em No Limit - Level I (10/20) - 2009/02/07 19:24:12 ET")
139
+ end
92
140
 
93
141
  it "should recognize a tournament header" do
94
142
  PokerstarsHandHistoryParser.should have_valid_header("PokerStars Game #21650436825: Tournament #117620218, $10+$1 Hold'em No Limit - Level I (10/20) - 2008/10/31 17:25:42 ET\nsnuggles\n")
@@ -259,6 +307,6 @@ describe PokerstarsHandHistoryParser, "when parsing poker actions" do
259
307
  end
260
308
  it "should properly parse and register a muck" do
261
309
  @stats.should_receive(:register_action).with("billy", "mucks", :result => :neutral)
262
- @parser.parse("billy mucks hand")
310
+ @parser.parse("billy: mucks hand")
263
311
  end
264
312
  end
@@ -7,3 +7,22 @@ require 'spec/autorun'
7
7
  Spec::Runner.configure do |config|
8
8
 
9
9
  end
10
+
11
+ Spec::Matchers.define :be_hash_similar_with do |expected|
12
+ match do |actual|
13
+ @errors = []
14
+ for key in (expected.keys + actual.keys).uniq
15
+ @errors << {:expected => expected[key], :actual => actual[key], :key => key} unless expected[key] == actual[key]
16
+ end
17
+ @errors.empty?
18
+ end
19
+ failure_message_for_should do |hash|
20
+ @errors.collect{|each| "expected #{each[:key].inspect} to be #{each[:expected].inspect}, but got #{each[:actual].inspect}"}.join(";\n")
21
+ end
22
+ failure_message_for_should_not do |hash|
23
+ "the two elements are hash_similar"
24
+ end
25
+ description do
26
+ "have the same values for corresponding keys"
27
+ end
28
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pokerstats
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.14
4
+ version: 2.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew C. Greenberg
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-18 00:00:00 -08:00
12
+ date: 2009-11-20 00:00:00 -08:00
13
13
  default_executable: checkps
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -86,6 +86,7 @@ files:
86
86
  - spec/file_many_hands.txt
87
87
  - spec/file_one_hand.txt
88
88
  - spec/hand_classification_spec.rb
89
+ - spec/hand_history_spec.rb
89
90
  - spec/hand_statistics_spec.rb
90
91
  - spec/hand_statistics_spec_helper.rb
91
92
  - spec/player_statistics_spec.rb
@@ -124,6 +125,7 @@ specification_version: 3
124
125
  summary: poker hand history statistics library
125
126
  test_files:
126
127
  - spec/hand_classification_spec.rb
128
+ - spec/hand_history_spec.rb
127
129
  - spec/hand_statistics_spec.rb
128
130
  - spec/hand_statistics_spec_helper.rb
129
131
  - spec/player_statistics_spec.rb