Coverage for src/somesy/julia/models.py: 86%

43 statements  

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

1"""Julia model.""" 

2 

3import uuid 

4from logging import getLogger 

5from typing import Annotated 

6 

7from packaging.version import parse as parse_version 

8from pydantic import ( 

9 BaseModel, 

10 EmailStr, 

11 Field, 

12 TypeAdapter, 

13 ValidationError, 

14 field_validator, 

15) 

16 

17EMailAddress = TypeAdapter(EmailStr) 

18logger = getLogger("somesy") 

19 

20 

21class JuliaConfig(BaseModel): 

22 """Julia configuration model.""" 

23 

24 model_config = {"use_enum_values": True} 

25 

26 name: Annotated[ 

27 str, 

28 Field(description="Package name"), 

29 ] 

30 version: Annotated[ 

31 str, 

32 Field( 

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

34 description="Package version", 

35 ), 

36 ] 

37 uuid: Annotated[str, Field(description="Package UUID")] 

38 authors: Annotated[set[str] | None, Field(description="Package authors")] = None 

39 

40 @field_validator("version") 

41 @classmethod 

42 def validate_version(cls, v): 

43 """Validate version using PEP 440.""" 

44 try: 

45 _ = parse_version(v) 

46 except ValueError as err: 

47 raise ValueError("Invalid version") from err 

48 return v 

49 

50 @field_validator("authors") 

51 @classmethod 

52 def validate_email_format(cls, v): 

53 """Validate person format, omit person that is not in correct format, don't raise an error.""" 

54 if v is None: 

55 return [] 

56 validated = [] 

57 for author in v: 

58 try: 

59 if not ( 

60 not isinstance(author, str) 

61 or " " not in author 

62 or not EMailAddress.validate_python(author.split(" ")[-1][1:-1]) 

63 ): 

64 validated.append(author) 

65 else: 

66 logger.warning( 

67 f"Invalid email format for author {author}, omitting." 

68 ) 

69 except ValidationError: 

70 logger.warning(f"Invalid format for author {author}, omitting.") 

71 return validated 

72 

73 @field_validator("uuid") 

74 @classmethod 

75 def validate_uuid(cls, v): 

76 """Validate uuid field.""" 

77 try: 

78 _ = uuid.UUID(v) 

79 except ValueError as err: 

80 raise ValueError("Invalid UUID") from err 

81 return v