pokerstats 2.0.16 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.16
1
+ 2.0.17
@@ -76,19 +76,27 @@ def dopsfile(file, players_shown)
76
76
  STDOUT.sync = false
77
77
  puts "=" * file.size
78
78
  reports = statistics.reports
79
- printf "%-20s %3s %4s %4s %5s %5s %5s %5s %s\n", "Screen Name", "Num", "VP$%", "PFR%", "Pre/Pos", "BAtt%", "BDef%", "CBet%", "Poker-Edge Description"
80
- printf "%-20s %-39s %s\n", "-"*20, "-"*39, "-"*47
79
+ printf "%-20s|%3s %4s %4s %5s %5s %5s|%5s %5s %5s|%5s %5s %5s | %s\n", "Screen Name", "Num", "VP$%", "PFR%", "Pre/Pos", "BAtt%", "BDef%",
80
+ "CBet%", "Call", "Fold", "3Bet%", "Call", "Fold", "Poker-Edge Description"
81
+ puts "--------------------|---------------------------------|-----------------|------------------|--------------------------------------------"
81
82
  players.each do |each|
82
83
  report = reports[each]
83
84
  # puts report.to_yaml
84
85
  t_hands = report[:t_hands]
85
86
  vpi_p = display_ratio report[:t_vpip], report[:t_hands]
86
87
  pfr_p = display_ratio report[:t_pfr_opportunity_taken], report[:t_pfr_opportunity]
87
- prefa = report[:t_preflop_passive]. zero? ? 0.0 : 1.0 * report[:t_preflop_aggressive] / report[:t_preflop_passive]
88
- posfa = report[:t_postflop_passive]. zero? ? 0.0 : 1.0 * report[:t_postflop_aggressive] / report[:t_postflop_passive]
88
+ prefa = report[:t_preflop_passive].zero? ? 0.0 : [1.0 * report[:t_preflop_aggressive] / report[:t_preflop_passive],9.9].min
89
+ posfa = report[:t_postflop_passive].zero? ? 0.0 : [1.0 * report[:t_postflop_aggressive] / report[:t_postflop_passive],9.9].min
89
90
  batt_p = display_ratio report[:t_blind_attack_opportunity_taken], report[:t_blind_attack_opportunity]
90
91
  bdef_p = display_ratio report[:t_blind_defense_opportunity_taken], report[:t_blind_defense_opportunity]
91
- cbet_p = display_ratio report[:t_cbet_opportunity_taken], report[:t_cbet_opportunity]
92
+ cbet_flop_p = display_ratio report[:t_cbet_flop_opportunity_taken], report[:t_cbet_flop_opportunity]
93
+ call_cbet_flop_p = display_ratio report[:t_call_cbet_flop_opportunity_taken], report[:t_call_cbet_flop_opportunity]
94
+ fold_to_cbet_flop_p = display_ratio report[:t_fold_to_cbet_flop_opportunity_taken], report[:t_fold_to_cbet_flop_opportunity]
95
+ preflop_3bet_p = display_ratio report[:t_preflop_3bet_opportunity_taken], report[:t_preflop_3bet_opportunity]
96
+ call_preflop_3bet_p = display_ratio report[:t_call_preflop_3bet_opportunity_taken], report[:t_call_preflop_3bet_opportunity]
97
+ fold_to_preflop_3bet_p = display_ratio report[:t_fold_to_preflop_3bet_opportunity_taken], report[:t_fold_to_preflop_3bet_opportunity]
98
+
99
+
92
100
  description = players_shown[each][/\(.*\)/]
93
101
  description ||= ""
94
102
  description.gsub!("Passive", "P")
@@ -96,41 +104,15 @@ def dopsfile(file, players_shown)
96
104
  description.gsub!("Tight", "T")
97
105
  description.gsub!("Loose", "L")
98
106
  players_shown[each].gsub!(/\(.*\)/, description)
99
- printf "%-20s %3d %4s %4s %2.1f/%2.1f %5s %5s %5s %s\n", each, t_hands, vpi_p, pfr_p, prefa, posfa, batt_p, bdef_p, cbet_p, players_shown[each]
107
+ printf "%-20s|%3d %4s %4s %2.1f/%2.1f %5s %5s|%5s %5s %5s|%5s %5s %5s | %s\n",
108
+ each, t_hands, vpi_p, pfr_p, prefa, posfa, batt_p, bdef_p,
109
+ cbet_flop_p, call_cbet_flop_p, fold_to_cbet_flop_p,
110
+ preflop_3bet_p, call_preflop_3bet_p,fold_to_preflop_3bet_p,
111
+ players_shown[each]
112
+ # puts report.to_yaml
100
113
  end
