4444 """ ,
4545 re .VERBOSE ,
4646)
47+ # Checks for database link flags, e.g. NPP MS, at the end
48+ _DATABASE_FLAGS_RE = re .compile (
49+ r"(?:PP|NPP)?" + r"(?:[ ]+(?:MS|NMS|MSS|MSI))?$" ,
50+ re .VERBOSE ,
51+ )
4752_LONG_DOM_RE = re .compile (r"^[a-zA-Z]{2}\d{2}[a-zA-Z]$" )
4853_SHORT_DOM_RE = re .compile (r"^[a-zA-Z]{1}\d{2}(-[0-9]{1})?$" )
4954_OPIS_URL_RE = re .compile (r"^(https:\/\/)?([a-z0-9]{3}-(?:[0-9]-)?opis(?:.[a-z0-9]*)*)" )
@@ -99,6 +104,7 @@ class Component(BaseModel):
99104 desc : str | None = None
100105 extras : list [str ] | None = None
101106 file : str | None = None
107+ devsta : list [str ] | None = None
102108 model_config = ConfigDict (extra = "forbid" )
103109
104110 @field_validator ("prefix" )
@@ -119,6 +125,26 @@ def _check_extras(cls, v: list[str]) -> list[str]:
119125 raise ValueError ("extras must contain unique items" )
120126 return v
121127
128+ @field_validator ("devsta" )
129+ @classmethod
130+ def _check_devsta (cls , v : list [str ]) -> list [str ]:
131+ for p in v :
132+ prefix , flags = p .split (" " , 1 )
133+
134+ if not _DLS_PREFIX_RE .match (prefix ):
135+ raise ValueError (
136+ f"devsta item '{ p } ' does not match extended DLS prefix pattern"
137+ )
138+ if not _DATABASE_FLAGS_RE .match (flags ):
139+ raise ValueError (
140+ f"devsta item '{ p } ' does have valid database link flags"
141+ )
142+
143+ # ensure unique (schema enforces too)
144+ if len (set (v )) != len (v ):
145+ raise ValueError ("devsta must contain unique items" )
146+ return v
147+
122148 @computed_field
123149 @property
124150 def P (self ) -> str | None : # noqa: N802
0 commit comments