pokermgr


Namepokermgr JSON
Version 3.4.0 PyPI version JSON
download
home_pageNone
SummaryComprehensive Python library for managing poker games
upload_time2025-07-29 02:51:00
maintainerNone
docs_urlNone
authorBhadresh Dahanuwala
requires_python>=3.10
licenseNone
keywords poker texas-holdem omaha card-games game-evaluation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Poker Manager

A comprehensive Python library for managing poker games, including Texas Hold'em variants with support for multi-board play, pot management, and hand evaluation.

## Features

### Game Variants
- **Texas Hold'em**: Standard no-limit Texas Hold'em with small/big blinds
- **Bomb Pot**: Variant where all players are automatically all-in pre-flop
- **Multi-board Support**: Play with multiple boards simultaneously

### Core Components

#### Table Management
- Manage players and seating
- Handle player rotations and dealer button
- Support for table limits and configurations

#### Player System
- Track player status (active, folded, all-in, sitting out)
- Manage chip stacks and bankroll
- Track hole cards and best possible hands
- Calculate hand equities

#### Board Management
- Handle community cards (flop, turn, river)
- Support for multiple concurrent boards
- Board texture analysis

#### Pot Management
- Track main and side pots
- Handle all-in situations
- Support for multi-board pot splitting
- Track winners per board

#### Hand Evaluation
- Evaluate hand strengths
- Calculate winning hands
- Support for various poker hand rankings

## Installation

### From GitHub Packages (Private Repository)

```bash
# Using Personal Access Token
pip install pokermgr --index-url https://USERNAME:TOKEN@pypi.pkg.github.com/bhadresh-dahanuwala/simple/
```

See [INSTALL.md](INSTALL.md) for detailed installation instructions.

### For Development

```bash
git clone https://github.com/bhadresh-dahanuwala/pokermgr.git
cd pokermgr
pip install -e .
```

## Quick Start

This section provides a basic overview of how to set up and run a poker game using the Poker Manager library.

### 1. Setting up Players and Table

First, you need to create players and a table for them to play on.

```python
from collections import deque
from pokermgr.player import TablePlayer, PlayerAction, PlayerStatus
from pokermgr.table import Table

# Create individual players
player1 = TablePlayer(name="Alice", initial_stack=1000)
player2 = TablePlayer(name="Bob", initial_stack=1000)
player3 = TablePlayer(name="Charlie", initial_stack=1000)

# Add players to a deque (order matters for seating and turns)
players_at_table = deque([player1, player2, player3])

# Create a table
# The table code can be any unique string identifier.
# max_players defaults to 9 if not specified.
table = Table(code="PokerNight01", players=players_at_table, max_players=6)

print(f"Table '{table.code}' created with {len(table.players)} players.")
for p in table.players:
    print(f"- {p.name} (Stack: {p.stack})")
```

### 2. Initializing a Game (Texas Hold'em Regular)

Now, let's set up a standard Texas Hold'em game with blinds.

```python
from pokermgr.game import GameTexasHoldemRegular, GameStreet

# Create a Texas Hold'em game
# 'key' is a unique identifier for the game instance.
# Small blind and big blind amounts are specified here.
game_th_regular = GameTexasHoldemRegular(
    key=1,  # Game ID
    table=table,
    small_blind=5,
    big_blind=10,
    initial_board_count=1 # Default is 1, can be more for multi-board games
)

print(f"Game {game_th_regular.key} (Texas Hold'em Regular) initialized.")
print(f"Small Blind: {game_th_regular.small_blind}, Big Blind: {game_th_regular.big_blind}")
print(f"Current game street: {game_th_regular.game_street.name}")
print(f"Number of boards: {game_th_regular.board_count}")
```

### 3. Dealing Cards and Progressing Streets

Here's how to deal cards through the different streets of a hand. In a real game, betting rounds would occur between these steps.