101
114
  puts "=" * file.size
102
115
  GC.start
103
- # puts last.reports.keys.inspect
104
- # puts
105
- # # puts
106
- # # puts "=" * 90
107
- # # puts last.path
108
- # # players.each {|each| display(each, players_shown)}
109
- # # puts
110
- # # puts "=" * 90
111
- # # puts "PLAYERS NOW AT THIS TABLE"
112
- # # puts "=" * 90
113
- # # printf "%-20s %3s %4s %4s %5s %s\n", "Screen Name", "Num", "VP$%", "PFR%", "Pre/Pos", "Poker-Edge Description"
114
- # # printf "%-20s %-14s %s\n", "-"*20, "-"*21, "-"*47
115
- # # players.each do |each|
116
- # # description = players_shown[each][/\(.*\)/]
117
- # # description ||= ""
118
- # # description.gsub!("Passive", "P")
119
- # # description.gsub!("Aggressive", "A")
120
- # # description.gsub!("Tight", "T")
121
- # # description.gsub!("Loose", "L")
122
- # # players_shown[each].gsub!(/\(.*\)/, description)
123
- # # printf "%-20s %3d %3d%% %3d%% %2.1f/%2.1f %s\n", each,
124
- # # hands[each], (100.0 * vpip[each])/hands[each], (100.0 * pfr[each])/hands[each],
125
- # # preflop_passive[each].zero? ? 0.0 : (1.0 * preflop_aggressive[each]) / preflop_passive[each],
126
- # # postflop_passive[each].zero? ? 0.0 : (1.0 * postflop_aggressive[each]) / postflop_passive[each],
127
- # # players_shown[each]
128
- # # end
129
- # # puts "=" * 90
130
- # # puts "information on #{hands.size} players collected"
131
- # # hands = vpip = pfr = sawflop = preflop_aggressive = preflop_passive = nil
132
-
133
- # # puts
134
116
  end
135
117
 
136
118
  def newpsfiles(user, time)
@@ -18,6 +18,17 @@ module Pokerstats
18
18
  @aggregate_statistics[each_player][aggregate_stat] ||= 0
19
19
  @aggregate_statistics[each_player][aggregate_stat] += 1 if reports[each_player][hand_stat]
20
20
  end
21
+
22
+ def aggregate_three_part_statistic each_player, reports, aggregate_stat, hand_stat
23
+ # puts "a3ps(#{each_player},reports,#{aggregate_stat.inspect},#{hand_stat.inspect}) where reports[][]=#{reports[each_player][hand_stat].inspect}" if each_player == "wizardwerdna"
24
+ raise "diddledoo#{hand_stat}" unless reports[each_player].keys.include?(hand_stat)
25
+ t_stat_opportunity = ((aggregate_stat.to_s) + "_opportunity").to_sym
26
+ t_stat_opportunity_taken = ((aggregate_stat.to_s) + "_opportunity_taken").to_sym
27
+ @aggregate_statistics[each_player][t_stat_opportunity] ||=0
28
+ @aggregate_statistics[each_player][t_stat_opportunity_taken] ||=0
29
+ @aggregate_statistics[each_player][t_stat_opportunity] += 1 unless reports[each_player][hand_stat].nil?
30
+ @aggregate_statistics[each_player][t_stat_opportunity_taken] += 1 if reports[each_player][hand_stat]
31
+ end
21
32
 
22
33
  def aggregate_statistic each_player, reports, aggregate_stat, hand_stat
23
34
  @aggregate_statistics[each_player][aggregate_stat] ||= 0
@@ -30,7 +41,10 @@ module Pokerstats
30
41
 
31
42
  def record hand_statistics
32
43
  reports = hand_statistics.reports
44
+ # puts reports.to_yaml
33
45
  reports.keys.each do |each_player|
46
+ raise "cbet_flop for #{each_player} inconsistent" if reports[:call_cbet_flop].nil? ^ reports[:fold_to_cbet_flop].nil?
47
+ raise "preflop_3bet for #{each_player} inconsistent" if reports[:call_preflop_3bet].nil? ^ reports[:fold_to_preflop_3bet].nil?
34
48
  @aggregate_statistics[each_player] ||= {}
