1+ from typing import Optional
2+
13import os
24from pathlib import Path
3- from typing import Optional
4- from packaging import version
55
66import pydantic
7- # See https://linear.app/giskard/issue/GSK-1745/upgrade-pydantic-to-20
7+ from packaging import version
8+ from pydantic import BaseModel
9+
10+ # See https://linear.app/giskard/issue/GSK-1745/upgrade-pydantic-to-20
811IS_PYDANTIC_V2 = version .parse (pydantic .version .VERSION ) >= version .parse ("2.0" )
912
1013if IS_PYDANTIC_V2 :
11- # Package have been moved out in Pydantic v2
12- from pydantic_settings import BaseSettings
14+ FIELD_ATTR = "model_fields"
1315else :
14- from pydantic . env_settings import BaseSettings
16+ FIELD_ATTR = "__fields__"
1517
1618
1719def expand_env_var (env_var : Optional [str ]) -> Optional [str ]:
18- if not env_var :
19- return env_var
20- while True :
21- interpolated = os .path .expanduser (os .path .expandvars (str (env_var )))
22- if interpolated == env_var :
23- return interpolated
24- else :
25- env_var = interpolated
20+ current = env_var
21+ previous = None
22+ while current != previous :
23+ previous = current
24+ current = os .path .expandvars (current )
25+ return current
2626
2727
28- class Settings (BaseSettings ):
28+ class Settings (BaseModel ):
2929 home : str = "~/giskard-home"
3030 ws_port : int = 9000
3131 ws_path : str = "/ml-worker"
@@ -42,7 +42,13 @@ class Config:
4242
4343 @property
4444 def home_dir (self ) -> Path :
45- return Path (expand_env_var (self .home ))
45+ return Path (expand_env_var (self .home )).resolve ()
46+
47+ @classmethod
48+ def build_from_env (cls ) -> "Settings" :
49+ return Settings (
50+ ** {k : os .getenv (cls .Config .env_prefix + k .upper (), v .default ) for k , v in getattr (cls , FIELD_ATTR ).items ()}
51+ )
4652
4753
48- settings = Settings ()
54+ settings = Settings . build_from_env ()
0 commit comments