Skip to content

Commit 55ebb89

Browse files
committed
Refactor dotenv loading and logging setup in test generation
Move dotenv loading to shiny/_main_generate_test.py to ensure environment variables are loaded before API key validation, without requiring the generator to manage dotenv or logging. Remove dotenv and logging setup from ShinyTestGenerator in shiny/pytest/_generate/_main.py for cleaner separation of concerns.
1 parent 69d2ff4 commit 55ebb89

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

shiny/_main_generate_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def generate_test_file(
139139
if model:
140140
click.echo(f"📝 Using model: {model}")
141141

142-
generator = ShinyTestGenerator(provider=provider) # type: ignore
142+
generator = ShinyTestGenerator(provider=provider, setup_logging=False) # type: ignore
143143
_, test_file_path = generator.generate_test_from_file(
144144
app_file_path=str(app_path),
145145
model=model,

shiny/pytest/_generate/_main.py

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,23 +65,34 @@ def __init__(
6565
self.api_key = api_key
6666
self.log_file = log_file
6767

68+
try:
69+
load_dotenv(override=False)
70+
except Exception:
71+
pass
72+
6873
if setup_logging:
6974
self.setup_logging()
7075

7176
@property
7277
def client(self) -> Union[ChatAnthropic, ChatOpenAI]:
7378
"""Lazy-loaded chat client based on provider"""
7479
if self._client is None:
75-
if self.provider == "anthropic":
76-
self._client = (
77-
ChatAnthropic(api_key=self.api_key)
78-
if self.api_key
79-
else ChatAnthropic()
80+
if not self.api_key:
81+
env_var = (
82+
"ANTHROPIC_API_KEY"
83+
if self.provider == "anthropic"
84+
else "OPENAI_API_KEY"
8085
)
81-
elif self.provider == "openai":
82-
self._client = (
83-
ChatOpenAI(api_key=self.api_key) if self.api_key else ChatOpenAI()
86+
self.api_key = os.getenv(env_var)
87+
if not self.api_key:
88+
raise ValueError(
89+
f"Missing API key for provider '{self.provider}'. Set the environment variable "
90+
f"{'ANTHROPIC_API_KEY' if self.provider == 'anthropic' else 'OPENAI_API_KEY'} or pass api_key explicitly."
8491
)
92+
if self.provider == "anthropic":
93+
self._client = ChatAnthropic(api_key=self.api_key)
94+
elif self.provider == "openai":
95+
self._client = ChatOpenAI(api_key=self.api_key)
8596
else:
8697
raise ValueError(f"Unsupported provider: {self.provider}")
8798
return self._client
@@ -184,6 +195,18 @@ def get_llm_response(self, prompt: str, model: Optional[str] = None) -> str:
184195
model = self._validate_model_for_provider(model)
185196

186197
try:
198+
if not self.api_key:
199+
env_var = (
200+
"ANTHROPIC_API_KEY"
201+
if self.provider == "anthropic"
202+
else "OPENAI_API_KEY"
203+
)
204+
self.api_key = os.getenv(env_var)
205+
if not self.api_key:
206+
raise ValueError(
207+
f"Missing API key for provider '{self.provider}'. Set the environment variable "
208+
f"{'ANTHROPIC_API_KEY' if self.provider == 'anthropic' else 'OPENAI_API_KEY'} or pass api_key."
209+
)
187210
# Create chat client with the specified model
188211
if self.provider == "anthropic":
189212
chat = ChatAnthropic(
@@ -568,7 +591,9 @@ def cli():
568591
sys.exit(1)
569592

570593
try:
571-
generator = ShinyTestGenerator(provider=args.provider, api_key=args.api_key)
594+
generator = ShinyTestGenerator(
595+
provider=args.provider, api_key=args.api_key, setup_logging=False
596+
)
572597

573598
test_code, test_file_path = generator.generate_test_from_file(
574599
str(app_file_path),

0 commit comments

Comments
 (0)