35
49
 
36
50
  @aggregate_statistics[each_player][:t_hands] ||= 0
@@ -52,6 +66,14 @@ module Pokerstats
52
66
  aggregate_boolean_statistic each_player, reports, :t_pfr_opportunity_taken, :is_pfr_opportunity_taken
53
67
  aggregate_boolean_statistic each_player, reports, :t_cbet_opportunity, :is_cbet_opportunity
54
68
  aggregate_boolean_statistic each_player, reports, :t_cbet_opportunity_taken, :is_cbet_opportunity_taken
69
+ aggregate_three_part_statistic each_player, reports, :t_cbet_flop, :cbet_flop
70
+ aggregate_three_part_statistic each_player, reports, :t_fold_to_cbet_flop, :fold_to_cbet_flop
71
+ aggregate_three_part_statistic each_player, reports, :t_call_cbet_flop, :call_cbet_flop
72
+ aggregate_three_part_statistic each_player, reports, :t_preflop_3bet, :preflop_3bet
73
+ aggregate_three_part_statistic each_player, reports, :t_fold_to_preflop_3bet, :fold_to_preflop_3bet
74
+ aggregate_three_part_statistic each_player, reports, :t_call_preflop_3bet, :call_preflop_3bet
75
+ raise "messed up cbet_flop for #{each_player}" unless @aggregate_statistics[each_player][:t_call_cbet_flop_opportunity] == @aggregate_statistics[each_player][:t_fold_to_cbet_flop_opportunity]
76
+ raise "messed up preflop_3bet for #{each_player}" unless @aggregate_statistics[each_player][:t_call_preflop_3bet_opportunity] == @aggregate_statistics[each_player][:t_fold_to_preflop_3bet_opportunity]
55
77
  end
56
78
  end
57
79
  end
@@ -60,6 +60,9 @@ module Pokerstats
60
60
  [:cbet_flop, 'boolean', :cbet_flop],
61
61
  [:cbet_turn, 'boolean', :cbet_turn],
62
62
  [:cbet_river, 'boolean', :cbet_river],
63
+ [:call_cbet_flop, 'boolean', :call_cbet_flop],
64
+ [:call_cbet_turn, 'boolean', :call_cbet_turn],
65
+ [:call_cbet_river, 'boolean', :call_cbet_river],
63
66
  [:fold_to_cbet_flop, 'boolean', :fold_to_cbet_flop],
64
67
  [:fold_to_cbet_turn, 'boolean', :fold_to_cbet_turn],
65
68
  [:fold_to_cbet_river, 'boolean', :fold_to_cbet_river],
@@ -67,6 +70,9 @@ module Pokerstats
67
70
  [:dbet_flop, 'boolean', :dbet_flop],
68
71
  [:dbet_turn, 'boolean', :dbet_turn],
69
72
  [:dbet_river, 'boolean', :dbet_river],
73
+ [:call_dbet_flop, 'boolean', :call_dbet_flop],
74
+ [:call_dbet_turn, 'boolean', :call_dbet_turn],
75
+ [:call_dbet_river, 'boolean', :call_dbet_river],
70
76
  [:fold_to_dbet_flop, 'boolean', :fold_to_dbet_flop],
71
77
  [:fold_to_dbet_turn, 'boolean', :fold_to_dbet_turn],
72
78
  [:fold_to_dbet_river, 'boolean', :fold_to_dbet_river]
@@ -147,7 +153,6 @@ module Pokerstats
147
153
  end
148
154
  def fold_to_cbet_#{street}(player)
