From 85a646c7816c9a8e6799d08ff97c07028bbc2fef Mon Sep 17 00:00:00 2001 From: jennypng <63012604+JennyPng@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:31:08 -0800 Subject: [PATCH 1/3] enforce pyproject --- .../azure-sdk-tools/azpysdk/verify_whl.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py b/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py index 6968e9e78b74..d05126f2ec07 100644 --- a/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py +++ b/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py @@ -99,6 +99,45 @@ def should_verify_package(package_name): return package_name not in EXCLUDED_PACKAGES and "nspkg" not in package_name and "-mgmt" not in package_name +def has_stable_version_on_pypi(package_name: str) -> bool: + """Check if the package has any stable (non-prerelease) version on PyPI.""" + try: + all_versions = retrieve_versions_from_pypi(package_name) + stable_versions = [Version(v) for v in all_versions if not Version(v).is_prerelease] + return len(stable_versions) > 0 + except Exception: + return False + + +def verify_conda_section(package_dir: str, package_name: str) -> bool: + """Verify that packages with stable versions on PyPI have [tool.azure-sdk-conda] section in pyproject.toml.""" + if not has_stable_version_on_pypi(package_name): + logging.info(f"Package {package_name} has no stable version on PyPI, skipping conda section check") + return True + + pyproject_path = os.path.join(package_dir, "pyproject.toml") + if not os.path.exists(pyproject_path): + logging.error(f"Package {package_name} has a stable version on PyPI but is missing pyproject.toml") + return False + + try: + with open(pyproject_path, "r", encoding="utf-8") as f: + content = f.read() + + if "[tool.azure-sdk-conda]" not in content: + logging.error( + f"Package {package_name} has a stable version on PyPI but is missing " + "[tool.azure-sdk-conda] section in pyproject.toml" + ) + return False + + logging.info(f"Package {package_name} has required [tool.azure-sdk-conda] section") + return True + except Exception as e: + logging.error(f"Failed to read pyproject.toml for {package_name}: {e}") + return False + + def get_prior_version(package_name: str, current_version: str) -> Optional[str]: """Get prior stable version if it exists, otherwise get prior preview version, else return None.""" try: @@ -255,4 +294,12 @@ def run(self, args: argparse.Namespace) -> int: logger.error(f"Failed to verify whl for package {package_name}") results.append(1) + # Verify conda section for packages with stable versions on PyPI + if not verify_conda_section(package_dir, package_name): + logger.error(f"Failed conda section verification for package {package_name}") + logger.error( + "As part of releasing stable packages to Conda, the pyproject.toml must include a [tool.azure-sdk-conda] section and specify if the package should be released individually or bundled." + ) + results.append(1) + return max(results) if results else 0 From e9254319d243735c2e372219c672c378bbc975ef Mon Sep 17 00:00:00 2001 From: jennypng <63012604+JennyPng@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:38:54 -0800 Subject: [PATCH 2/3] minor --- eng/tools/azure-sdk-tools/azpysdk/verify_whl.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py b/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py index d05126f2ec07..8bada00b2ef0 100644 --- a/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py +++ b/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py @@ -130,8 +130,6 @@ def verify_conda_section(package_dir: str, package_name: str) -> bool: "[tool.azure-sdk-conda] section in pyproject.toml" ) return False - - logging.info(f"Package {package_name} has required [tool.azure-sdk-conda] section") return True except Exception as e: logging.error(f"Failed to read pyproject.toml for {package_name}: {e}") @@ -296,7 +294,6 @@ def run(self, args: argparse.Namespace) -> int: # Verify conda section for packages with stable versions on PyPI if not verify_conda_section(package_dir, package_name): - logger.error(f"Failed conda section verification for package {package_name}") logger.error( "As part of releasing stable packages to Conda, the pyproject.toml must include a [tool.azure-sdk-conda] section and specify if the package should be released individually or bundled." ) From 0823b79bffe35fc8c6349462578e80d6e8feaac4 Mon Sep 17 00:00:00 2001 From: jennypng <63012604+JennyPng@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:43:26 -0800 Subject: [PATCH 3/3] use logger instead of logging --- eng/tools/azure-sdk-tools/azpysdk/verify_whl.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py b/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py index 8bada00b2ef0..0fb69b356c0b 100644 --- a/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py +++ b/eng/tools/azure-sdk-tools/azpysdk/verify_whl.py @@ -1,5 +1,4 @@ import argparse -import logging import os import sys import glob @@ -77,7 +76,7 @@ def verify_whl_root_directory( non_azure_folders = [d for d in root_folders if d != expected_top_level_module and not d.endswith(".dist-info")] if non_azure_folders: - logging.error( + logger.error( "whl has following incorrect directory at root level [%s]", non_azure_folders, ) @@ -112,12 +111,12 @@ def has_stable_version_on_pypi(package_name: str) -> bool: def verify_conda_section(package_dir: str, package_name: str) -> bool: """Verify that packages with stable versions on PyPI have [tool.azure-sdk-conda] section in pyproject.toml.""" if not has_stable_version_on_pypi(package_name): - logging.info(f"Package {package_name} has no stable version on PyPI, skipping conda section check") + logger.info(f"Package {package_name} has no stable version on PyPI, skipping conda section check") return True pyproject_path = os.path.join(package_dir, "pyproject.toml") if not os.path.exists(pyproject_path): - logging.error(f"Package {package_name} has a stable version on PyPI but is missing pyproject.toml") + logger.error(f"Package {package_name} has a stable version on PyPI but is missing pyproject.toml") return False try: @@ -125,14 +124,14 @@ def verify_conda_section(package_dir: str, package_name: str) -> bool: content = f.read() if "[tool.azure-sdk-conda]" not in content: - logging.error( + logger.error( f"Package {package_name} has a stable version on PyPI but is missing " "[tool.azure-sdk-conda] section in pyproject.toml" ) return False return True except Exception as e: - logging.error(f"Failed to read pyproject.toml for {package_name}: {e}") + logger.error(f"Failed to read pyproject.toml for {package_name}: {e}") return False @@ -216,7 +215,7 @@ def verify_metadata_compatibility(current_metadata: Dict[str, Any], prior_metada repo_urls = ["homepage", "repository"] current_keys_lower = {k.lower() for k in current_metadata.keys()} if not any(key in current_keys_lower for key in repo_urls): - logging.error(f"Current metadata must contain at least one of: {repo_urls}") + logger.error(f"Current metadata must contain at least one of: {repo_urls}") return False if not prior_metadata: @@ -229,7 +228,7 @@ def verify_metadata_compatibility(current_metadata: Dict[str, Any], prior_metada is_compatible = prior_keys_filtered.issubset(current_keys) if not is_compatible: missing_keys = prior_keys_filtered - current_keys - logging.error("Metadata compatibility failed. Missing keys: %s", missing_keys) + logger.error("Metadata compatibility failed. Missing keys: %s", missing_keys) return is_compatible