diff --git a/salt/states/pip_state.py b/salt/states/pip_state.py index cc5d877c06e9..de75057adf47 100644 --- a/salt/states/pip_state.py +++ b/salt/states/pip_state.py @@ -251,7 +251,7 @@ def _check_if_installed( index_url, extra_index_url, pip_list=False, - **kwargs + **kwargs, ): """ Takes a package name and version specification (if any) and checks it is @@ -367,7 +367,9 @@ def _pep440_version_cmp(pkg1, pkg2, ignore_epoch=False): if pkg_resources.parse_version(pkg1) > pkg_resources.parse_version(pkg2): return 1 except Exception as exc: # pylint: disable=broad-except - logger.exception(f'Comparison of package versions "{pkg1}" and "{pkg2}" failed: {exc}') + logger.exception( + f'Comparison of package versions "{pkg1}" and "{pkg2}" failed: {exc}' + ) return None @@ -418,7 +420,7 @@ def installed( cache_dir=None, no_binary=None, extra_args=None, - **kwargs + **kwargs, ): """ Make sure the package is installed @@ -853,7 +855,7 @@ def installed( # If we fail, then just send False, and we'll try again in the next function call except Exception as exc: # pylint: disable=broad-except logger.exception( - f'Pre-caching of PIP packages during states.pip.installed failed by exception from pip.list: {exc}' + f"Pre-caching of PIP packages during states.pip.installed failed by exception from pip.list: {exc}" ) pip_list = False @@ -874,7 +876,7 @@ def installed( index_url, extra_index_url, pip_list, - **kwargs + **kwargs, ) # If _check_if_installed result is None, something went wrong with # the command running. This way we keep stateful output. @@ -980,7 +982,7 @@ def installed( no_cache_dir=no_cache_dir, extra_args=extra_args, disable_version_check=True, - **kwargs + **kwargs, ) if pip_install_call and pip_install_call.get("retcode", 1) == 0: @@ -1045,7 +1047,7 @@ def installed( user=user, cwd=cwd, env_vars=env_vars, - **kwargs + **kwargs, ) ) diff --git a/tests/pytests/unit/states/test_pip.py b/tests/pytests/unit/states/test_pip.py index a7cdc106e62f..307ba5e1e650 100644 --- a/tests/pytests/unit/states/test_pip.py +++ b/tests/pytests/unit/states/test_pip.py @@ -12,33 +12,33 @@ @pytest.fixture def configure_loader_modules(): - return { - pip_state: { - '__env__': 'base', - '__opts__': { - 'test': False - } - } - } + return {pip_state: {"__env__": "base", "__opts__": {"test": False}}} def test_issue_64169(caplog): - pkg_to_install = 'nonexistent_package' - exception_message = 'Invalid JSON (test_issue_64169)' + pkg_to_install = "nonexistent_package" + exception_message = "Invalid JSON (test_issue_64169)" - mock_pip_list = MagicMock(side_effect=[ - CommandExecutionError(exception_message), # pre-cache the pip list (preinstall) - {}, # Checking if the pkg is already installed - {pkg_to_install: '100.10.1'} # Confirming successful installation - ]) - mock_pip_version = MagicMock(return_value='100.10.1') + mock_pip_list = MagicMock( + side_effect=[ + CommandExecutionError( + exception_message + ), # pre-cache the pip list (preinstall) + {}, # Checking if the pkg is already installed + {pkg_to_install: "100.10.1"}, # Confirming successful installation + ] + ) + mock_pip_version = MagicMock(return_value="100.10.1") mock_pip_install = MagicMock(return_value={"retcode": 0, "stdout": ""}) - with patch.dict(pip_state.__salt__, { - "pip.list": mock_pip_list, - "pip.version": mock_pip_version, - "pip.install": mock_pip_install - }): + with patch.dict( + pip_state.__salt__, + { + "pip.list": mock_pip_list, + "pip.version": mock_pip_version, + "pip.install": mock_pip_install, + }, + ): with caplog.at_level(logging.WARNING): # Call pip.installed with a specifically 'broken' pip.list. # pip.installed should continue, but log the exception from pip.list. @@ -47,24 +47,25 @@ def test_issue_64169(caplog): try: pip_state.installed( name=pkg_to_install, - use_wheel=False, # Set False to simplify testing + use_wheel=False, # Set False to simplify testing no_use_wheel=False, # ' - no_binary=False, # ' - log=None # Regression will cause this function call to throw - # an AttributeError + no_binary=False, # ' + log=None, # Regression will cause this function call to throw an AttributeError ) except AttributeError as exc: # Observed behavior in #64169 pytest.fail( - 'Regression on #64169: pip_state.installed seems to be throwing an unexpected AttributeException: ' - f'{exc}' + "Regression on #64169: pip_state.installed seems to be throwing an unexpected AttributeException: " + f"{exc}" ) # Take 64169 further and actually confirm that the exception from pip.list got logged. - assert 'Pre-caching of PIP packages during states.pip.installed failed by exception ' \ - f'from pip.list: {exception_message}' in caplog.messages + assert ( + "Pre-caching of PIP packages during states.pip.installed failed by exception " + f"from pip.list: {exception_message}" in caplog.messages + ) # Confirm that the state continued to install the package as expected. # Only check the 'pkgs' parameter of pip.install mock_install_call_args, mock_install_call_kwargs = mock_pip_install.call_args - assert mock_install_call_kwargs['pkgs'] == pkg_to_install + assert mock_install_call_kwargs["pkgs"] == pkg_to_install