- Require Python 3.15 in project metadata, runtime pin, and Docker stages. - Use lazy imports for database backends and type-only dependencies. - Defer benchmark dependencies until their code paths are used. - Rely on deferred annotations and use Path.info for file discovery. - Accept BattlesnakeArena alongside BattlesnakeEngine on game endpoints. - Advance quart_common for Python 3.15 and multi-agent validation. - Add pytest development dependencies and refresh the uv lockfile. - Test lazy backend loading, import order, and fresh file discovery. - Document the runtime requirements and locked uv workflow. BREAKING CHANGE: Python 3.15 or newer is required; earlier runtimes cannot parse the lazy import syntax.
27 lines
1.1 KiB
Python
27 lines
1.1 KiB
Python
from .Template import GameplayBackendTemplate
|
|
|
|
lazy from .PostgresqlGameplayBackend import PostgresqlGameplayBackend as PostgresqlBackend
|
|
lazy from .SqliteGameplayBackend import SqliteGameplayBackend as SqliteBackend
|
|
|
|
class GameplayBackendBuilder:
|
|
@staticmethod
|
|
def build(backend:str="sqlite", db_path:str|None=None, busy_timeout_ms:int=5000, pg_dsn:str|None=None, pg_min_size:int=1, pg_max_size:int=5) -> GameplayBackendTemplate:
|
|
normalized = (backend or "sqlite").strip().lower()
|
|
|
|
if normalized == "postgresql" or normalized == "postgres":
|
|
if not pg_dsn:
|
|
raise ValueError("pg_dsn is required for the postgresql backend")
|
|
return PostgresqlBackend(
|
|
dsn=pg_dsn,
|
|
min_size=pg_min_size,
|
|
max_size=pg_max_size,
|
|
sqlite_migration_path=db_path,
|
|
)
|
|
|
|
if normalized == "sqlite":
|
|
if not db_path:
|
|
raise ValueError("db_path is required for the sqlite backend")
|
|
return SqliteBackend(db_path=db_path, busy_timeout_ms=busy_timeout_ms)
|
|
|
|
raise ValueError(f"Unknown gameplay backend: {backend!r}. Choose 'sqlite' or 'postgresql'.")
|