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

25 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2024-04-30 09:42 +0000

1"""Pyproject models.""" 

2from typing import Optional, Set 

3 

4from packaging.version import parse as parse_version 

5from pydantic import ( 

6 BaseModel, 

7 Field, 

8 field_validator, 

9) 

10from typing_extensions import Annotated 

11 

12from somesy.core.types import HttpUrlStr 

13 

14 

15class FortranConfig(BaseModel): 

16 """Fortran configuration model.""" 

17 

18 model_config = dict(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 Optional[str], 

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[ 

32 Optional[str], Field(description="Package description") 

33 ] = None 

34 license: Annotated[ 

35 Optional[str], 

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

37 ] = None 

38 author: Annotated[ 

39 Optional[str], Field(description="Package author information") 

40 ] = None 

41 maintainer: Annotated[ 

42 Optional[str], Field(description="Package maintainer information") 

43 ] = None 

44 copyright: Annotated[ 

45 Optional[str], Field(description="Package copyright text") 

46 ] = None 

47 homepage: Annotated[ 

48 Optional[HttpUrlStr], Field(description="Package homepage") 

49 ] = None 

50 keywords: Annotated[ 

51 Optional[Set[str]], Field(description="Keywords that describe the package") 

52 ] = None 

53 categories: Annotated[ 

54 Optional[Set[str]], Field(description="Categories that package falls into") 

55 ] = None 

56 

57 @field_validator("version") 

58 @classmethod 

59 def validate_version(cls, v): 

60 """Validate version using PEP 440.""" 

61 try: 

62 _ = parse_version(v) 

63 except ValueError as err: 

64 raise ValueError("Invalid version") from err 

65 return v