Coverage for src/somesy/fortran/models.py: 92%

24 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-04 11:35 +0000

1"""Pyproject models.""" 

2 

3from typing import Annotated 

4 

5from packaging.version import parse as parse_version 

6from pydantic import ( 

7 BaseModel, 

8 Field, 

9 field_validator, 

10) 

11 

12from somesy.core.types import HttpUrlStr 

13 

14 

15class FortranConfig(BaseModel): 

16 """Fortran configuration model.""" 

17 

18 model_config = {"use_enum_values": True} 

19 

20 name: Annotated[ 

21 str, 

22 Field(pattern=r"^[A-Za-z0-9]+([_-][A-Za-z0-9]+)*$", description="Package name"), 

23 ] 

24 version: Annotated[ 

25 str | None, 

26 Field( 

27 pattern=r"^\d+(\.\d+)*((a|b|rc)\d+)?(post\d+)?(dev\d+)?$", 

28 description="Package version", 

29 ), 

30 ] = None 

31 description: Annotated[str | None, Field(description="Package description")] = None 

32 license: Annotated[ 

33 str | None, 

34 Field(description="SPDX license identifier(s)."), 

35 ] = None 

36 author: Annotated[str | None, Field(description="Package author information")] = ( 

37 None 

38 ) 

39 maintainer: Annotated[ 

40 str | None, Field(description="Package maintainer information") 

41 ] = None 

42 copyright: Annotated[str | None, Field(description="Package copyright text")] = None 

43 homepage: Annotated[HttpUrlStr | None, Field(description="Package homepage")] = None 

44 keywords: Annotated[ 

45 set[str] | None, Field(description="Keywords that describe the package") 

46 ] = None 

47 categories: Annotated[ 

48 set[str] | None, Field(description="Categories that package falls into") 

49 ] = None 

50 

51 @field_validator("version") 

52 @classmethod 

53 def validate_version(cls, v): 

54 """Validate version using PEP 440.""" 

55 try: 

56 _ = parse_version(v) 

57 except ValueError as err: 

58 raise ValueError("Invalid version") from err 

59 return v