149
155
  @first_aggr_player[:#{street}] && cbet_#{street}(@first_aggr_player[:#{street}]) && fold_to_#{street}_1bet(player)
150
- # fold_to_#{street}_1bet(player) && @last_aggr_player[:#{last_street}] && cbet_#{street}(@last_aggr_player[:#{last_street}])
151
156
  end
152
157
  def call_cbet_#{street}(player)
153
158
  @first_aggr_player[:#{street}] && cbet_#{street}(@first_aggr_player[:#{street}]) && call_#{street}_1bet(player)
@@ -121,12 +121,18 @@ module Pokerstats
121
121
  # :played_at=> PokerstarsTimeStringConverter.new($8).as_utc_datetime,
122
122
  # :street => :prelude, :board => "", :max_players => 0, :number_players => 0, :table_name => "",
123
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)
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)
130
+ when /PokerStars Game #([0-9]+): Tournament #([0-9]+), (Freeroll|(#{CASH}).*(FPP)) *(USD)? +Hold'em No Limit -.*Level ([IVXL]+) \((#{CASH})\/(#{CASH})\) - (.*)$/
131
+ @stats.update_hand :name => "PS#{$1}", :description=> "#{$2}, #{$3} Hold'em No Limit", :tournament=> $2,
132
+ :sb=> $8.to_d, :bb=> $9.to_d, :ante => "0.0".to_d,
133
+ :played_at=> PokerstarsTimeStringConverter.new($10).as_utc_datetime,
134
+ :street => :prelude, :board => "", :max_players => 0, :number_players => 0, :table_name => "",
135
+ :game_type => "Hold'em", :limit_type => "No Limit", :stakes_type => "0".to_d
130
136
  when /PokerStars Game #([0-9]+): +([^(]*)Hold'em No Limit \((#{CASH})\/(#{CASH})\) - (.*)$/
131
137
  @stats.update_hand :name => "PS#{$1}", :description=> "#{$2}Hold'em No Limit (#{$3}/#{$4})", :tournament=> nil,
132
138
  :sb=> cash_to_d($3), :bb=> cash_to_d($4), :ante => "0.0".to_d,
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{pokerstats}
8
- s.version = "2.0.16"
8
+ s.version = "2.0.17"
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-20}
12
+ s.date = %q{2009-11-21}
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}
@@ -127,6 +127,52 @@ Spec::Matchers.define :have_street_bet_statistics_specified_by do |street_hash,
127
127
  end
128
128
  end
129
129
 
130
+ Spec::Matchers.define :have_consistent_street_bet_statistics do
131
+ match do |hand_statistics|
132
+ @errors = []
133
+ for street in [:flop, :turn, :river]
134
+ for player in hand_statistics.players
135
+ fs = "fold_to_cbet_#{street}".to_sym
136
+ cs = "call_cbet_#{street}".to_sym
137
+ if hand_statistics.send(fs, player).nil? ^ hand_statistics.send(cs, player).nil?
138
+ @errors << {:fold_symbol => fs, :call_symbol => cs, :player => player}
139
+ end
140
+ fs = "fold_to_dbet_#{street}".to_sym
141
+ cs = "call_dbet_#{street}".to_sym
142
+ if hand_statistics.send(fs, player).nil? ^ hand_statistics.send(cs, player).nil?
143
+ @errors << {:fold_symbol => fs, :call_symbol => cs, :player => player}
144
+ end
145
+ end
146
+ for bet in 1..4
147
+ for player in hand_statistics.players
148
+ fs = bet_statistics_proc_symbol(street, bet, "fold_to_")
149
+ cs = bet_statistics_proc_symbol(street, bet, "call_")
150
+ if hand_statistics.send(fs, player).nil? ^ hand_statistics.send(cs, player).nil?
151
+ @errors << {:fold_symbol => fs, :call_symbol => cs, :player => player}
152
+ end
153
+ end
154
+ end
155
+ end
156
+ @errors.empty?
157
+ end
158
+
159
+ failure_message_for_should do |hand_statistics|
160
+ @errors.collect do |each|
161
+ "inconsistent results: #{each[:fold_symbol]}(#{each[:player]}) = #{hand_statistics.send(each[:fold_symbol], each[:player]).inspect}," +
162
+ " but #{each[:call_symbol]}(#{each[:player]}) = #{hand_statistics.send(each[:call_symbol], each[:player]).inspect}"
163
+ end.join("; \n")
164
+ end
165
+
166
+ failure_message_for_should_not do |hand_statistics|
167
+ "the statistics were consistent"
168
+ end
169
+
170
+ description do
171
+ "have consistent call_* and fold_to_* statistics for each player"
172
+ end
173
+ end
174
+
175
+
130
176
  Spec::Matchers.define :have_last_aggr do |street, screen_name|
131
177
  match do |hand_statistics|
132
178
  @errors = []
