pokerstats 2.0.13 → 2.0.14
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 +1 -1
- data/lib/pokerstats/hand_classification.rb +23 -5
- data/lib/pokerstats/hand_constants.rb +8 -2
- data/lib/pokerstats/hand_statistics.rb +25 -4
- data/lib/pokerstats/hand_statistics_api.rb +1 -1
- data/lib/pokerstats/plugins/aggression_statistics.rb +1 -1
- data/lib/pokerstats/plugins/cash_statistics.rb +74 -16
- data/lib/pokerstats/plugins/street_bet_statistics.rb +219 -0
- data/lib/pokerstats/plugins/street_statistics.rb +94 -0
- data/lib/pokerstats/pokerstars_hand_history_parser.rb +76 -13
- data/pokerstats.gemspec +4 -2
- data/spec/hand_statistics_spec.rb +1770 -774
- data/spec/hand_statistics_spec_helper.rb +14 -3
- data/spec/pokerstars_hand_history_parser_spec.rb +77 -10
- data/spec/zpokerstars_hand_history_parser_integration.rb.txt +28 -28
- metadata +4 -2
| @@ -10,20 +10,28 @@ module HandStatisticsFactories | |
| 10 10 | 
             
                  :starting_at => Time.now,
         | 
| 11 11 | 
             
                  :name => "PS0001",
         | 
| 12 12 | 
             
                  :description => "This is a description",
         | 
| 13 | 
            +
                  :table_name => "foobie-doobie III",
         | 
| 14 | 
            +
                  :max_players => 6,
         | 
| 15 | 
            +
                  :number_players => 6,
         | 
| 13 16 | 
             
                  :sb => "1.00".to_d,
         | 
| 14 17 | 
             
                  :bb => "2.00".to_d,
         | 
| 18 | 
            +
                  :ante => "0.50".to_d,
         | 
| 15 19 | 
             
                  :board => "AS KS QS JS TS",
         | 
| 16 20 | 
             
                  :total_pot => "100.00".to_d,
         | 
| 17 21 | 
             
                  :rake => "4.00".to_d,
         | 
| 18 22 | 
             
                  :played_at => Time.now,
         | 
| 19 | 
            -
                  :tournament => "T123"
         | 
| 23 | 
            +
                  :tournament => "T123",
         | 
| 24 | 
            +
                  :game_type => "Hold'em",
         | 
| 25 | 
            +
                  :limit_type => "No Limit",
         | 
| 26 | 
            +
                  :stakes_type => "25".to_d 
         | 
| 20 27 | 
             
                }
         | 
| 21 28 | 
             
              end
         | 
| 22 29 |  | 
| 23 30 | 
             
              def sample_player
         | 
| 24 31 | 
             
                @@sample_player_result ||= {
         | 
| 25 32 | 
             
                  :screen_name => 'sample_player_screen_name', 
         | 
| 26 | 
            -
                  :seat => 1
         | 
| 33 | 
            +
                  :seat => 1, 
         | 
| 34 | 
            +
                  :starting_stack => 10
         | 
| 27 35 | 
             
                }
         | 
| 28 36 | 
             
              end
         | 
| 29 37 |  | 
| @@ -84,6 +92,9 @@ module HandStatisticsFactories | |
| 84 92 |  | 
| 85 93 | 
             
              def register_cards(player, data, hash={})
         | 
| 86 94 | 
             
                @stats.register_action player[:screen_name], 'shows', hash.merge(:result => :cards, :data => data)
         | 
| 87 | 
            -
              end | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
              def register_muck(player, hash={})
         | 
| 97 | 
            +
                @stats.register_action player[:screen_name], 'mucks', hash.merge(:result => :neutral)
         | 
| 98 | 
            +
              end
         | 
| 88 99 | 
             
            end
         | 
| 89 100 | 
             
            include HandStatisticsFactories
         | 
