feat(mac_brew_pkg): Improve latest_version support

Fixes #66291
This commit is contained in:
Carlos Álvaro 2024-06-02 18:05:33 +02:00 committed by Daniel Wozniak
parent c56afbe514
commit faa7a7ba97
2 changed files with 184 additions and 11 deletions

View file

@ -299,7 +299,7 @@ def version(*names, **kwargs):
return __salt__["pkg_resource.version"](*names, **kwargs)
def latest_version(*names, **kwargs):
def latest_version(*names, options=None, **kwargs):
"""
Return the latest version of the named package available for upgrade or
installation
@ -307,30 +307,47 @@ def latest_version(*names, **kwargs):
Currently chooses stable versions, falling back to devel if that does not
exist.
options
Additional options to pass to brew. Useful to remove ambiguous packages
that can conflict between formulae and casks.
CLI Example:
.. code-block:: bash
salt '*' pkg.latest_version <package name>
salt '*' pkg.latest_version <package1> <package2> <package3>
salt '*' pkg.latest_version <package name> options='["--cask"]'
"""
refresh = salt.utils.data.is_true(kwargs.pop("refresh", True))
if refresh:
refresh_db()
def get_version(pkg_info):
# Perhaps this will need an option to pick devel by default
version = pkg_info["versions"]["stable"] or pkg_info["versions"]["devel"]
if pkg_info["versions"]["bottle"] and pkg_info["revision"] >= 1:
version = "{}_{}".format(version, pkg_info["revision"])
return version
if "versions" in pkg_info.keys():
# Typically, formulae uses the 'versions' token
# Perhaps this will need an option to pick devel by default
pkg_version = (
pkg_info["versions"]["stable"] or pkg_info["versions"]["devel"]
)
if pkg_info["versions"]["bottle"] and pkg_info["revision"] >= 1:
pkg_version = f"{pkg_version}_{pkg_info['revision']}"
return pkg_version
versions_dict = {key: get_version(val) for key, val in _info(*names).items()}
if "version" in pkg_info.keys():
# Typically, casks use the 'version' token
return pkg_info["version"]
return None
versions_dict = {
key: get_version(val) for key, val in _info(*names, options=options).items()
}
if len(names) == 1:
return next(iter(versions_dict.values()))
else:
return versions_dict
return versions_dict
# available_version is being deprecated

View file

@ -644,8 +644,164 @@ def test_version():
assert mac_brew.version("foo") == "0.1.5"
# 'latest_version' function tests: 0
# It has not been fully implemented
# 'latest_version' function tests: 3
def test_latest_version():
"""
Tests latest version name returned
"""
mock_refresh_db = MagicMock()
mock_call_brew = MagicMock(
return_value={
"pid": 12345,
"retcode": 0,
"stderr": "",
"stdout": textwrap.dedent(
"""\
{
"formulae": [
{
"name": "neovim",
"full_name": "neovim",
"tap": "homebrew/core",
"aliases": [
"nvim"
],
"versions": {
"stable": "0.10.0",
"head": "HEAD",
"bottle": true
},
"revision": 0
}
],
"casks": [
]
}
"""
),
}
)
with patch("salt.modules.mac_brew_pkg.refresh_db", mock_refresh_db), patch(
"salt.modules.mac_brew_pkg._call_brew", mock_call_brew
):
assert mac_brew.latest_version("neovim") == "0.10.0"
mock_refresh_db.assert_called_once()
def test_latest_version_multiple_names():
"""
Tests latest version name returned
"""
mock_refresh_db = MagicMock()
mock_call_brew = MagicMock(
return_value={
"pid": 12345,
"retcode": 0,
"stderr": "",
"stdout": textwrap.dedent(
"""\
{
"formulae": [
{
"name": "salt",
"full_name": "cdalvaro/tap/salt",
"tap": "cdalvaro/tap",
"aliases": [],
"versions": {
"stable": "3007.1",
"head": "HEAD",
"bottle": true
},
"revision": 2
},
{
"name": "neovim",
"full_name": "neovim",
"tap": "homebrew/core",
"aliases": [
"nvim"
],
"versions": {
"stable": "0.10.0",
"head": "HEAD",
"bottle": true
},
"revision": 0
}
],
"casks": [
{
"token": "visual-studio-code",
"full_token": "visual-studio-code",
"tap": "homebrew/cask",
"version": "1.89.1",
"installed": "1.86.0"
}
]
}
"""
),
}
)
exptected_versions = {
"cdalvaro/tap/salt": "3007.1_2",
"nvim": "0.10.0",
"visual-studio-code": "1.89.1",
}
with patch("salt.modules.mac_brew_pkg.refresh_db", mock_refresh_db), patch(
"salt.modules.mac_brew_pkg._call_brew", mock_call_brew
):
assert (
mac_brew.latest_version("cdalvaro/tap/salt", "nvim", "visual-studio-code")
== exptected_versions
)
mock_refresh_db.assert_called_once()
def test_latest_version_with_options():
mock_refresh_db = MagicMock()
mock_call_brew = MagicMock(
return_value={
"pid": 12345,
"retcode": 0,
"stderr": "",
"stdout": textwrap.dedent(
"""\
{
"formulae": [
],
"casks": [
{
"token": "salt",
"full_token": "cdalvaro/tap/salt",
"tap": "cdalvaro/tap",
"version": "3007.1",
"installed": "3007.1"
}
]
}
"""
),
}
)
with patch("salt.modules.mac_brew_pkg.refresh_db", mock_refresh_db), patch(
"salt.modules.mac_brew_pkg._call_brew", mock_call_brew
):
assert (
mac_brew.latest_version("cdalvaro/tap/salt", options=["--cask"]) == "3007.1"
)
mock_refresh_db.assert_called_once()
mock_call_brew.assert_called_once_with(
"info", "--json=v2", "--cask", "cdalvaro/tap/salt"
)
# 'remove' function tests: 1
# Only tested a few basics