@@ -1257,6 +1303,7 @@ describe HandStatistics do
1257
1303
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1258
1304
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1259
1305
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1306
+ it {@stats.should have_consistent_street_bet_statistics}
1260
1307
  end
1261
1308
 
1262
1309
  context "after 1 raise" do
@@ -1287,6 +1334,7 @@ describe HandStatistics do
1287
1334
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1288
1335
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1289
1336
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1337
+ it {@stats.should have_consistent_street_bet_statistics}
1290
1338
  end
1291
1339
  context "other streets" do
1292
1340
  before(:each) do
@@ -1316,6 +1364,7 @@ describe HandStatistics do
1316
1364
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1317
1365
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1318
1366
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1367
+ it {@stats.should have_consistent_street_bet_statistics}
1319
1368
  end
1320
1369
  end
1321
1370
 
@@ -1347,6 +1396,7 @@ describe HandStatistics do
1347
1396
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1348
1397
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1349
1398
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1399
+ it {@stats.should have_consistent_street_bet_statistics}
1350
1400
  end
1351
1401
  context "other streets" do
1352
1402
  before(:each) do
@@ -1380,6 +1430,7 @@ describe HandStatistics do
1380
1430
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1381
1431
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1382
1432
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1433
+ it {@stats.should have_consistent_street_bet_statistics}
1383
1434
  end
1384
1435
  end
1385
1436
 
@@ -1412,6 +1463,7 @@ describe HandStatistics do
1412
1463
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1413
1464
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1414
1465
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1466
+ it {@stats.should have_consistent_street_bet_statistics}
1415
1467
  end
1416
1468
  context "other streets" do
1417
1469
  before(:each) do
@@ -1446,6 +1498,7 @@ describe HandStatistics do
1446
1498
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1447
1499
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1448
1500
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1501
+ it {@stats.should have_consistent_street_bet_statistics}
1449
1502
  end
1450
1503
  end
1451
1504
 
@@ -1475,6 +1528,7 @@ describe HandStatistics do
1475
1528
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1476
1529
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1477
1530
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1531
+ it {@stats.should have_consistent_street_bet_statistics}
1478
1532
  end
1479
1533
  context "other streets" do
1480
1534
  before(:each) do
@@ -1506,6 +1560,7 @@ describe HandStatistics do
1506
1560
  it {@stats.should have_street_bet_statistics_specified_by @bet_specification, ""}
1507
1561
  it {@stats.should have_street_bet_statistics_specified_by @call_bet_specification, "call_"}
1508
1562
  it {@stats.should have_street_bet_statistics_specified_by @fold_to_bet_specification, "fold_to_"}
1563
+ it {@stats.should have_consistent_street_bet_statistics}
1509
1564
  end
1510
1565
  end
1511
1566
  end
@@ -1539,6 +1594,7 @@ describe HandStatistics do
1539
1594
  @stats.call_dbet_flop(player).should be_nil
1540
1595
  @stats.fold_to_dbet_flop(player).should be_nil
1541
1596
  end
1597
+ @stats.should have_consistent_street_bet_statistics
1542
1598
  end
1543
1599
 
1544
1600
  context "when button last bets each street and bets first in on the next" do
@@ -1575,6 +1631,7 @@ describe HandStatistics do
1575
1631
  @stats.send("call_dbet_#{street}", "sb").should be_nil
1576
1632
  @stats.send("fold_to_dbet_#{street}", "bb").should be_nil
1577
1633
  end
1634
+ @stats.should have_consistent_street_bet_statistics
1578
1635
  end
1579
1636
  end
1580
1637
  end
@@ -1611,6 +1668,7 @@ describe HandStatistics do
1611
1668
  @stats.send("fold_to_dbet_#{street}", "sb").should be_nil
1612
1669
  @stats.send("fold_to_dbet_#{street}", "bb").should be_nil
1613
1670
  @stats.send("fold_to_dbet_#{street}", "button").should be_false
1671
+ @stats.should have_consistent_street_bet_statistics
1614
1672
  end
1615
1673
  end
1616
1674
  end
@@ -1650,6 +1708,7 @@ describe HandStatistics do
1650
1708
  @stats.send("call_dbet_#{street}", "sb").should be_nil
1651
1709
  @stats.send("fold_to_dbet_#{street}", "bb").should be_nil
1652
1710
  end
1711
+ @stats.should have_consistent_street_bet_statistics
1653
1712
  end