```python
from cardspy.cards import SUITS, RANKS, CARDS
from cardspy.card import card_key_to_repr, cards_to_str_pretty

# --- Pre-flop: Deal Hole Cards ---
# The _core_deal_hole_cards method is called internally by deal_hole_cards.
# For Texas Hold'em, each player gets 2 hole cards.
game_th_regular.deal_hole_cards() 
print(f"\n--- {game_th_regular.game_street.name} --- (Hole cards dealt)")
for player in game_th_regular.table.players:
    # Hole cards are stored as bitmasks in player.hole_cards.key
    # We use card_key_to_repr for a human-readable string
    hole_cards_str = cards_to_str_pretty(player.hole_cards.key)
    print(f"{player.name} has hole cards: {hole_cards_str}")

# --- Flop: Deal 3 Community Cards ---
# Advance the game street and deal the flop
# game_th_regular.game_street = GameStreet.FLOP # This is handled internally by deal_flop
game_th_regular.deal_flop()
print(f"\n--- {game_th_regular.game_street.name} --- (3 community cards)")
# Board cards are stored as a bitmask in game.boards[0].cards
flop_cards_str = cards_to_str_pretty(game_th_regular.boards[0].cards)
print(f"Board 0: {flop_cards_str}")

# --- Turn: Deal 1 Community Card ---
# game_th_regular.game_street = GameStreet.TURN # Handled by deal_turn
game_th_regular.deal_turn()
print(f"\n--- {game_th_regular.game_street.name} --- (1 community card)")
turn_cards_str = cards_to_str_pretty(game_th_regular.boards[0].cards)
print(f"Board 0: {turn_cards_str}")

# --- River: Deal 1 Community Card ---
# game_th_regular.game_street = GameStreet.RIVER # Handled by deal_river
game_th_regular.deal_river()
print(f"\n--- {game_th_regular.game_street.name} --- (1 community card)")
river_cards_str = cards_to_str_pretty(game_th_regular.boards[0].cards)
print(f"Board 0: {river_cards_str}")

# At this point, all cards are dealt. The next step would be showdown and pot distribution.
# Note: The `showdown()` method is not yet fully implemented in the provided snippets.
# print("\n--- Showdown ---")
# winners = game_th_regular.showdown() # Placeholder for actual showdown logic
```

## Advanced Usage

### 1. Multi-Board Games

You can play games with multiple boards simultaneously. This is common in some poker variants where the pot is split among winners on different boards.

```python
from pokermgr.game import Game # Base Game class for multi-board

# Re-use the table and players from the previous example
# Create a game with 3 boards
game_multi_board = Game(
    key=2, 
    table=table, 
    initial_board_count=3
)

print(f"\nGame {game_multi_board.key} (Multi-Board) initialized with {game_multi_board.board_count} boards.")

# Deal hole cards (specific to game type, e.g., TexasHoldem would deal 2)
# For a generic Game, you might need to implement _core_deal_hole_cards
# or use a game type that defines it, like GameTexasHoldem.
# Let's assume GameTexasHoldem for dealing hole cards:
class MyTexasHoldemMulti(GameTexasHoldemRegular):
    pass # Inherits _core_deal_hole_cards

game_multi_board_th = MyTexasHoldemMulti(
    key=3, 
    table=table, 
    small_blind=0, # Blinds might not apply or be handled differently
    big_blind=0,
    initial_board_count=3
)

game_multi_board_th.deal_hole_cards()
print(f"Hole cards dealt for multi-board game.")
for player in game_multi_board_th.table.players:
    print(f"{player.name}: {cards_to_str_pretty(player.hole_cards.key)}")

# Deal community cards for each board
# game_multi_board_th.game_street = GameStreet.FLOP # Handled by deal_flop
game_multi_board_th.deal_flop()
# game_multi_board_th.game_street = GameStreet.TURN # Handled by deal_turn
game_multi_board_th.deal_turn()
# game_multi_board_th.game_street = GameStreet.RIVER # Handled by deal_river
game_multi_board_th.deal_river()

print("\nCommunity cards dealt for all boards:")
for i, board_instance in enumerate(game_multi_board_th.boards):
    board_cards_str = cards_to_str_pretty(board_instance.cards)
    print(f"Board {i}: {board_cards_str}")

# You can also add boards dynamically during a game
# game_multi_board_th.add_board()
# print(f"\nAdded a new board. Total boards: {game_multi_board_th.board_count}")
# The new board will copy the cards from the most recent existing board.
```

