Coverage for src / repo_sync_kitty / config / models.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-23 09:31 -0500

1"""Pydantic models for manifest configuration.""" 

2 

3from pathlib import Path 

4from typing import Literal 

5 

6from pydantic import BaseModel, Field 

7 

8 

9class RemoteConfig(BaseModel): 

10 """Configuration for a remote git forge.""" 

11 

12 name: str 

13 base_url: str 

14 branch: str | None = None 

15 parallelism: int | None = None 

16 timeout: int | None = None 

17 

18 

19class ProjectConfig(BaseModel): 

20 """Configuration for a single project/repository.""" 

21 

22 slug: str 

23 path: Path 

24 remote: str | None = None 

25 branch: str | None = None 

26 status: Literal["active", "archived", "deleted"] = "active" 

27 

28 

29class CommonConfig(BaseModel): 

30 """Common/default configuration values.""" 

31 

32 root_path: Path 

33 branch: str = "main" 

34 remote: str 

35 parallelism: int = Field(default=4, ge=1, le=32) 

36 log_level: str = "info" 

37 timeout: int = Field(default=300, ge=1) 

38 ignore_extra: list[str] = Field(default_factory=list) 

39 

40 

41class Manifest(BaseModel): 

42 """Top-level manifest model.""" 

43 

44 common: CommonConfig 

45 remotes: list[RemoteConfig] = Field(default_factory=list) 

46 projects: list[ProjectConfig] = Field(default_factory=list)