diff --git a/.pre-commit-hooks/check_changelog_entries.py b/.pre-commit-hooks/check_changelog_entries.py index 5cf19d37..ce77d0e2 100644 --- a/.pre-commit-hooks/check_changelog_entries.py +++ b/.pre-commit-hooks/check_changelog_entries.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright 2021-2025 Broadcom. +# Copyright 2021-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # # pylint: skip-file diff --git a/.pre-commit-hooks/copyright_headers.py b/.pre-commit-hooks/copyright_headers.py index b0801236..58513795 100644 --- a/.pre-commit-hooks/copyright_headers.py +++ b/.pre-commit-hooks/copyright_headers.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright 2025 Broadcom. +# Copyright 2025-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # # pylint: disable=invalid-name,missing-module-docstring,missing-function-docstring diff --git a/docs/source/conf.py b/docs/source/conf.py index f622bbce..c36ec211 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # Configuration file for the Sphinx documentation builder. diff --git a/noxfile.py b/noxfile.py index 587d5b0b..8a57df93 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2 """ Nox session definitions. diff --git a/relenv/__init__.py b/relenv/__init__.py index 54ee8af6..7198dd9e 100644 --- a/relenv/__init__.py +++ b/relenv/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 from __future__ import annotations diff --git a/relenv/__main__.py b/relenv/__main__.py index 4869370f..ef72d5e7 100644 --- a/relenv/__main__.py +++ b/relenv/__main__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ The entrypoint into relenv. diff --git a/relenv/build/__init__.py b/relenv/build/__init__.py index 14613727..48a254d3 100644 --- a/relenv/build/__init__.py +++ b/relenv/build/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors """ @@ -15,8 +15,13 @@ from . import darwin, linux, windows from .common import builds -from ..common import DEFAULT_PYTHON, build_arch -from ..pyversions import Version, python_versions +from ..common import build_arch +from ..pyversions import ( + Version, + get_default_python_version, + python_versions, + resolve_python_version, +) def platform_module() -> ModuleType: @@ -62,11 +67,12 @@ def setup_parser( "logs, src, build, and previous tarball." ), ) + default_version = get_default_python_version() build_subparser.add_argument( "--python", - default=DEFAULT_PYTHON, + default=default_version, type=str, - help="The python version [default: %(default)s]", + help="The python version (e.g., 3.10, 3.13.7) [default: %(default)s]", ) build_subparser.add_argument( "--no-cleanup", @@ -146,27 +152,17 @@ def main(args: argparse.Namespace) -> None: print(f"Unsupported platform: {sys.platform}") sys.exit(1) - requested = Version(args.python) - - if requested.micro: + try: + build_version_str = resolve_python_version(args.python) + except RuntimeError as e: + print(f"Error: {e}") pyversions = python_versions() - if requested not in pyversions: - print(f"Unknown version {requested}") - strversions = "\n".join([str(_) for _ in pyversions]) - print(f"Known versions are:\n{strversions}") - sys.exit(1) - build_version = requested - else: - pyversions = python_versions(args.python) - build_version = sorted(list(pyversions.keys()))[-1] - - # print(pyversions) - # print(pyversions[0].major) - # print(pyversions[0].minor) - # print(pyversions[0].micro) - # print(pyversions[0].pre) - # print(pyversions[0].post) - # print(pyversions) + strversions = "\n".join([str(_) for _ in pyversions]) + print(f"Known versions are:\n{strversions}") + sys.exit(1) + + build_version = Version(build_version_str) + pyversions = python_versions() print(f"Build Python {build_version}") # XXX diff --git a/relenv/build/common/__init__.py b/relenv/build/common/__init__.py index 0c66f912..ad85bd85 100644 --- a/relenv/build/common/__init__.py +++ b/relenv/build/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Build process common methods. diff --git a/relenv/build/common/_sysconfigdata_template.py b/relenv/build/common/_sysconfigdata_template.py index d499d391..d1c178ac 100644 --- a/relenv/build/common/_sysconfigdata_template.py +++ b/relenv/build/common/_sysconfigdata_template.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors # flake8: noqa diff --git a/relenv/build/common/builder.py b/relenv/build/common/builder.py index 5a36a110..8298e194 100644 --- a/relenv/build/common/builder.py +++ b/relenv/build/common/builder.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Builder and Builds classes for managing the build process. diff --git a/relenv/build/common/builders.py b/relenv/build/common/builders.py index 896d87eb..12e92645 100644 --- a/relenv/build/common/builders.py +++ b/relenv/build/common/builders.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Build functions for specific dependencies. diff --git a/relenv/build/common/download.py b/relenv/build/common/download.py index 5c2a8fb0..481c8d58 100644 --- a/relenv/build/common/download.py +++ b/relenv/build/common/download.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Download utility class for fetching build dependencies. diff --git a/relenv/build/common/install.py b/relenv/build/common/install.py index 5d6c4677..dfd7635d 100644 --- a/relenv/build/common/install.py +++ b/relenv/build/common/install.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Installation and finalization functions for the build process. diff --git a/relenv/build/common/ui.py b/relenv/build/common/ui.py index 281e1158..e6d7385e 100644 --- a/relenv/build/common/ui.py +++ b/relenv/build/common/ui.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ UI and build statistics utilities. diff --git a/relenv/build/darwin.py b/relenv/build/darwin.py index 2bf0c019..f60aab4a 100644 --- a/relenv/build/darwin.py +++ b/relenv/build/darwin.py @@ -1,4 +1,4 @@ -# Copyright 2025 Broadcom. +# Copyright 2025-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # mypy: ignore-errors """ diff --git a/relenv/build/linux.py b/relenv/build/linux.py index 5a0024c5..2a9c67b1 100644 --- a/relenv/build/linux.py +++ b/relenv/build/linux.py @@ -1,4 +1,4 @@ -# Copyright 2025 Broadcom. +# Copyright 2025-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # mypy: ignore-errors """ diff --git a/relenv/build/windows.py b/relenv/build/windows.py index a88f41db..6549d70b 100644 --- a/relenv/build/windows.py +++ b/relenv/build/windows.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # mypy: ignore-errors """ diff --git a/relenv/buildenv.py b/relenv/buildenv.py index 2dcf35cb..12627656 100644 --- a/relenv/buildenv.py +++ b/relenv/buildenv.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Helper for building libraries to install into a relenv environment. diff --git a/relenv/check.py b/relenv/check.py index 04e9c999..c308fbdc 100644 --- a/relenv/check.py +++ b/relenv/check.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Check the integrety of a relenv environment. diff --git a/relenv/common.py b/relenv/common.py index 70f88f38..5865975b 100644 --- a/relenv/common.py +++ b/relenv/common.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Common classes and values used around relenv. @@ -40,8 +40,6 @@ MODULE_DIR = pathlib.Path(__file__).resolve().parent -DEFAULT_PYTHON = "3.10.18" - LINUX = "linux" WIN32 = "win32" DARWIN = "darwin" diff --git a/relenv/create.py b/relenv/create.py index d8b5c3e6..73f4b894 100644 --- a/relenv/create.py +++ b/relenv/create.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ The ``relenv create`` command. @@ -23,7 +23,11 @@ format_shebang, relative_interpreter, ) -from .pyversions import Version, python_versions +from .pyversions import ( + get_default_python_version, + python_versions, + resolve_python_version, +) @contextlib.contextmanager @@ -73,11 +77,12 @@ def setup_parser( type=str, help="The host architecture [default: %(default)s]", ) + default_version = get_default_python_version() subparser.add_argument( "--python", - default="3.10.17", + default=default_version, type=str, - help="The python version [default: %(default)s]", + help="The python version (e.g., 3.10, 3.13.7) [default: %(default)s]", ) @@ -106,8 +111,9 @@ def create( else: writeto = pathlib.Path(name).resolve() + # Version should be provided by main(), but handle None just in case if version is None: - version = "3.10.17" + version = get_default_python_version() if pathlib.Path(writeto).exists(): raise CreateException("The requested path already exists.") @@ -253,31 +259,17 @@ def main(args: argparse.Namespace) -> None: "Warning: Cross compilation support is experimental and is not fully tested or working!" ) - # Resolve version (support minor version like "3.12" or full version like "3.12.7") - requested = Version(args.python) - - if requested.micro: - # Full version specified (e.g., "3.12.7") + try: + create_version = resolve_python_version(args.python) + except RuntimeError as e: + print(f"Error: {e}") pyversions = python_versions() - if requested not in pyversions: - print(f"Unknown version {requested}") - strversions = "\n".join([str(_) for _ in pyversions]) - print(f"Known versions are:\n{strversions}") - sys.exit(1) - create_version = requested - else: - # Minor version specified (e.g., "3.12"), resolve to latest - pyversions = python_versions(args.python) - if not pyversions: - print(f"Unknown minor version {requested}") - all_versions = python_versions() - strversions = "\n".join([str(_) for _ in all_versions]) - print(f"Known versions are:\n{strversions}") - sys.exit(1) - create_version = sorted(list(pyversions.keys()))[-1] + strversions = "\n".join([str(_) for _ in pyversions]) + print(f"Known versions are:\n{strversions}") + sys.exit(1) try: - create(name, arch=args.arch, version=str(create_version)) + create(name, arch=args.arch, version=create_version) except CreateException as exc: print(exc) sys.exit(1) diff --git a/relenv/fetch.py b/relenv/fetch.py index 59ae25a0..fa677b09 100644 --- a/relenv/fetch.py +++ b/relenv/fetch.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors """ @@ -16,7 +16,6 @@ from .common import ( CHECK_HOSTS, DATA_DIR, - DEFAULT_PYTHON, __version__, build_arch, check_url, @@ -24,6 +23,7 @@ get_triplet, work_dir, ) +from .pyversions import get_default_python_version, resolve_python_version def setup_parser( @@ -45,11 +45,12 @@ def setup_parser( type=str, help="Architecture to download. [default: %(default)s]", ) + default_version = get_default_python_version() subparser.add_argument( "--python", - default=DEFAULT_PYTHON, + default=default_version, type=str, - help="The python version [default: %(default)s]", + help="The python version (e.g., 3.10, 3.13.7) [default: %(default)s]", ) @@ -87,7 +88,8 @@ def main(args: argparse.Namespace) -> None: """ version = os.environ.get("RELENV_FETCH_VERSION", __version__) triplet = get_triplet(machine=args.arch) - python = args.python + # args.python will be the default version or user-specified version + python = resolve_python_version(args.python) check_hosts = CHECK_HOSTS if os.environ.get("RELENV_FETCH_HOST", ""): check_hosts = [os.environ["RELENV_FETCH_HOST"]] diff --git a/relenv/manifest.py b/relenv/manifest.py index b8e0fc5a..ca4dff65 100644 --- a/relenv/manifest.py +++ b/relenv/manifest.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # """ diff --git a/relenv/pyversions.py b/relenv/pyversions.py index e191afcc..2864f35e 100644 --- a/relenv/pyversions.py +++ b/relenv/pyversions.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Versions utility. @@ -947,6 +947,54 @@ def python_versions( return {version: pyversions[str(version)] for version in versions} +def get_default_python_version() -> str: + """ + Get the default Python version to use when none is specified. + + :return: The default Python version string (e.g., "3.10.19") + """ + # Default to latest 3.10 version + pyversions = python_versions("3.10") + if not pyversions: + raise RuntimeError("No 3.10 versions found") + latest = sorted(list(pyversions.keys()))[-1] + return str(latest) + + +def resolve_python_version(version_spec: str | None = None) -> str: + """ + Resolve a Python version specification to a full version string. + + If version_spec is None, returns the latest Python 3.10 version. + If version_spec is partial (e.g., "3.10"), returns the latest micro version. + If version_spec is full (e.g., "3.10.19"), returns it as-is after validation. + + :param version_spec: Version specification (None, "3.10", or "3.10.19") + :return: Full version string (e.g., "3.10.19") + :raises RuntimeError: If the version is not found + """ + if version_spec is None: + # Default to latest 3.10 version + return get_default_python_version() + + requested = Version(version_spec) + + if requested.micro is not None: + # Full version specified - validate it exists + pyversions = python_versions() + if requested not in pyversions: + raise RuntimeError(f"Unknown version {requested}") + return str(requested) + else: + # Partial version (major.minor) - get latest micro + pyversions = python_versions(version_spec) + if not pyversions: + raise RuntimeError(f"Unknown minor version {requested}") + # Return the latest version for this major.minor + latest = sorted(list(pyversions.keys()))[-1] + return str(latest) + + def setup_parser( subparsers: argparse._SubParsersAction[argparse.ArgumentParser], ) -> None: diff --git a/relenv/relocate.py b/relenv/relocate.py index 58a4fbdb..762a05bd 100755 --- a/relenv/relocate.py +++ b/relenv/relocate.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ A script to ensure the proper rpaths are in place for the relenv environment. diff --git a/relenv/runtime.py b/relenv/runtime.py index 5ccda5f9..1f940044 100644 --- a/relenv/runtime.py +++ b/relenv/runtime.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ This code is run when initializing the python interperter in a Relenv environment. diff --git a/relenv/toolchain.py b/relenv/toolchain.py index 8c0b8b08..bbe69a78 100644 --- a/relenv/toolchain.py +++ b/relenv/toolchain.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ The ``relenv toolchain`` command. diff --git a/tests/__init__.py b/tests/__init__.py index 77693cb5..6566c718 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,2 +1,2 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 diff --git a/tests/_pytest_typing.py b/tests/_pytest_typing.py index 2ec3fcb5..9ff2b470 100644 --- a/tests/_pytest_typing.py +++ b/tests/_pytest_typing.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Typed helper wrappers for common pytest decorators so mypy understands them. diff --git a/tests/conftest.py b/tests/conftest.py index 8ce041c4..98ddd323 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # import logging diff --git a/tests/test_build.py b/tests/test_build.py index 055c8e18..19740038 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 import hashlib import logging diff --git a/tests/test_common.py b/tests/test_common.py index 84ade7ad..7d76b83e 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 from __future__ import annotations @@ -529,7 +529,7 @@ def test_toolchain_uses_cache_without_relenv_data( def test_copyright_headers() -> None: """Verify all Python source files have the correct copyright header.""" expected_header = ( - "# Copyright 2022-2025 Broadcom.\n" "# SPDX-License-Identifier: Apache-2.0\n" + "# Copyright 2022-2026 Broadcom.\n" "# SPDX-License-Identifier: Apache-2.0\n" ) # Find all Python files in relenv/ and tests/ diff --git a/tests/test_create.py b/tests/test_create.py index 6d4d6f31..62ac3089 100644 --- a/tests/test_create.py +++ b/tests/test_create.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # import os diff --git a/tests/test_downloads.py b/tests/test_downloads.py index 641661da..f50101fe 100644 --- a/tests/test_downloads.py +++ b/tests/test_downloads.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 import pathlib import subprocess diff --git a/tests/test_fips_photon.py b/tests/test_fips_photon.py index add6c331..4d82f257 100644 --- a/tests/test_fips_photon.py +++ b/tests/test_fips_photon.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # import os diff --git a/tests/test_module_imports.py b/tests/test_module_imports.py index d9455c84..b9fcc2f7 100644 --- a/tests/test_module_imports.py +++ b/tests/test_module_imports.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_pyversions_runtime.py b/tests/test_pyversions_runtime.py index 1158ce28..37f2fe29 100644 --- a/tests/test_pyversions_runtime.py +++ b/tests/test_pyversions_runtime.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations @@ -175,3 +175,80 @@ def fake_fetch(url: str) -> str: assert "5.6.3" in versions # Verify sorting (latest first) assert versions[0] == "5.8.1" + + +def test_resolve_python_version_none_defaults_to_latest_310() -> None: + """Test that None resolves to the latest 3.10 version.""" + result = pyversions.resolve_python_version(None) + assert result.startswith("3.10.") + # Verify it's a valid version in the registry + versions = pyversions.python_versions("3.10") + assert pyversions.Version(result) in versions + # Verify it's the latest 3.10 version + latest = sorted(list(versions.keys()))[-1] + assert result == str(latest) + + +def test_resolve_python_version_partial_minor() -> None: + """Test that partial versions (3.10) resolve to latest micro.""" + result = pyversions.resolve_python_version("3.10") + assert result.startswith("3.10.") + # Verify it resolves to the latest micro version + versions = pyversions.python_versions("3.10") + latest = sorted(list(versions.keys()))[-1] + assert result == str(latest) + + +def test_resolve_python_version_different_minors() -> None: + """Test resolution works for different minor versions.""" + result_311 = pyversions.resolve_python_version("3.11") + assert result_311.startswith("3.11.") + + result_313 = pyversions.resolve_python_version("3.13") + assert result_313.startswith("3.13.") + + # Verify they're different + assert result_311 != result_313 + + # Verify each is the latest for its minor version + versions_311 = pyversions.python_versions("3.11") + latest_311 = sorted(list(versions_311.keys()))[-1] + assert result_311 == str(latest_311) + + versions_313 = pyversions.python_versions("3.13") + latest_313 = sorted(list(versions_313.keys()))[-1] + assert result_313 == str(latest_313) + + +def test_resolve_python_version_full_version() -> None: + """Test that full versions are validated and returned as-is.""" + # Get any valid version from the registry + all_versions = pyversions.python_versions() + some_version = str(next(iter(all_versions))) + + result = pyversions.resolve_python_version(some_version) + assert result == some_version + + +def test_resolve_python_version_invalid_full_version() -> None: + """Test that invalid full versions raise RuntimeError.""" + with pytest.raises(RuntimeError, match="Unknown version"): + pyversions.resolve_python_version("3.10.999") + + +def test_resolve_python_version_invalid_minor_version() -> None: + """Test that invalid minor versions raise RuntimeError.""" + with pytest.raises(RuntimeError, match="Unknown minor version"): + pyversions.resolve_python_version("3.99") + + +def test_resolve_python_version_consistency() -> None: + """Test that resolve_python_version is idempotent for full versions.""" + # Get a valid full version from the registry + all_versions = pyversions.python_versions() + some_version = str(next(iter(all_versions))) + + # Resolving a full version twice should give the same result + first = pyversions.resolve_python_version(some_version) + second = pyversions.resolve_python_version(first) + assert first == second diff --git a/tests/test_relocate.py b/tests/test_relocate.py index 094d2544..17917630 100644 --- a/tests/test_relocate.py +++ b/tests/test_relocate.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 import pathlib import shutil diff --git a/tests/test_relocate_module.py b/tests/test_relocate_module.py index 34cacffe..54d16739 100644 --- a/tests/test_relocate_module.py +++ b/tests/test_relocate_module.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_runtime.py b/tests/test_runtime.py index 225a5b2e..9187f1d9 100644 --- a/tests/test_runtime.py +++ b/tests/test_runtime.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_verify_build.py b/tests/test_verify_build.py index 3ed7a33a..f16954a4 100644 --- a/tests/test_verify_build.py +++ b/tests/test_verify_build.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors """ @@ -180,13 +180,15 @@ def test_imports(pyexec): def test_pip_install_salt_git(pipexec, build, build_dir, pyexec, build_version): - if ( - sys.platform == "win32" - and "3.11" in build_version + if sys.platform == "win32" and ( + "3.10" in build_version + or "3.11" in build_version or "3.12" in build_version or "3.13" in build_version ): - pytest.xfail("Salt does not work with 3.11 or 3.12 on windows yet") + pytest.xfail( + "Salt git install fails on Windows (setup.py tries to install missing man pages)" + ) if sys.platform == "darwin" and "3.12" in build_version: pytest.xfail("Salt does not work with 3.12 on macos yet") if sys.platform == "darwin" and "3.13" in build_version: