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

35 statements  

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

1"""Julia model.""" 

2import uuid 

3from typing import Optional, Set 

4 

5from packaging.version import parse as parse_version 

6from pydantic import ( 

7 BaseModel, 

8 EmailStr, 

9 Field, 

10 TypeAdapter, 

11 field_validator, 

12) 

13from typing_extensions import Annotated 

14 

15EMailAddress = TypeAdapter(EmailStr) 

16 

17 

18class JuliaConfig(BaseModel): 

19 """Julia configuration model.""" 

20 

21 model_config = dict(use_enum_values=True) 

22 

23 name: Annotated[ 

24 str, 

25 Field(description="Package name"), 

26 ] 

27 version: Annotated[ 

28 str, 

29 Field( 

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

31 description="Package version", 

32 ), 

33 ] 

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

35 authors: Annotated[Optional[Set[str]], Field(description="Package authors")] = None 

36 

37 @field_validator("version") 

38 @classmethod 

39 def validate_version(cls, v): 

40 """Validate version using PEP 440.""" 

41 try: 

42 _ = parse_version(v) 

43 except ValueError as err: 

44 raise ValueError("Invalid version") from err 

45 return v 

46 

47 @field_validator("authors") 

48 @classmethod 

49 def validate_email_format(cls, v): 

50 """Validate email format.""" 

51 for author in v: 

52 if ( 

53 not isinstance(author, str) 

54 or " " not in author 

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

56 ): 

57 raise ValueError("Invalid email format") 

58 return v 

59 

60 @field_validator("uuid") 

61 @classmethod 

62 def validate_uuid(cls, v): 

63 """Validate uuid field.""" 

64 try: 

65 _ = uuid.UUID(v) 

66 except ValueError as err: 

67 raise ValueError("Invalid UUID") from err 

68 return v