| @@ -10,6 +10,45 @@ require File.expand_path(File.dirname(__FILE__) + '/../lib/pokerstats/pokerstars | |
| 10 10 | 
             
            include Pokerstats
         | 
| 11 11 | 
             
            include HandConstants
         | 
| 12 12 |  | 
| 13 | 
            +
             | 
| 14 | 
            +
            describe PokerstarsTimeStringConverter do
         | 
| 15 | 
            +
                context "when first created" do
         | 
| 16 | 
            +
                    it "should not reject valid pokerstars time strings" do
         | 
| 17 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 UTC")}.should_not raise_error
         | 
| 18 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 PT")}.should_not raise_error
         | 
| 19 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 MT")}.should_not raise_error
         | 
| 20 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 CT")}.should_not raise_error
         | 
| 21 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 ET")}.should_not raise_error
         | 
| 22 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 AT")}.should_not raise_error
         | 
| 23 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 BRT")}.should_not raise_error
         | 
| 24 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 WET")}.should_not raise_error
         | 
| 25 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 CET")}.should_not raise_error
         | 
| 26 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 EET")}.should_not raise_error
         | 
| 27 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 MSK")}.should_not raise_error
         | 
| 28 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 CCT")}.should_not raise_error
         | 
| 29 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 JST")}.should_not raise_error
         | 
| 30 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 AWST")}.should_not raise_error
         | 
| 31 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 ACST")}.should_not raise_error
         | 
| 32 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 AEST")}.should_not raise_error
         | 
| 33 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 NZT")}.should_not raise_error
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
                    
         | 
| 36 | 
            +
                    it "should reject invalid pokerstars time strings" do
         | 
| 37 | 
            +
                        lambda {PokerstarsTimeStringConverter.new("2008/10/31 17:25:42 XX")}.should raise_error(ArgumentError)
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                
         | 
| 41 | 
            +
                context "when converting a pokerstars time string string" do
         | 
| 42 | 
            +
                    it "returns the correct utc dateime for eastern daylight time" do
         | 
| 43 | 
            +
                        PokerstarsTimeStringConverter.new("2008/7/30 17:25:42 ET").as_utc_datetime.should == DateTime.parse("2008/7/30 17:25:42 EDT")
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                    
         | 
| 46 | 
            +
                    it "returns the correct utc result for eastern standard time" do
         | 
| 47 | 
            +
                        PokerstarsTimeStringConverter.new("2008/01/30 17:25:42 ET").as_utc_datetime.should == DateTime.parse("2008/01/30 17:25:42 EST")
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
            end
         | 
| 51 | 
            +
             | 
| 13 52 | 
             
            describe PokerstarsHandHistoryParser, "recognizes valid hand history" do
         | 
| 14 53 | 
             
              it "should recognize a valid tournament hand history" do
         | 
| 15 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"
         | 
| @@ -34,12 +73,19 @@ describe PokerstarsHandHistoryParser, "when parsing structural matter" do | |
| 34 73 | 
             
                @stats.should_receive(:update_hand).with(
         | 
| 35 74 | 
             
                  :name => "PS21650436825",
         | 
| 36 75 | 
             
                  :description => "117620218, $10+$1 Hold'em No Limit",
         | 
| 76 | 
            +
                  :ante => "0.0".to_d,
         | 
| 77 | 
            +
                  :table_name => "",
         | 
| 78 | 
            +
                  :max_players => 0,
         | 
| 79 | 
            +
                  :number_players => 0,
         | 
| 37 80 | 
             
                  :sb => "10".to_d,
         | 
| 38 81 | 
             
                  :bb => "20".to_d,
         | 
| 39 | 
            -
                  :played_at =>  | 
| 82 | 
            +
                  :played_at => DateTime.parse("2008/10/31 17:25:42 EDT"),
         | 
| 40 83 | 
             
                  :tournament => "117620218",
         | 
| 41 84 | 
             
                  :street => :prelude,
         | 
| 42 | 
            -
                  :board => "" | 
| 85 | 
            +
                  :board => "",
         | 
| 86 | 
            +
                  :game_type => "Hold'em",
         | 
| 87 | 
            +
                  :stakes_type => "10".to_d,
         | 
| 88 | 
            +
                  :limit_type => "No Limit"
         | 
| 43 89 | 
             
                )
         | 
| 44 90 | 
             
                @parser.parse("PokerStars Game #21650436825: Tournament #117620218, $10+$1 Hold'em No Limit - Level I (10/20) - 2008/10/31 17:25:42 ET")
         | 
| 45 91 | 
             
              end
         | 
| @@ -52,12 +98,19 @@ describe PokerstarsHandHistoryParser, "when parsing structural matter" do | |
| 52 98 | 
             
                @stats.should_receive(:update_hand).with(
         | 
| 53 99 | 
             
                  :name => 'PS21650146783',
         | 
| 54 100 | 
             
                  :description => "Hold'em No Limit ($0.25/$0.50)",
         | 
| 101 | 
            +
                  :ante => "0.00".to_d,
         | 
| 102 | 
            +
                  :table_name => "",
         | 
| 103 | 
            +
                  :max_players => 0,
         | 
| 104 | 
            +
                  :number_players => 0,
         | 
| 55 105 | 
             
                  :sb => "0.25".to_d, 
         | 
| 56 106 | 
             
                  :bb => "0.50".to_d,
         | 
| 57 | 
            -
                  :played_at =>  | 
| 107 | 
            +
                  :played_at => DateTime.parse("2008/10/31 17:14:44 EDT"),
         | 
| 58 108 | 
             
                  :tournament => nil,
         | 
| 59 109 | 
             
                  :street => :prelude,
         | 
| 60 | 
            -
                  :board => "" # due to pokerstars hand history bug
         | 
| 110 | 
            +
                  :board => "", # due to pokerstars hand history bug
         | 
| 111 | 
            +
                  :game_type => "Hold'em",
         | 
| 112 | 
            +
                  :stakes_type => "0.50".to_d,
         | 
| 113 | 
            +
                  :limit_type => "No Limit"
         | 
| 61 114 | 
             
                )
         | 
| 62 115 | 
             
                @parser.parse("PokerStars Game #21650146783:  Hold'em No Limit ($0.25/$0.50) - 2008/10/31 17:14:44 ET")
         | 
| 63 116 | 
             
              end
         | 
| @@ -125,21 +178,23 @@ describe PokerstarsHandHistoryParser, "when parsing prelude matter" do | |
| 125 178 |  | 
| 126 179 | 
             
              it "should parse a tournament button line" do
         | 
| 127 180 | 
             
                @stats.should_receive(:register_button).with(6)
         | 
| 181 | 
            +
                @stats.should_receive(:update_hand).with(:max_players => 9, :table_name => '117620218 1')
         | 
| 128 182 | 
             
                @parser.parse("Table '117620218 1' 9-max Seat #6 is the button")
         | 
| 129 183 | 
             
              end
         | 
| 130 184 |  | 
| 131 185 | 
             
              it "should parse a cash game button line" do
         | 
| 132 186 | 
             
                @stats.should_receive(:register_button).with(2)
         | 
| 133 | 
            -
                @ | 
| 187 | 
            +
                @stats.should_receive(:update_hand).with(:max_players => 6, :table_name => 'Charybdis IV')
         | 
| 188 | 
            +
                @parser.parse("Table 'Charybdis IV' 6-max Seat #2 is the button")
         | 
| 134 189 | 
             
              end
         | 
| 135 190 |  | 
| 136 191 | 
             
              it "should parse a player line" do
         | 
| 137 | 
            -
                @stats.should_receive(:register_player).with(:screen_name => 'BadBeat_Brat', :seat => 3)
         | 
| 192 | 
            +
                @stats.should_receive(:register_player).with(:screen_name => 'BadBeat_Brat', :seat => 3, :starting_stack => "1500".to_d)
         | 
| 138 193 | 
             
                @parser.parse("Seat 3: BadBeat_Brat (1500 in chips)")
         | 
| 139 194 | 
             
              end
         | 
| 140 195 |  | 
| 141 196 | 
             
              it "should parse a player line with accents" do
         | 
| 142 | 
            -
                @stats.should_receive(:register_player).with(:screen_name => 'Gwünni', :seat => 8)
         | 
| 197 | 
            +
                @stats.should_receive(:register_player).with(:screen_name => 'Gwünni', :seat => 8, :starting_stack => "3000".to_d)
         | 
| 143 198 | 
             
                @parser.parse("Seat 8: Gwünni (3000 in chips)")
         | 
| 144 199 | 
             
              end
         | 
| 145 200 |  | 
| @@ -153,8 +208,17 @@ describe PokerstarsHandHistoryParser, "when parsing prelude matter" do | |
| 153 208 | 
             
                @parser.parse("BadBeat_Brat: posts big blind 20")
         | 
| 154 209 | 
             
              end
         | 
| 155 210 |  | 
| 156 | 
            -
              it "should parse an ante header and register the corresponding action" do
         | 
| 211 | 
            +
              it "should parse an ante header and register the corresponding action, :updating the :ante field as well when ante is larger" do
         | 
| 212 | 
            +
                @stats.update_hand(:ante=>0)
         | 
| 213 | 
            +
                @stats.should_receive(:register_action).with("BadBeat_Brat", 'antes', :result => :post, :amount => "15".to_d)
         | 
| 214 | 
            +
                @stats.should_receive(:update_hand).with(:ante => "15".to_d)
         | 
| 215 | 
            +
                @parser.parse("BadBeat_Brat: posts the ante 15")
         | 
| 216 | 
            +
              end
         | 
| 217 | 
            +
             | 
| 218 | 
            +
              it "should parse an ante header and register the corresponding action, :updating the :ante field as well when ante is not larger" do
         | 
| 219 | 
            +
                @stats.update_hand(:ante=>20)
         | 
| 157 220 | 
             
                @stats.should_receive(:register_action).with("BadBeat_Brat", 'antes', :result => :post, :amount => "15".to_d)
         | 
| 221 | 
            +
                @stats.should_receive(:update_hand).with(:ante => "20".to_d)
         | 
| 158 222 | 
             
                @parser.parse("BadBeat_Brat: posts the ante 15")
         | 
| 159 223 | 
             
              end
         | 
| 160 224 | 
             
            end
         | 
| @@ -193,5 +257,8 @@ describe PokerstarsHandHistoryParser, "when parsing poker actions" do | |
| 193 257 | 
             
                @stats.should_receive(:register_action).with("billy", "wins", :result => :win, :amount => "1.90".to_d)
         | 
| 194 258 | 
             
                @parser.parse("billy collected $1.90 from pot")
         | 
| 195 259 | 
             
              end
         | 
| 196 | 
            -
             | 
| 197 | 
            -
             | 
| 260 | 
            +
              it "should properly parse and register a muck" do
         | 
| 261 | 
            +
                @stats.should_receive(:register_action).with("billy", "mucks", :result => :neutral)
         | 
| 262 | 
            +
                @parser.parse("billy mucks hand")
         | 
| 263 | 
            +
              end
         | 
| 264 | 
            +
            end
         | 
| @@ -24,27 +24,9 @@ include HandConstants | |
| 24 24 | 
             
            #   end
         | 
| 25 25 | 
             
            # end
         | 
| 26 26 | 
             
            # 
         | 
| 27 | 
            -
            describe PokerstarsHandHistoryParser, "when parsing all the PokerstarsFiles in Andy's directory" do
         | 
| 28 | 
            -
              before :each do
         | 
| 29 | 
            -
                @filenames = Dir["/Users/werdna/Library/Application Support/Pokerstars/HandHistory/**/*.txt"]
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
              it "should parse every line of every entry in the file" do
         | 
| 33 | 
            -
                times = 10
         | 
| 34 | 
            -
                @filenames.each do |filename|
         | 
| 35 | 
            -
                  puts "====== #{filename} ====="
         | 
| 36 | 
            -
                  @psfile = PokerstarsFile.open(filename).entries.each do |handrecord|
         | 
| 37 | 
            -
                    printf(".")
         | 
| 38 | 
            -
                    lambda{handrecord.parse}.should_not raise_error
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                  printf("\n")
         | 
| 41 | 
            -
                end
         | 
| 42 | 
            -
              end
         | 
| 43 | 
            -
            end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            # describe PokerstarsHandHistoryParser, "when parsing all the PokerstarsFiles in Judi's directory" do
         | 
| 27 | 
            +
            # describe PokerstarsHandHistoryParser, "when parsing all the PokerstarsFiles in Andy's directory" do
         | 
| 46 28 | 
             
            #   before :each do
         | 
| 47 | 
            -
            #     @filenames = Dir["/Users/werdna/ | 
| 29 | 
            +
            #     @filenames = Dir["/Users/werdna/Library/Application Support/Pokerstars/HandHistory/**/*.txt"]
         | 
| 48 30 | 
             
            #   end
         | 
| 49 31 | 
             
            # 
         | 
| 50 32 | 
             
            #   it "should parse every line of every entry in the file" do
         | 
| @@ -52,16 +34,34 @@ end | |
| 52 34 | 
             
            #     @filenames.each do |filename|
         | 
| 53 35 | 
             
            #       puts "====== #{filename} ====="
         | 
| 54 36 | 
             
            #       @psfile = PokerstarsFile.open(filename).entries.each do |handrecord|
         | 
| 55 | 
            -
            #         @stats = HandStatistics.new
         | 
| 56 | 
            -
            #         @parser = PokerstarsHandHistoryParser.new(@stats)
         | 
| 57 | 
            -
            #         # puts handrecord.[/[^\n]+/]
         | 
| 58 37 | 
             
            #         printf(".")
         | 
| 59 | 
            -
            #         handrecord. | 
| 60 | 
            -
            #           lambda{@parser.parse(line)}.should_not raise_error
         | 
| 61 | 
            -
            #         end
         | 
| 62 | 
            -
            #         # @stats.debug_display
         | 
| 38 | 
            +
            #         lambda{handrecord.parse}.should_not raise_error
         | 
| 63 39 | 
             
            #       end
         | 
| 64 40 | 
             
            #       printf("\n")
         | 
| 65 41 | 
             
            #     end
         | 
| 66 42 | 
             
            #   end
         | 
| 67 | 
            -
            # end
         | 
| 43 | 
            +
            # end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            describe PokerstarsHandHistoryParser, "when parsing all the PokerstarsFiles in Judi's directory" do
         | 
| 46 | 
            +
              before :each do
         | 
| 47 | 
            +
                @filenames = Dir["/Users/werdna/juditest/*.txt"]
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              it "should parse every line of every entry in the file" do
         | 
| 51 | 
            +
                times = 10
         | 
| 52 | 
            +
                @filenames.each do |filename|
         | 
| 53 | 
            +
                  puts "====== #{filename} ====="
         | 
| 54 | 
            +
                  @psfile = PokerstarsFile.open(filename).entries.each do |handrecord|
         | 
| 55 | 
            +
                    @stats = HandStatistics.new
         | 
| 56 | 
            +
                    @parser = PokerstarsHandHistoryParser.new(@stats)
         | 
| 57 | 
            +
                    # puts handrecord.[/[^\n]+/]
         | 
| 58 | 
            +
                    printf(".")
         | 
| 59 | 
            +
                    handrecord.lines.each do |line|
         | 
| 60 | 
            +
                      lambda{@parser.parse(line)}.should_not raise_error
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                    # @stats.debug_display
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                  printf("\n")
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            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. | 
| 4 | 
            +
              version: 2.0.14
         | 
| 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- | 
| 12 | 
            +
            date: 2009-11-18 00:00:00 -08:00
         | 
| 13 13 | 
             
            default_executable: checkps
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -75,6 +75,8 @@ files: | |
| 75 75 | 
             
            - lib/pokerstats/plugins/cash_statistics.rb
         | 
| 76 76 | 
             
            - lib/pokerstats/plugins/continuation_bet_statistics.rb
         | 
| 77 77 | 
             
            - lib/pokerstats/plugins/preflop_raise_statistics.rb
         | 
| 78 | 
            +
            - lib/pokerstats/plugins/street_bet_statistics.rb
         | 
| 79 | 
            +
            - lib/pokerstats/plugins/street_statistics.rb
         | 
| 78 80 | 
             
            - lib/pokerstats/poker-edge.rb
         | 
| 79 81 | 
             
            - lib/pokerstats/pokerstars_file.rb
         | 
| 80 82 | 
             
            - lib/pokerstats/pokerstars_hand_history_parser.rb
         |