diff --git a/scripts/patch_recipe.py b/scripts/patch_recipe.py new file mode 100644 index 0000000..59e872f --- /dev/null +++ b/scripts/patch_recipe.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 + +import argparse +from os import fdopen, path +import os +import re +import shutil +from sys import argv +import tempfile + +INDENTATION = " " +GRAYSKULL_OUTPUT_PATH = "autoBIGS.cli" +RUN_EXPORTED_VALUE = r'{{ pin_subpackage( name|lower|replace(".", "-"), max_pin="x.x") }}' +LICENSE_SUFFIX = "-or-later" +HOME_PAGE = "https://github.com/Syph-and-VPD-Lab/autoBIGS.cli" + +def _calc_indentation(line: str): + return len(re.findall(INDENTATION, line.split(line.strip())[0])) if line != "\n" else 0 + +def read_grayskull_output(): + original_recipe = path.abspath(GRAYSKULL_OUTPUT_PATH) + original_meta = path.join(original_recipe, "meta.yaml") + meta_file = open(original_meta) + lines = meta_file.readlines() + meta_file.close() + return lines + +def update_naming_scheme(lines): + modified_lines = [] + for line in lines: + matches = re.finditer(r"\{\{\s*name\|lower()\s+\}\}", line) + modified_line = line + for match in matches: + modified_line = modified_line[:match.start(1)] + r'|replace(".", "-")' + modified_line[match.end(1):] + modified_lines.append(modified_line) + return modified_lines + +def inject_run_exports(lines: list[str]): + package_indent = False + modified_lines = [] + for line in lines: + indentation_count = _calc_indentation(line) + if line == "build:\n" and indentation_count == 0: + package_indent = True + modified_lines.append(line) + elif package_indent and indentation_count == 0: + modified_lines.append(INDENTATION*1 + "run_exports:\n") + modified_lines.append(INDENTATION*2 + "- " + RUN_EXPORTED_VALUE + "\n") + package_indent = False + else: + modified_lines.append(line) + return modified_lines + +def suffix_license(lines: list[str]): + about_indent = False + modified_lines = [] + for line in lines: + indentation_count = _calc_indentation(line) + if line == "about:\n" and indentation_count == 0: + about_indent = True + modified_lines.append(line) + elif about_indent and indentation_count == 1 and line.lstrip().startswith("license:"): + modified_lines.append(line.rstrip() + LICENSE_SUFFIX + "\n") + about_indent = False + else: + modified_lines.append(line) + return modified_lines + +def inject_home_page(lines: list[str]): + about_indent = False + modified_lines = [] + for line in lines: + indentation_count = _calc_indentation(line) + if line == "about:\n" and indentation_count == 0: + about_indent = True + modified_lines.append(line) + elif about_indent and indentation_count == 0: + modified_lines.append(INDENTATION + "home: " + HOME_PAGE + "\n") + about_indent = False + else: + modified_lines.append(line) + return modified_lines + +def write_to_original(lines: list[str]): + original_recipe = path.abspath(GRAYSKULL_OUTPUT_PATH) + original_meta = path.join(original_recipe, "meta.yaml") + with open(original_meta, "w") as file: + file.writelines(lines) + +def rename_recipe_dir(): + new_recipe_name = path.abspath(path.join(GRAYSKULL_OUTPUT_PATH.replace(".", "-").lower())) + shutil.rmtree(new_recipe_name, ignore_errors=True) + os.replace(path.abspath(GRAYSKULL_OUTPUT_PATH), new_recipe_name) + +if __name__ == "__main__": + original_grayskull_out = read_grayskull_output() + modified_recipe_meta = None + modified_recipe_meta = update_naming_scheme(original_grayskull_out) + modified_recipe_meta = inject_run_exports(modified_recipe_meta) + modified_recipe_meta = suffix_license(modified_recipe_meta) + modified_recipe_meta = inject_home_page(modified_recipe_meta) + write_to_original(modified_recipe_meta) + rename_recipe_dir() \ No newline at end of file