| """ |
| GitHub Token Pool Manager |
| ========================= |
| |
| Simple round-robin token pool for distributing API requests across multiple tokens |
| to avoid rate limit issues. |
| """ |
|
|
| from typing import List |
| from src.logger import get_logger |
|
|
| logger = get_logger(__name__) |
|
|
|
|
| class GitHubTokenPool: |
| """ |
| Manages a pool of GitHub tokens with round-robin selection. |
| """ |
| |
| def __init__(self, tokens: List[str]): |
| """ |
| Initialize token pool. |
| |
| Args: |
| tokens: List of GitHub personal access tokens |
| """ |
| if not tokens: |
| raise ValueError("Token pool must contain at least one token") |
| |
| self.tokens = tokens |
| self.current_index = 0 |
| logger.info(f"Initialized GitHub token pool with {len(tokens)} token(s)") |
| |
| def get_next_token(self) -> str: |
| """ |
| Get the next token in round-robin fashion. |
| |
| Returns: |
| The next GitHub token to use |
| """ |
| token = self.tokens[self.current_index] |
| self.current_index = (self.current_index + 1) % len(self.tokens) |
| return token |
| |
| def get_current_token(self) -> str: |
| """ |
| Get the current token without advancing the index. |
| |
| Returns: |
| The current GitHub token |
| """ |
| return self.tokens[self.current_index] |
| |
| @property |
| def pool_size(self) -> int: |
| """Get the number of tokens in the pool.""" |
| return len(self.tokens) |