1654
1713
  end
1655
1714
  end
@@ -1679,6 +1738,7 @@ describe HandStatistics do
1679
1738
  [:sb, :bb, :button].each do |player|
1680
1739
  @stats.dbet_flop(player).should be_nil
1681
1740
  end
1741
+ @stats.should have_consistent_street_bet_statistics
1682
1742
  end
1683
1743
  end
1684
1744
 
@@ -1710,6 +1770,7 @@ describe HandStatistics do
1710
1770
  [:sb, :bb, :button].each do |player|
1711
1771
  @stats.dbet_turn(player).should be_nil
1712
1772
  end
1773
+ @stats.should have_consistent_street_bet_statistics
1713
1774
  end
1714
1775
  end
1715
1776
 
@@ -1741,6 +1802,7 @@ describe HandStatistics do
1741
1802
  [:sb, :bb, :button].each do |player|
1742
1803
  @stats.dbet_river(player).should be_nil
1743
1804
  end
1805
+ @stats.should have_consistent_street_bet_statistics
1744
1806
  end
1745
1807
  end
1746
1808
  end
@@ -1843,8 +1905,10 @@ describe HandStatistics do
1843
1905
  :fold_to_river_1bet, :fold_to_river_2bet, :fold_to_river_3bet, :fold_to_river_4bet,
1844
1906
  :last_aggr_preflop, :last_aggr_flop, :last_aggr_turn, :last_aggr_river,
1845
1907
  :cbet_flop, :cbet_turn, :cbet_river,
1908
+ :call_cbet_flop, :call_cbet_turn, :call_cbet_river,
1846
1909
  :fold_to_cbet_flop, :fold_to_cbet_turn, :fold_to_cbet_river,
1847
1910
  :dbet_flop, :dbet_turn, :dbet_river,
1911
+ :call_dbet_flop, :call_dbet_turn, :call_dbet_river,
1848
1912
  :fold_to_dbet_flop, :fold_to_dbet_turn, :fold_to_dbet_river
1849
1913
  ]
1850
1914
  report_items.each{|report_item| @street_bet_plugin.should_receive(report_item).exactly(@stats.players.size)}
@@ -22,7 +22,9 @@ TEST = [
22
22
  :postflop_passive => 3,
23
23
  :postflop_aggressive => 4,
24
24
  :is_pfr_opportunity => true,
25
- :is_pfr_opportunity_taken => true
25
+ :is_pfr_opportunity_taken => true,
26
+ :flop_cbet => true,
27
+ :flop_2bet => true
26
28
  },
27
29
  "judi" => {
28
30
  :is_blind_attack_opportunity => true,
@@ -40,7 +42,9 @@ TEST = [
40
42
  :postflop_passive => 30,
41
43
  :postflop_aggressive => 40,
42
44
  :is_pfr_opportunity => true,
43
- :is_pfr_opportunity_taken => false
45
+ :is_pfr_opportunity_taken => false,
46
+ :flop_cbet => false,
47
+ :flop_2bet => false
44
48
  }
45
49
  },
