11from __future__ import annotations
22
3+ import re
34from pathlib import Path
45
56import yaml
6- from pydantic import BaseModel
7+ from pydantic import BaseModel , field_validator
78from pydantic_settings import BaseSettings
89
910BACKEND_KEYS : frozenset [str ] = frozenset ({"slurm_ssh" , "local" })
1011
12+ _VALID_ENV_VAR_NAME = re .compile (r"^[A-Za-z_][A-Za-z0-9_]*$" )
13+
14+
15+ def _validate_env_var_names (v : list [str ] | None ) -> list [str ] | None :
16+ if v is not None :
17+ for name in v :
18+ if not _VALID_ENV_VAR_NAME .match (name ):
19+ msg = f"allowed_env_vars entry is not a valid env var name: { name !r} "
20+ raise ValueError (msg )
21+ return v
22+
1123
1224class Settings (BaseSettings ):
1325 """Application settings loaded from environment variables."""
@@ -40,6 +52,12 @@ class SlurmSSHConfig(BaseModel):
4052 scratch_dir : str
4153 default_snakemake_args : list [str ] = []
4254 snkmt_db_sync_interval : float = 30.0
55+ allowed_env_vars : list [str ] | None = None
56+
57+ @field_validator ("allowed_env_vars" )
58+ @classmethod
59+ def _validate_allowed_env_vars (cls , v : list [str ] | None ) -> list [str ] | None :
60+ return _validate_env_var_names (v )
4361
4462
4563class LocalConfig (BaseModel ):
@@ -50,6 +68,12 @@ class LocalConfig(BaseModel):
5068 poll_interval : float = 5.0
5169 default_snakemake_args : list [str ] = []
5270 snkmt_db_sync_interval : float = 30.0
71+ allowed_env_vars : list [str ] | None = None
72+
73+ @field_validator ("allowed_env_vars" )
74+ @classmethod
75+ def _validate_allowed_env_vars (cls , v : list [str ] | None ) -> list [str ] | None :
76+ return _validate_env_var_names (v )
5377
5478
5579def load_config (
0 commit comments