diff --git a/src/langbot/pkg/utils/pkgmgr.py b/src/langbot/pkg/utils/pkgmgr.py index 9ce8bdb8..549b86d3 100644 --- a/src/langbot/pkg/utils/pkgmgr.py +++ b/src/langbot/pkg/utils/pkgmgr.py @@ -23,7 +23,10 @@ def run_pip(params: list): pipmain(params) -def install_requirements(file, extra_params: list = []): +def install_requirements(file, extra_params: list | None = None): + if extra_params is None: + extra_params = [] + pipmain( [ 'install', diff --git a/tests/unit_tests/utils/test_pkgmgr.py b/tests/unit_tests/utils/test_pkgmgr.py index 721ce090..be0290d1 100644 --- a/tests/unit_tests/utils/test_pkgmgr.py +++ b/tests/unit_tests/utils/test_pkgmgr.py @@ -6,6 +6,7 @@ Tests pip command generation without actual installation. from __future__ import annotations +import inspect from unittest.mock import patch from langbot.pkg.utils import pkgmgr @@ -99,3 +100,34 @@ class TestPkgMgr: call_args = mock_pipmain.call_args[0][0] assert '--no-cache-dir' in call_args assert '--verbose' in call_args + + def test_install_requirements_defaults_extra_params_to_none(self): + """install_requirements does not use a mutable list default.""" + signature = inspect.signature(pkgmgr.install_requirements) + + assert signature.parameters['extra_params'].default is None + + def test_install_requirements_omitted_extra_params_are_isolated(self): + """Repeated calls without extra_params use independent base commands.""" + with patch('langbot.pkg.utils.pkgmgr.pipmain') as mock_pipmain: + pkgmgr.install_requirements('requirements.txt') + pkgmgr.install_requirements('requirements-dev.txt') + + assert mock_pipmain.call_args_list[0].args[0] == [ + 'install', + '-r', + 'requirements.txt', + '-i', + 'https://pypi.tuna.tsinghua.edu.cn/simple', + '--trusted-host', + 'pypi.tuna.tsinghua.edu.cn', + ] + assert mock_pipmain.call_args_list[1].args[0] == [ + 'install', + '-r', + 'requirements-dev.txt', + '-i', + 'https://pypi.tuna.tsinghua.edu.cn/simple', + '--trusted-host', + 'pypi.tuna.tsinghua.edu.cn', + ]