Source code for cb_events.config
"""Configuration for the Chaturbate Events API client.
This module provides ClientConfig for customizing client behavior including
timeouts, retry logic, and validation strictness.
Example:
Custom configuration::
from cb_events import ClientConfig, EventClient
config = ClientConfig(
timeout=30,
retry_attempts=5,
strict_validation=False,
)
async with EventClient(
"https://eventsapi.chaturbate.com/events/user/token/",
config=config,
) as client:
async for event in client:
print(event)
"""
from __future__ import annotations
from pydantic import BaseModel, ConfigDict, Field, model_validator
from typing_extensions import Self
[docs]
class ClientConfig(BaseModel):
"""Immutable configuration for EventClient behavior.
Controls timeouts, retry logic, and validation strictness.
Example:
Lenient configuration for development::
config = ClientConfig(
strict_validation=False,
retry_attempts=3,
)
Note:
This class is immutable (frozen). Create a new instance to change
configuration values.
"""
[docs]
model_config = ConfigDict(frozen=True) # pyright: ignore[reportUnannotatedClassAttribute] # pylint: disable=line-too-long
[docs]
timeout: int = Field(default=10, gt=0)
"""Server long-poll timeout in seconds."""
[docs]
strict_validation: bool = False
"""Raise on invalid events vs. skip and log."""
[docs]
retry_attempts: int = Field(default=8, ge=1)
"""Total attempts including the initial request (must be >= 1)."""
[docs]
retry_backoff: float = Field(default=1.0, ge=0)
"""Initial retry delay in seconds."""
[docs]
retry_factor: float = Field(default=2.0, gt=0)
"""Backoff multiplier applied after each retry."""
[docs]
retry_max_delay: float = Field(default=30.0, ge=0)
"""Maximum delay between retries in seconds."""
@model_validator(mode="after")
[docs]
def validate_delays(self) -> Self:
"""Validate retry delay configuration.
Returns:
Self: Validated configuration instance.
Raises:
ValueError: If retry_max_delay is less than retry_backoff.
"""
if self.retry_max_delay < self.retry_backoff:
msg = (
f"retry_max_delay ({self.retry_max_delay}) must be >= "
f"retry_backoff ({self.retry_backoff}). "
f"Consider setting retry_max_delay to at least "
f"{self.retry_backoff} or reducing retry_backoff."
)
raise ValueError(msg)
return self