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
« 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
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
15EMailAddress = TypeAdapter(EmailStr)
18class JuliaConfig(BaseModel):
19 """Julia configuration model."""
21 model_config = dict(use_enum_values=True)
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
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
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
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