Coverage for src / osiris_cli / profiles.py: 0%

41 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-31 05:01 +0200

1import json 

2from pathlib import Path 

3from typing import Dict, Any, List 

4 

5from .config import CONFIG_DIR, Settings 

6 

7PROFILE_FILE = CONFIG_DIR / "profiles.json" 

8 

9PROFILE_FIELDS = [ 

10 "provider", 

11 "provider_base_url", 

12 "default_model", 

13 "temperature", 

14 "system_prompt", 

15 "yolo_mode", 

16 "reasoning_mode", 

17 "safety_profile", 

18 "offline_fallback", 

19 "offline_provider", 

20 "offline_model", 

21] 

22 

23 

24def _load_profiles() -> Dict[str, Any]: 

25 if PROFILE_FILE.exists(): 

26 try: 

27 return json.loads(PROFILE_FILE.read_text(encoding="utf-8")) 

28 except Exception: 

29 return {} 

30 return {} 

31 

32 

33def _save_profiles(data: Dict[str, Any]) -> None: 

34 PROFILE_FILE.parent.mkdir(parents=True, exist_ok=True) 

35 PROFILE_FILE.write_text(json.dumps(data, indent=2), encoding="utf-8") 

36 

37 

38def list_profiles() -> List[str]: 

39 return sorted(_load_profiles().keys()) 

40 

41 

42def save_profile(name: str, settings: Settings) -> None: 

43 profiles = _load_profiles() 

44 snapshot = {field: getattr(settings, field, None) for field in PROFILE_FIELDS} 

45 profiles[name] = snapshot 

46 _save_profiles(profiles) 

47 

48 

49def load_profile(name: str, settings: Settings) -> bool: 

50 profiles = _load_profiles() 

51 if name not in profiles: 

52 return False 

53 snapshot = profiles[name] 

54 for field, value in snapshot.items(): 

55 if hasattr(settings, field): 

56 setattr(settings, field, value) 

57 settings.apply_defaults() 

58 settings.save() 

59 return True 

60 

61 

62def delete_profile(name: str) -> bool: 

63 profiles = _load_profiles() 

64 if name not in profiles: 

65 return False 

66 profiles.pop(name, None) 

67 _save_profiles(profiles) 

68 return True