### 2. Bomb Pot Games (Texas Hold'em Variant)

In a Bomb Pot, all players are typically forced all-in pre-flop for a fixed amount.

```python
from pokermgr.game import GameTexasHoldemBomb

# Re-use the table and players
# Create a Bomb Pot game where each player contributes 100 to the pot pre-flop.
game_bomb_pot = GameTexasHoldemBomb(
    key=4,
    table=table,
    blind=100,  # This is the mandatory amount each player posts
    initial_board_count=1
)

print(f"\nGame {game_bomb_pot.key} (Bomb Pot) initialized.")
print(f"Mandatory blind: {game_bomb_pot.blind}")
# In a Bomb Pot, the pot is immediately built from all players' blinds.
# The first pot (self.pots[0]) is initialized with this amount.
print(f"Initial pot size: {game_bomb_pot.pots[0].stack}") 

# Dealing proceeds as normal, but typically without betting rounds pre-flop.
# Hole cards are dealt
game_bomb_pot.deal_hole_cards()
print("Hole cards dealt for Bomb Pot game.")

# Community cards are dealt
# game_bomb_pot.game_street = GameStreet.FLOP # Handled by deal_flop
game_bomb_pot.deal_flop()
# game_bomb_pot.game_street = GameStreet.TURN # Handled by deal_turn
game_bomb_pot.deal_turn()
# game_bomb_pot.game_street = GameStreet.RIVER # Handled by deal_river
game_bomb_pot.deal_river()

print("Community cards for Bomb Pot game:")
bomb_pot_board_str = cards_to_str_pretty(game_bomb_pot.boards[0].cards)
print(f"Board 0: {bomb_pot_board_str}")
```

### 3. Custom Hand Evaluation

The `Hand` class (from `pokermgr.hand`) can be used to evaluate poker hands represented by bitmasks. The `cardspy` library is used for card representations.

```python
from pokermgr.hand import Hand
from cardspy.deck import cards_to_mask
from cardspy.card import extract_cards
from pokermgr.funcs import get_cards_properties

# Example: Evaluate a specific hand (e.g., a full house)
# Use string codes for cards: 'As' = Ace of Spades, 'Kd' = King of Diamonds, etc.
# The order of cards does not matter for evaluation.
card_mask = cards_to_mask(['As', 'Ad', 'Ah', 'Kc', 'Kd'])
hand = Hand(card_mask)

# Display the hand in a human-readable way
print("Hand cards:", extract_cards(card_mask))
print("Hand type:", hand.type_name)
print("Hand weight:", hand.weight)
print("Hand properties (bitmask):", get_cards_properties(hand.cards))

# Example: Straight Flush (Royal Flush in hearts)
sf_mask = cards_to_mask(['Th', 'Jh', 'Qh', 'Kh', 'Ah'])
sf_hand = Hand(sf_mask)
print("\nStraight Flush cards:", extract_cards(sf_mask))
print("Hand type:", sf_hand.type_name)
print("Hand weight:", sf_hand.weight)
# You can also check for draws if relevant
# print("Draws:", hand.draws)


## Project Structure

```
pokermgr/
├── __init__.py
├── board.py          # Board and board texture management
├── evaluate.py       # Hand evaluation logic
├── funcs.py          # Utility functions
├── game.py           # Core game logic and variants
├── hand.py           # Hand representation
├── hole_cards.py     # Hole cards management
├── player.py         # Player classes and logic
├── pot.py            # Pot management
└── table.py          # Table management

