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
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-04 11:35 +0000
1"""Julia model."""
3import uuid
4from logging import getLogger
5from typing import Annotated
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)
17EMailAddress = TypeAdapter(EmailStr)
18logger = getLogger("somesy")
21class JuliaConfig(BaseModel):
22 """Julia configuration model."""
24 model_config = {"use_enum_values": True}
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
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
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
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