46
50
  {"andy" => {
@@ -59,7 +63,9 @@ TEST = [
59
63
  :postflop_passive => 6,
60
64
  :postflop_aggressive => 8,
61
65
  :is_pfr_opportunity => true,
62
- :is_pfr_opportunity_taken => true
66
+ :is_pfr_opportunity_taken => true,
67
+ :flop_cbet => false,
68
+ :flop_2bet => true
63
69
  },
64
70
  "judi" => {
65
71
  :is_blind_attack_opportunity => true,
@@ -77,7 +83,9 @@ TEST = [
77
83
  :postflop_passive => 60,
78
84
  :postflop_aggressive => 80,
79
85
  :is_pfr_opportunity => true,
80
- :is_pfr_opportunity_taken => false
86
+ :is_pfr_opportunity_taken => false,
87
+ :flop_cbet => nil,
88
+ :flop_2bet => false
81
89
  }
82
90
  },
83
91
  {"andy" => {
@@ -96,7 +104,9 @@ TEST = [
96
104
  :postflop_passive => 9,
97
105
  :postflop_aggressive => 12,
98
106
  :is_pfr_opportunity => true,
99
- :is_pfr_opportunity_taken => true
107
+ :is_pfr_opportunity_taken => true,
108
+ :flop_cbet => nil,
109
+ :flop_2bet => true
100
110
  },
101
111
  "judi" => {
102
112
  :is_blind_attack_opportunity => true,
@@ -114,7 +124,9 @@ TEST = [
114
124
  :postflop_passive => 90,
115
125
  :postflop_aggressive => 120,
116
126
  :is_pfr_opportunity => true,
117
- :is_pfr_opportunity_taken => false
127
+ :is_pfr_opportunity_taken => false,
128
+ :flop_cbet => nil,
129
+ :flop_2bet => false
118
130
  }
119
131
  }
120
132
  ]
@@ -137,7 +149,11 @@ PS_RESULT = {
137
149
  :t_postflop_passive => 18,
138
150
  :t_postflop_aggressive => 24,
139
151
  :t_pfr_opportunity => 3,
140
- :t_pfr_opportunity_taken => 3
152
+ :t_pfr_opportunity_taken => 3,
153
+ :t_flop_2bet_opportunity => 3,
154
+ :t_flop_2bet_opportunity_taken => 3,
155
+ :t_flop_cbet_opportunity => 2,
156
+ :t_flop_cbet_opportunity_taken => 1
141
157
  },
142
158
  "judi" => {
143
159
  :t_hands => 3,
@@ -156,7 +172,11 @@ PS_RESULT = {
156
172
  :t_postflop_passive => 180,
157
173
  :t_postflop_aggressive => 240,
158
174
  :t_pfr_opportunity => 3,
159
- :t_pfr_opportunity_taken => 0
175
+ :t_pfr_opportunity_taken => 0,
176
+ :t_flop_2bet_opportunity => 3,
177
+ :t_flop_2bet_opportunity_taken => 0,
178
+ :t_cbet_opportunity => 1,
179
+ :t_cbet_opportunity_taken => 0
160
180
  }
161
181
  }
162
182
 
@@ -227,4 +247,7 @@ describe PlayerStatistics, "when aggregating statistics" do
227
247
  it 'should correctly aggregate preflop raise statistics' do
228
248
  should_correctly_aggregate @reports, [:t_pfr_opportunity, :t_pfr_opportunity_taken]
229
249
  end
250
+ it 'should correctly aggregate ternary statistics' do
251
+ should_correctly_aggregate @reports, [:t_flop_2bet, :t_flop_cbet]
252
+ end
230
253
  end
@@ -137,6 +137,27 @@ describe PokerstarsHandHistoryParser, "when parsing structural matter" do
137
137
  )
138
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
139
  end
140
+
141
+ it "should recognize a freeroll tournament hand history" do
142
+ @stats.should_receive(:update_hand).with(
143
+ :name => "PS27572086902",
144
+ :description => "158153393, 5125FPP Hold'em No Limit",
145
+ :ante => "0.0".to_d,
146
+ :table_name => "",
147
+ :max_players => 0,
148
+ :number_players => 0,
149
+ :sb => "10".to_d,
150
+ :bb => "20".to_d,
151
+ :played_at => DateTime.parse("2009/04/27 22:19:46 EDT"),
152
+ :tournament => "158153393",
153
+ :street => :prelude,
154
+ :board => "",
155
+ :game_type => "Hold'em",
156
+ :stakes_type => "0".to_d,
157
+ :limit_type => "No Limit"
158
+ )
159
+ @parser.parse("PokerStars Game #27572086902: Tournament #158153393, 5125FPP Hold'em No Limit - Level I (10/20) - 2009/04/27 22:19:46 ET")
160
+ end
140
161
 
141
162
  it "should recognize a tournament header" do
142
163
  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")
@@ -157,7 +178,7 @@ describe PokerstarsHandHistoryParser, "when parsing structural matter" do
157
178
  :street => :prelude,
158
179
  :board => "", # due to pokerstars hand history bug
159
180
  :game_type => "Hold'em",
160
- :stakes_type => "0.50".to_d,
181
+ :stakes_type => "0.5".to_d,
161
182
  :limit_type => "No Limit"
162
183
  )
163
184
  @parser.parse("PokerStars Game #21650146783: Hold'em No Limit ($0.25/$0.50) - 2008/10/31 17:14:44 ET")
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.16
4
+ version: 2.0.17
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-20 00:00:00 -08:00
12
+ date: 2009-11-21 00:00:00 -08:00
13
13
  default_executable: checkps
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency