Skip to content

Commit aebff26

Browse files
fix(cli): validate and sanitize env package list on managed env update
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/1b7812ec-b08b-493c-a403-53a33364cc7a Co-authored-by: MervinPraison <454862+MervinPraison@users.noreply.github.com>
1 parent d36aae5 commit aebff26

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/praisonai/praisonai/cli/commands/managed.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,10 @@ def envs_update(
509509
kwargs = {}
510510

511511
if packages:
512-
pkg_list = [p.strip() for p in packages.split(",")]
512+
pkg_list = [p.strip() for p in packages.split(",") if p.strip()]
513+
if not pkg_list:
514+
typer.echo("Error: --packages must include at least one package name")
515+
raise typer.Exit(1)
513516
kwargs["packages"] = {"pip": pkg_list}
514517

515518
if networking:

src/praisonai/tests/unit/cli/test_managed_cli_destructive.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,32 @@ def test_envs_update_networking_success(self, cli_runner, mock_anthropic_client)
167167
networking={"type": "limited"}
168168
)
169169

170+
def test_envs_update_packages_filters_empty_values(self, cli_runner, mock_anthropic_client):
171+
"""Test package parsing removes empty entries."""
172+
mock_env = Mock()
173+
mock_env.id = "env_01test123"
174+
mock_anthropic_client.beta.environments.update.return_value = mock_env
175+
176+
result = cli_runner.invoke(envs_app, [
177+
"update", "env_01test123", "--packages", "numpy, ,pandas,,"
178+
])
179+
180+
assert result.exit_code == 0
181+
mock_anthropic_client.beta.environments.update.assert_called_once_with(
182+
"env_01test123",
183+
packages={"pip": ["numpy", "pandas"]}
184+
)
185+
186+
def test_envs_update_packages_all_empty_values_error(self, cli_runner, mock_anthropic_client):
187+
"""Test package parsing rejects all-empty package input."""
188+
result = cli_runner.invoke(envs_app, [
189+
"update", "env_01test123", "--packages", " , , "
190+
])
191+
192+
assert result.exit_code == 1
193+
assert "--packages must include at least one package name" in result.stdout
194+
mock_anthropic_client.beta.environments.update.assert_not_called()
195+
170196
def test_envs_update_both_options(self, cli_runner, mock_anthropic_client):
171197
"""Test environment update with both packages and networking."""
172198
mock_env = Mock()
@@ -326,4 +352,4 @@ def fake_import(name, *args, **kwargs):
326352
assert exc_info.value.exit_code == 1
327353
finally:
328354
if saved is not None:
329-
sys.modules['anthropic'] = saved
355+
sys.modules['anthropic'] = saved

0 commit comments

Comments
 (0)