Coverage for src/lexigram/web/config/server.py: 77%

22 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 04:37 +0800

1"""Web server configuration.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass 

6from typing import ClassVar 

7 

8from lexigram.config import BaseConfig 

9from lexigram.validation import ConfigDict, Field, model_validator 

10from lexigram.web import constants as const 

11 

12 

13@dataclass(init=False) 

14class ServerConfig(BaseConfig): 

15 """Server configuration.""" 

16 

17 model_config: ClassVar[ConfigDict] = ConfigDict(extra="ignore") 

18 

19 host: str = Field(default=const.DEFAULT_HOST, description="Bind host") 

20 port: int = Field(default=const.DEFAULT_PORT, description="Bind port") 

21 workers: int = Field(default=const.DEFAULT_WORKERS, description="Number of workers") 

22 reload: bool = Field(default=const.DEFAULT_RELOAD, description="Enable auto-reload") 

23 debug: bool = Field(default=False, description="Enable debug mode") 

24 

25 @model_validator(mode="after") 

26 def validate_server(self) -> ServerConfig: 

27 """Validate server host and port.""" 

28 if not (1 <= self.port <= 65535): 

29 raise ValueError(f"Invalid port: {self.port}. Must be between 1 and 65535.") 

30 if not self.host: 

31 raise ValueError("Server host cannot be empty.") 

32 return self 

33 

34 

35__all__ = [ 

36 "ServerConfig", 

37]