Skip to content

Commit 7e75d61

Browse files
committed
Simplify Implementation Again
1 parent 23f93a9 commit 7e75d61

3 files changed

Lines changed: 100 additions & 96 deletions

File tree

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,27 @@
1-
from typing import ClassVar
1+
from pydantic import BaseModel, ConfigDict, model_validator
2+
from typing import Any
23

3-
from pals.parameters._multipole_base import _MultipoleBase
4+
# Valid parameter prefixes, their expected format and description
5+
_PARAMETER_PREFIXES = {
6+
"tilt": ("tiltN", "Tilt"),
7+
"En": ("EnN", "Normal component"),
8+
"Es": ("EsN", "Skew component"),
9+
}
410

511

6-
class ElectricMultipoleParameters(_MultipoleBase):
12+
def _validate_order(
13+
key_num: str, parameter_name: str, prefix: str, expected_format: str
14+
) -> None:
15+
"""Validate that the order number is a non-negative integer without leading zeros."""
16+
error_msg = (
17+
f"Invalid {parameter_name}: '{prefix}{key_num}'. "
18+
f"Parameter must be of the form '{expected_format}', where 'N' is a non-negative integer without leading zeros."
19+
)
20+
if not key_num.isdigit() or (key_num.startswith("0") and key_num != "0"):
21+
raise ValueError(error_msg)
22+
23+
24+
class ElectricMultipoleParameters(BaseModel):
725
"""Electric multipole parameters
826
927
Valid parameter formats:
@@ -15,9 +33,31 @@ class ElectricMultipoleParameters(_MultipoleBase):
1533
Where N is a positive integer without leading zeros (except "0" itself).
1634
"""
1735

18-
_KIND_NAME: ClassVar[str] = "electric"
19-
_PARAMETER_PREFIXES: ClassVar[dict[str, tuple[str, str]]] = {
20-
"tilt": ("tiltN", "Tilt"),
21-
"En": ("EnN", "Normal component"),
22-
"Es": ("EsN", "Skew component"),
23-
}
36+
model_config = ConfigDict(extra="allow")
37+
38+
@model_validator(mode="before")
39+
@classmethod
40+
def validate(cls, values: dict[str, Any]) -> dict[str, Any]:
41+
"""Validate all parameter names match the expected multipole format."""
42+
for key in values:
43+
# Check if key ends with 'L' for length-integrated values
44+
is_length_integrated = key.endswith("L")
45+
base_key = key[:-1] if is_length_integrated else key
46+
47+
# No length-integrated values allowed for tilt parameter
48+
if is_length_integrated and base_key.startswith("tilt"):
49+
raise ValueError(f"Invalid electric multipole parameter: '{key}'. ")
50+
51+
# Find matching prefix
52+
for prefix, (expected_format, description) in _PARAMETER_PREFIXES.items():
53+
if base_key.startswith(prefix):
54+
key_num = base_key[len(prefix) :]
55+
_validate_order(key_num, description, prefix, expected_format)
56+
break
57+
else:
58+
raise ValueError(
59+
f"Invalid electric multipole parameter: '{key}'. "
60+
f"Parameters must be of the form 'tiltN', 'EnN', or 'EsN' "
61+
f"(with optional 'L' suffix for length-integrated), where 'N' is a non-negative integer."
62+
)
63+
return values
Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
1-
from typing import ClassVar
1+
from pydantic import BaseModel, ConfigDict, model_validator
2+
from typing import Any
23

3-
from pals.parameters._multipole_base import _MultipoleBase
4+
# Valid parameter prefixes, their expected format and description
5+
_PARAMETER_PREFIXES = {
6+
"tilt": ("tiltN", "Tilt"),
7+
"Bn": ("BnN", "Normal component"),
8+
"Bs": ("BsN", "Skew component"),
9+
"Kn": ("KnN", "Normalized normal component"),
10+
"Ks": ("KsN", "Normalized skew component"),
11+
}
412

513

6-
class MagneticMultipoleParameters(_MultipoleBase):
14+
def _validate_order(
15+
key_num: str, parameter_name: str, prefix: str, expected_format: str
16+
) -> None:
17+
"""Validate that the order number is a non-negative integer without leading zeros."""
18+
error_msg = (
19+
f"Invalid {parameter_name}: '{prefix}{key_num}'. "
20+
f"Parameter must be of the form '{expected_format}', where 'N' is a non-negative integer without leading zeros."
21+
)
22+
if not key_num.isdigit() or (key_num.startswith("0") and key_num != "0"):
23+
raise ValueError(error_msg)
24+
25+
26+
class MagneticMultipoleParameters(BaseModel):
727
"""Magnetic multipole parameters
828
929
Valid parameter formats:
@@ -17,11 +37,31 @@ class MagneticMultipoleParameters(_MultipoleBase):
1737
Where N is a positive integer without leading zeros (except "0" itself).
1838
"""
1939

20-
_KIND_NAME: ClassVar[str] = "magnetic"
21-
_PARAMETER_PREFIXES: ClassVar[dict[str, tuple[str, str]]] = {
22-
"tilt": ("tiltN", "Tilt"),
23-
"Bn": ("BnN", "Normal component"),
24-
"Bs": ("BsN", "Skew component"),
25-
"Kn": ("KnN", "Normalized normal component"),
26-
"Ks": ("KsN", "Normalized skew component"),
27-
}
40+
model_config = ConfigDict(extra="allow")
41+
42+
@model_validator(mode="before")
43+
@classmethod
44+
def validate(cls, values: dict[str, Any]) -> dict[str, Any]:
45+
"""Validate all parameter names match the expected multipole format."""
46+
for key in values:
47+
# Check if key ends with 'L' for length-integrated values
48+
is_length_integrated = key.endswith("L")
49+
base_key = key[:-1] if is_length_integrated else key
50+
51+
# No length-integrated values allowed for tilt parameter
52+
if is_length_integrated and base_key.startswith("tilt"):
53+
raise ValueError(f"Invalid magnetic multipole parameter: '{key}'. ")
54+
55+
# Find matching prefix
56+
for prefix, (expected_format, description) in _PARAMETER_PREFIXES.items():
57+
if base_key.startswith(prefix):
58+
key_num = base_key[len(prefix) :]
59+
_validate_order(key_num, description, prefix, expected_format)
60+
break
61+
else:
62+
raise ValueError(
63+
f"Invalid magnetic multipole parameter: '{key}'. "
64+
f"Parameters must be of the form 'tiltN', 'BnN', 'BsN', 'KnN', or 'KsN' "
65+
f"(with optional 'L' suffix for length-integrated), where 'N' is a non-negative integer."
66+
)
67+
return values

src/pals/parameters/_multipole_base.py

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)