tests/               # Comprehensive test suite
```

## Testing

Run the test suite with pytest:

```bash
pytest tests/
```

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pokermgr",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "poker, texas-holdem, omaha, card-games, game-evaluation",
    "author": "Bhadresh Dahanuwala",
    "author_email": "bhadresh.dahanuwala@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/60/b7/5bd6e3ba0238c244c6447cc64adf914a2ebc203c4b36627f9e8a7b1e6335/pokermgr-3.4.0.tar.gz",
    "platform": null,
    "description": "# Poker Manager\n\nA comprehensive Python library for managing poker games, including Texas Hold'em variants with support for multi-board play, pot management, and hand evaluation.\n\n## Features\n\n### Game Variants\n- **Texas Hold'em**: Standard no-limit Texas Hold'em with small/big blinds\n- **Bomb Pot**: Variant where all players are automatically all-in pre-flop\n- **Multi-board Support**: Play with multiple boards simultaneously\n\n### Core Components\n\n#### Table Management\n- Manage players and seating\n- Handle player rotations and dealer button\n- Support for table limits and configurations\n\n#### Player System\n- Track player status (active, folded, all-in, sitting out)\n- Manage chip stacks and bankroll\n- Track hole cards and best possible hands\n- Calculate hand equities\n\n#### Board Management\n- Handle community cards (flop, turn, river)\n- Support for multiple concurrent boards\n- Board texture analysis\n\n#### Pot Management\n- Track main and side pots\n- Handle all-in situations\n- Support for multi-board pot splitting\n- Track winners per board\n\n#### Hand Evaluation\n- Evaluate hand strengths\n- Calculate winning hands\n- Support for various poker hand rankings\n\n## Installation\n\n### From GitHub Packages (Private Repository)\n\n```bash\n# Using Personal Access Token\npip install pokermgr --index-url https://USERNAME:TOKEN@pypi.pkg.github.com/bhadresh-dahanuwala/simple/\n```\n\nSee [INSTALL.md](INSTALL.md) for detailed installation instructions.\n\n### For Development\n\n```bash\ngit clone https://github.com/bhadresh-dahanuwala/pokermgr.git\ncd pokermgr\npip install -e .\n```\n\n## Quick Start\n\nThis section provides a basic overview of how to set up and run a poker game using the Poker Manager library.\n\n### 1. Setting up Players and Table\n\nFirst, you need to create players and a table for them to play on.\n\n```python\nfrom collections import deque\nfrom pokermgr.player import TablePlayer, PlayerAction, PlayerStatus\nfrom pokermgr.table import Table\n\n# Create individual players\nplayer1 = TablePlayer(name=\"Alice\", initial_stack=1000)\nplayer2 = TablePlayer(name=\"Bob\", initial_stack=1000)\nplayer3 = TablePlayer(name=\"Charlie\", initial_stack=1000)\n\n# Add players to a deque (order matters for seating and turns)\nplayers_at_table = deque([player1, player2, player3])\n\n# Create a table\n# The table code can be any unique string identifier.\n# max_players defaults to 9 if not specified.\ntable = Table(code=\"PokerNight01\", players=players_at_table, max_players=6)\n\nprint(f\"Table '{table.code}' created with {len(table.players)} players.\")\nfor p in table.players:\n    print(f\"- {p.name} (Stack: {p.stack})\")\n```\n\n### 2. Initializing a Game (Texas Hold'em Regular)\n\nNow, let's set up a standard Texas Hold'em game with blinds.\n\n```python\nfrom pokermgr.game import GameTexasHoldemRegular, GameStreet\n\n# Create a Texas Hold'em game\n# 'key' is a unique identifier for the game instance.\n# Small blind and big blind amounts are specified here.\ngame_th_regular = GameTexasHoldemRegular(\n    key=1,  # Game ID\n    table=table,\n    small_blind=5,\n    big_blind=10,\n    initial_board_count=1 # Default is 1, can be more for multi-board games\n)\n\nprint(f\"Game {game_th_regular.key} (Texas Hold'em Regular) initialized.\")\nprint(f\"Small Blind: {game_th_regular.small_blind}, Big Blind: {game_th_regular.big_blind}\")\nprint(f\"Current game street: {game_th_regular.game_street.name}\")\nprint(f\"Number of boards: {game_th_regular.board_count}\")\n```\n\n### 3. Dealing Cards and Progressing Streets\n\nHere's how to deal cards through the different streets of a hand. In a real game, betting rounds would occur between these steps.\n\n```python\nfrom cardspy.cards import SUITS, RANKS, CARDS\nfrom cardspy.card import card_key_to_repr, cards_to_str_pretty\n\n# --- Pre-flop: Deal Hole Cards ---\n# The _core_deal_hole_cards method is called internally by deal_hole_cards.\n# For Texas Hold'em, each player gets 2 hole cards.\ngame_th_regular.deal_hole_cards() \nprint(f\"\\n--- {game_th_regular.game_street.name} --- (Hole cards dealt)\")\nfor player in game_th_regular.table.players:\n    # Hole cards are stored as bitmasks in player.hole_cards.key\n    # We use card_key_to_repr for a human-readable string\n    hole_cards_str = cards_to_str_pretty(player.hole_cards.key)\n    print(f\"{player.name} has hole cards: {hole_cards_str}\")\n\n# --- Flop: Deal 3 Community Cards ---\n# Advance the game street and deal the flop\n# game_th_regular.game_street = GameStreet.FLOP # This is handled internally by deal_flop\ngame_th_regular.deal_flop()\nprint(f\"\\n--- {game_th_regular.game_street.name} --- (3 community cards)\")\n# Board cards are stored as a bitmask in game.boards[0].cards\nflop_cards_str = cards_to_str_pretty(game_th_regular.boards[0].cards)\nprint(f\"Board 0: {flop_cards_str}\")\n\n# --- Turn: Deal 1 Community Card ---\n# game_th_regular.game_street = GameStreet.TURN # Handled by deal_turn\ngame_th_regular.deal_turn()\nprint(f\"\\n--- {game_th_regular.game_street.name} --- (1 community card)\")\nturn_cards_str = cards_to_str_pretty(game_th_regular.boards[0].cards)\nprint(f\"Board 0: {turn_cards_str}\")\n\n# --- River: Deal 1 Community Card ---\n# game_th_regular.game_street = GameStreet.RIVER # Handled by deal_river\ngame_th_regular.deal_river()\nprint(f\"\\n--- {game_th_regular.game_street.name} --- (1 community card)\")\nriver_cards_str = cards_to_str_pretty(game_th_regular.boards[0].cards)\nprint(f\"Board 0: {river_cards_str}\")\n\n# At this point, all cards are dealt. The next step would be showdown and pot distribution.\n# Note: The `showdown()` method is not yet fully implemented in the provided snippets.\n# print(\"\\n--- Showdown ---\")\n# winners = game_th_regular.showdown() # Placeholder for actual showdown logic\n```\n\n## Advanced Usage\n\n### 1. Multi-Board Games\n\nYou can play games with multiple boards simultaneously. This is common in some poker variants where the pot is split among winners on different boards.\n\n```python\nfrom pokermgr.game import Game # Base Game class for multi-board\n\n# Re-use the table and players from the previous example\n# Create a game with 3 boards\ngame_multi_board = Game(\n    key=2, \n    table=table, \n    initial_board_count=3\n)\n\nprint(f\"\\nGame {game_multi_board.key} (Multi-Board) initialized with {game_multi_board.board_count} boards.\")\n\n# Deal hole cards (specific to game type, e.g., TexasHoldem would deal 2)\n# For a generic Game, you might need to implement _core_deal_hole_cards\n# or use a game type that defines it, like GameTexasHoldem.\n# Let's assume GameTexasHoldem for dealing hole cards:\nclass MyTexasHoldemMulti(GameTexasHoldemRegular):\n    pass # Inherits _core_deal_hole_cards\n\ngame_multi_board_th = MyTexasHoldemMulti(\n    key=3, \n    table=table, \n    small_blind=0, # Blinds might not apply or be handled differently\n    big_blind=0,\n    initial_board_count=3\n)\n\ngame_multi_board_th.deal_hole_cards()\nprint(f\"Hole cards dealt for multi-board game.\")\nfor player in game_multi_board_th.table.players:\n    print(f\"{player.name}: {cards_to_str_pretty(player.hole_cards.key)}\")\n\n# Deal community cards for each board\n# game_multi_board_th.game_street = GameStreet.FLOP # Handled by deal_flop\ngame_multi_board_th.deal_flop()\n# game_multi_board_th.game_street = GameStreet.TURN # Handled by deal_turn\ngame_multi_board_th.deal_turn()\n# game_multi_board_th.game_street = GameStreet.RIVER # Handled by deal_river\ngame_multi_board_th.deal_river()\n\nprint(\"\\nCommunity cards dealt for all boards:\")\nfor i, board_instance in enumerate(game_multi_board_th.boards):\n    board_cards_str = cards_to_str_pretty(board_instance.cards)\n    print(f\"Board {i}: {board_cards_str}\")\n\n# You can also add boards dynamically during a game\n# game_multi_board_th.add_board()\n# print(f\"\\nAdded a new board. Total boards: {game_multi_board_th.board_count}\")\n# The new board will copy the cards from the most recent existing board.\n```\n\n### 2. Bomb Pot Games (Texas Hold'em Variant)\n\nIn a Bomb Pot, all players are typically forced all-in pre-flop for a fixed amount.\n\n```python\nfrom pokermgr.game import GameTexasHoldemBomb\n\n# Re-use the table and players\n# Create a Bomb Pot game where each player contributes 100 to the pot pre-flop.\ngame_bomb_pot = GameTexasHoldemBomb(\n    key=4,\n    table=table,\n    blind=100,  # This is the mandatory amount each player posts\n    initial_board_count=1\n)\n\nprint(f\"\\nGame {game_bomb_pot.key} (Bomb Pot) initialized.\")\nprint(f\"Mandatory blind: {game_bomb_pot.blind}\")\n# In a Bomb Pot, the pot is immediately built from all players' blinds.\n# The first pot (self.pots[0]) is initialized with this amount.\nprint(f\"Initial pot size: {game_bomb_pot.pots[0].stack}\") \n\n# Dealing proceeds as normal, but typically without betting rounds pre-flop.\n# Hole cards are dealt\ngame_bomb_pot.deal_hole_cards()\nprint(\"Hole cards dealt for Bomb Pot game.\")\n\n# Community cards are dealt\n# game_bomb_pot.game_street = GameStreet.FLOP # Handled by deal_flop\ngame_bomb_pot.deal_flop()\n# game_bomb_pot.game_street = GameStreet.TURN # Handled by deal_turn\ngame_bomb_pot.deal_turn()\n# game_bomb_pot.game_street = GameStreet.RIVER # Handled by deal_river\ngame_bomb_pot.deal_river()\n\nprint(\"Community cards for Bomb Pot game:\")\nbomb_pot_board_str = cards_to_str_pretty(game_bomb_pot.boards[0].cards)\nprint(f\"Board 0: {bomb_pot_board_str}\")\n```\n\n### 3. Custom Hand Evaluation\n\nThe `Hand` class (from `pokermgr.hand`) can be used to evaluate poker hands represented by bitmasks. The `cardspy` library is used for card representations.\n\n```python\nfrom pokermgr.hand import Hand\nfrom cardspy.deck import cards_to_mask\nfrom cardspy.card import extract_cards\nfrom pokermgr.funcs import get_cards_properties\n\n# Example: Evaluate a specific hand (e.g., a full house)\n# Use string codes for cards: 'As' = Ace of Spades, 'Kd' = King of Diamonds, etc.\n# The order of cards does not matter for evaluation.\ncard_mask = cards_to_mask(['As', 'Ad', 'Ah', 'Kc', 'Kd'])\nhand = Hand(card_mask)\n\n# Display the hand in a human-readable way\nprint(\"Hand cards:\", extract_cards(card_mask))\nprint(\"Hand type:\", hand.type_name)\nprint(\"Hand weight:\", hand.weight)\nprint(\"Hand properties (bitmask):\", get_cards_properties(hand.cards))\n\n# Example: Straight Flush (Royal Flush in hearts)\nsf_mask = cards_to_mask(['Th', 'Jh', 'Qh', 'Kh', 'Ah'])\nsf_hand = Hand(sf_mask)\nprint(\"\\nStraight Flush cards:\", extract_cards(sf_mask))\nprint(\"Hand type:\", sf_hand.type_name)\nprint(\"Hand weight:\", sf_hand.weight)\n# You can also check for draws if relevant\n# print(\"Draws:\", hand.draws)\n\n\n## Project Structure\n\n```\npokermgr/\n\u251c\u2500\u2500 __init__.py\n\u251c\u2500\u2500 board.py          # Board and board texture management\n\u251c\u2500\u2500 evaluate.py       # Hand evaluation logic\n\u251c\u2500\u2500 funcs.py          # Utility functions\n\u251c\u2500\u2500 game.py           # Core game logic and variants\n\u251c\u2500\u2500 hand.py           # Hand representation\n\u251c\u2500\u2500 hole_cards.py     # Hole cards management\n\u251c\u2500\u2500 player.py         # Player classes and logic\n\u251c\u2500\u2500 pot.py            # Pot management\n\u2514\u2500\u2500 table.py          # Table management\n\ntests/               # Comprehensive test suite\n```\n\n## Testing\n\nRun the test suite with pytest:\n\n```bash\npytest tests/\n```\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Comprehensive Python library for managing poker games",
    "version": "3.4.0",
    "project_urls": null,
    "split_keywords": [
        "poker",
        " texas-holdem",
        " omaha",
        " card-games",
        " game-evaluation"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2e1647322050e352e2df41dea0ba2758abe6ea62bf1f69060145777e51d202f7",
                "md5": "0b3c16486c218fd7d3a1b2ef42aed2c6",
                "sha256": "3a0d78938b02a8a361af88b92b0af40cf191dfe9da361888d0c9e56f5c6c273d"
            },
            "downloads": -1,
            "filename": "pokermgr-3.4.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0b3c16486c218fd7d3a1b2ef42aed2c6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 76258,
            "upload_time": "2025-07-29T02:50:59",
            "upload_time_iso_8601": "2025-07-29T02:50:59.213840Z",
            "url": "https://files.pythonhosted.org/packages/2e/16/47322050e352e2df41dea0ba2758abe6ea62bf1f69060145777e51d202f7/pokermgr-3.4.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "60b75bd6e3ba0238c244c6447cc64adf914a2ebc203c4b36627f9e8a7b1e6335",
                "md5": "a4ed0ffe3ee2e999db5b0a82c1bc5e42",
                "sha256": "0e59404e14df9785318d494ad781f2ebd7f6c3b9d826889c03e128372f247fea"
            },
            "downloads": -1,
            "filename": "pokermgr-3.4.0.tar.gz",
            "has_sig": false,
            "md5_digest": "a4ed0ffe3ee2e999db5b0a82c1bc5e42",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 62371,
            "upload_time": "2025-07-29T02:51:00",
            "upload_time_iso_8601": "2025-07-29T02:51:00.498987Z",
            "url": "https://files.pythonhosted.org/packages/60/b7/5bd6e3ba0238c244c6447cc64adf914a2ebc203c4b36627f9e8a7b1e6335/pokermgr-3.4.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-29 02:51:00",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "pokermgr"
}
        
Elapsed time: 1.22951s