From 47fd6494e02aab1de185dede86d39c1d44279b04 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 29 Apr 2025 23:47:57 +0100 Subject: [PATCH] Fixes #24: Ensure platform override works on prereleases. Previously, if all matching runtimes were prereleases, the platform specifier would essentially be ignored. Now, when all matches are prereleases, we are okay with all matches after applying the platform filter being prereleases. --- src/manage/installs.py | 6 +++++- tests/test_indexutils.py | 2 ++ tests/test_installs.py | 23 ++++++++++++++++------- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/manage/installs.py b/src/manage/installs.py index c556b99..869ba48 100644 --- a/src/manage/installs.py +++ b/src/manage/installs.py @@ -210,13 +210,17 @@ def get_matching_install_tags( # If none or only prereleases, keep them all if default_platform: default_platform = default_platform.casefold() + all_pre = all(Version(i["sort-version"]).is_prerelease for i, t in best) best2 = best best = [(i, t) for i, t in best if i.get("__any-platform") or t["tag"].casefold().endswith(default_platform)] LOGGER.debug("default_platform '%s' matched %s %s", default_platform, len(best), "install" if len(best) == 1 else "installs") - if not best or all(Version(i["sort-version"]).is_prerelease for i, t in best): + if ( + not best or + (not all_pre and all(Version(i["sort-version"]).is_prerelease for i, t in best)) + ): LOGGER.debug("Reusing unfiltered list") best = best2 diff --git a/tests/test_indexutils.py b/tests/test_indexutils.py index 007c6c3..b60f40c 100644 --- a/tests/test_indexutils.py +++ b/tests/test_indexutils.py @@ -180,4 +180,6 @@ def test_select_package(): ], }) assert select_package([index], "3.13", "-64")["tag"] == "3.13.0-64" + assert select_package([index], "3.13-32", "-64")["tag"] == "3.13.0-32" assert select_package([index], "3.13", "-32")["tag"] == "3.13.0-32" + assert select_package([index], "3.13-64", "-32")["tag"] == "3.13.0-64" diff --git a/tests/test_installs.py b/tests/test_installs.py index 48e007d..f837620 100644 --- a/tests/test_installs.py +++ b/tests/test_installs.py @@ -6,10 +6,10 @@ def make_install(tag, **kwargs): - run_for = [ - {"tag": tag, "target": kwargs.get("target", "python.exe")}, - {"tag": tag, "target": kwargs.get("targetw", "pythonw.exe"), "windowed": 1}, - ] + run_for = [] + for t in kwargs.get("run_for", [tag]): + run_for.append({"tag": t, "target": kwargs.get("target", "python.exe")}) + run_for.append({"tag": t, "target": kwargs.get("targetw", "pythonw.exe"), "windowed": 1}) return { "company": kwargs.get("company", "PythonCore"), @@ -40,9 +40,9 @@ def fake_get_installs(install_dir): def fake_get_installs2(install_dir): yield make_install("1.0-32", sort_version="1.0") - yield make_install("3.0a1-32", sort_version="3.0a1") - yield make_install("3.0a1-64", sort_version="3.0a1") - yield make_install("3.0a1-arm64", sort_version="3.0a1") + yield make_install("3.0a1-32", sort_version="3.0a1", run_for=["3-32", "3.0-32", "3.0a1-32"]) + yield make_install("3.0a1-64", sort_version="3.0a1", run_for=["3-64", "3.0-64", "3.0a1-64"]) + yield make_install("3.0a1-arm64", sort_version="3.0a1", run_for=["3-arm64", "3.0-arm64", "3.0a1-arm64"]) def fake_get_unmanaged_installs(): @@ -161,6 +161,15 @@ def test_get_install_to_run_with_default_platform_prerelease(patched_installs2): assert i["id"] == "PythonCore-1.0-32" +def test_get_install_to_run_with_platform_prerelease(patched_installs2): + i = installs.get_install_to_run("", None, "3", default_platform="-32") + assert i["id"] == "PythonCore-3.0a1-32" + i = installs.get_install_to_run("", None, "3-32", default_platform="-64") + assert i["id"] == "PythonCore-3.0a1-32" + i = installs.get_install_to_run("", None, "3-32", default_platform="-arm64") + assert i["id"] == "PythonCore-3.0a1-32" + + def test_get_install_to_run_with_range(patched_installs): i = installs.get_install_to_run("", None, "<=1.0") assert i["id"] == "PythonCore-1.0"