sagemaker_image_builder/release_notes_generator.py (58 lines of code) (raw):

import os from semver import Version from sagemaker_image_builder.utils import get_dir_for_version, get_match_specs def _get_installed_packages(target_version_dir, image_config) -> dict[str, str]: env_in_file_name = image_config["build_args"]["ENV_IN_FILENAME"] env_out_file_name = image_config["env_out_filename"] env_in_file_path = target_version_dir + "/" + env_in_file_name if not os.path.exists(env_in_file_path): return {} required_packages_from_target = get_match_specs(target_version_dir + "/" + env_in_file_name).keys() target_match_spec_out = get_match_specs(target_version_dir + "/" + env_out_file_name) # We only care about the packages which are present in the target version env.in file return { k: str(v.get("version")).removeprefix("==") for k, v in target_match_spec_out.items() if k in required_packages_from_target } def _get_package_to_image_type_mapping(image_type_package_metadata): # Creating a reverse dict based on the package names # { 'somepackage': {'cpu': '1.2.0', 'gpu': '1.2.2'}, ..} package_to_image_type_mapping = {} for image_type in image_type_package_metadata.keys(): package_metadata = image_type_package_metadata[image_type] for package in package_metadata: if package not in package_to_image_type_mapping: package_to_image_type_mapping[package] = {image_type: package_metadata[package]} else: package_to_image_type_mapping[package][image_type] = package_metadata[package] return package_to_image_type_mapping def _get_image_type_package_metadata(target_version_dir, image_config): image_type_package_metadata = {} for image_generator_config in image_config: image_type_package_metadata[image_generator_config["image_type"]] = _get_installed_packages( target_version_dir, image_generator_config ) return image_type_package_metadata def generate_release_notes(target_version: Version, image_config: list[dict]): target_version_dir = get_dir_for_version(target_version) if not os.path.exists(target_version_dir): return image_type_package_metadata = _get_image_type_package_metadata(target_version_dir, image_config) package_to_image_type_mapping = _get_package_to_image_type_mapping(image_type_package_metadata) with open(f"{target_version_dir}/RELEASE.md", "w") as f: f.write("# Release notes: " + str(target_version) + "\n\n") f.write("Package ") table_separator = "---" for image_type in image_type_package_metadata.keys(): f.write("| " + image_type) table_separator += "|---" f.write("\n") f.write(table_separator + "\n") for package in package_to_image_type_mapping.keys(): f.write(package) for image_type in image_type_package_metadata.keys(): version = ( package_to_image_type_mapping[package][image_type] if image_type in package_to_image_type_mapping[package] else " " ) f.write("|" + version) f.write("\n")