-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathconfig.py
More file actions
134 lines (101 loc) · 3.59 KB
/
Copy pathconfig.py
File metadata and controls
134 lines (101 loc) · 3.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from __future__ import annotations
import os
from dataclasses import dataclass
from urllib.parse import urlparse
from typing import Final
def _env_bool(name: str, default: bool) -> bool:
value = os.getenv(name)
if value is None:
return default
normalized = value.strip().lower()
if normalized in {"1", "true", "yes", "on"}:
return True
if normalized in {"0", "false", "no", "off"}:
return False
raise ValueError(f"Environment variable {name} must be a boolean-like value, got: {value!r}")
def _env_int(name: str, default: int) -> int:
value = os.getenv(name)
if value is None:
return default
return int(value)
def _env_str(name: str, default: str) -> str:
return os.getenv(name, default).strip() or default
def _normalize_openai_base_url(url: str) -> str:
"""Ensure OpenAI-compatible URL has the /v1 prefix expected by the SDK path layout."""
normalized = url.rstrip("/")
parsed = urlparse(normalized)
if parsed.netloc == "api.openai.com" and not parsed.path.endswith("/v1"):
return f"{normalized}/v1"
return normalized
@dataclass(frozen=True)
class UrlSettings:
tangerine: str
deep_seek: str
openai: str
@dataclass(frozen=True)
class UiSettings:
base_url: str
locale: str
sleep_time: int
cookie_banner_timeout_seconds: int
@dataclass(frozen=True)
class PlaywrightSettings:
headless: bool
slow_mo: int
@dataclass(frozen=True)
class AIGenerationSettings:
model: str
base_url: str
max_dom_chars: int
output_dir: str
temperature: float = 0.7
@dataclass(frozen=True)
class Settings:
urls: UrlSettings
ui: UiSettings
playwright: PlaywrightSettings
ai_generation: AIGenerationSettings
def load_settings() -> Settings:
urls = UrlSettings(
tangerine=_env_str("TANGERINE_URL", "https://www.tangerine.ca/en/personal"),
deep_seek=_env_str("DEEP_SEEK_URL", "https://api.deepseek.com"),
openai=_normalize_openai_base_url(_env_str("OPENAI_URL", "https://api.openai.com/v1")),
)
ui = UiSettings(
base_url=urls.tangerine,
locale=_env_str("UI_LOCALE", "en-US"),
sleep_time=_env_int("SLEEP_TIME", 1),
cookie_banner_timeout_seconds=_env_int("COOKIE_BANNER_TIMEOUT_SECONDS", 5),
)
playwright = PlaywrightSettings(
headless=_env_bool("PW_HEADLESS", False),
slow_mo=_env_int("PW_SLOW_MO", 0),
)
ai_generation = AIGenerationSettings(
model=_env_str("AI_GEN_MODEL", "gpt-4.1"),
base_url=_normalize_openai_base_url(_env_str("AI_GEN_BASE_URL", urls.openai)),
max_dom_chars=_env_int("AI_GEN_MAX_DOM_CHARS", 12000),
output_dir=_env_str("AI_GEN_OUTPUT_DIR", "pytest/tests/ai/generated_playwright"),
)
return Settings(urls=urls, ui=ui, playwright=playwright, ai_generation=ai_generation)
settings: Final[Settings] = load_settings()
def print_configured_settings() -> None:
"""Print shared runtime settings for quick verification."""
print(f"urls.tangerine={settings.urls.tangerine}")
print(f"urls.deep_seek={settings.urls.deep_seek}")
print(f"urls.openai={settings.urls.openai}")
print(f"ui.base_url={settings.ui.base_url}")
print(f"ui.locale={settings.ui.locale}")
print(f"ui.sleep_time={settings.ui.sleep_time}")
print(
"ui.cookie_banner_timeout_seconds="
f"{settings.ui.cookie_banner_timeout_seconds}"
)
print(f"playwright.headless={settings.playwright.headless}")
print(f"ai_generation.model={settings.ai_generation.model}")
print(f"ai_generation.base_url={settings.ai_generation.base_url}")
print(f"ai_generation.max_dom_chars={settings.ai_generation.max_dom_chars}")
print(f"ai_generation.output_dir={settings.ai_generation.output_dir}")
print(f"ai_generation.temperature={settings.ai_generation.temperature}")
if __name__ == "__main__":
print_configured_settings()