diff --git a/.vscode/launch.json b/.vscode/launch.json index 5045d5b..67c81f4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,7 +4,13 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - + { + "name": "Python Debugger: Current File", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + }, { "name": "Python Debugger: Current File with Arguments", "type": "debugpy", diff --git a/Jenkinsfile b/Jenkinsfile index 9f21d1a..5efac03 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -28,8 +28,8 @@ pipeline { } stage("generate recipe") { steps { - sh 'grayskull pypi autobigs.engine --maintainers "Harrison Deng"' - sh 'python scripts/adapt_names.py autobigs.engine' + sh 'grayskull pypi autoBIGS.engine --maintainers "Harrison Deng"' + sh 'python patch_recipe.py' sh 'cp -r autobigs-engine/* bioconda-recipes/recipes/autobigs-engine/.' } } diff --git a/autobigs-cli/meta.yaml b/autobigs-cli/meta.yaml deleted file mode 100644 index 3271e92..0000000 --- a/autobigs-cli/meta.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{% set name = "autoBIGS.cli" %} -{% set version = "0.4.2" %} - -package: - name: {{ name|lower|replace(".", "-") }} - version: {{ version }} - -source: - url: https://pypi.org/packages/source/{{ name[0] }}/{{ name }}/autobigs_cli-{{ version }}.tar.gz - sha256: fc7bf6c604974796f5c8aae52fd9ab9924f5490f4f207a26be803217aae30c82 - -build: - entry_points: - - autoBIGS = autobigs.cli.program:run - noarch: python - script: {{ PYTHON }} -m pip install . -vv --no-deps --no-build-isolation - number: 0 - run_exports: - - {{ pin_subpackage( name|lower|replace(".", "-"), max_pin="x.x") }} - -requirements: - host: - - python >=3.12 - - setuptools >=64 - - setuptools-scm >=8 - - pip - run: - - python >=3.12 - - autobigs-engine - -test: - imports: - - autobigs - commands: - - pip check - - autoBIGS --help - - autoBIGS info -h - - autoBIGS st -h - requires: - - pip - -about: - home: https://github.com/RealYHD/autoBIGS.cli - summary: A CLI tool to rapidly fetch fetch MLST profiles given sequences for various diseases. - license: GPL-3.0-or-later - license_file: LICENSE - -extra: - recipe-maintainers: - - Harrison Deng diff --git a/patch_recipe.py b/patch_recipe.py new file mode 100644 index 0000000..417dd1e --- /dev/null +++ b/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.engine" +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.engine" + +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 == "package:\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 diff --git a/scripts/adapt_names.py b/scripts/adapt_names.py deleted file mode 100755 index 5d1d91c..0000000 --- a/scripts/adapt_names.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -from os import fdopen, path -import os -import re -import shutil -from sys import argv -import tempfile - -def update_naming_scheme(recipe_path): - original_recipe = path.abspath(recipe_path) - original_meta = path.join(original_recipe, "meta.yaml") - new_fd, new_file_path = tempfile.mkstemp() - with fdopen(new_fd, "w") as new_file_handle: - with open(original_meta, "r") as original_file_handle: - for line in original_file_handle: - 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):] - new_file_handle.write(modified_line) - shutil.move(new_file_path, original_meta) - new_recipe_name = path.join( - path.dirname(original_recipe), - path.basename(original_recipe).replace(".", "-").lower()) - shutil.rmtree(new_recipe_name, ignore_errors=True) - os.replace(original_recipe, - new_recipe_name) - -if __name__ == "__main__": - update_naming_scheme(argv[1]) \ No newline at end of file diff --git a/scripts/package_latest_version.py b/scripts/package_latest_version.py deleted file mode 100755 index f08877d..0000000 --- a/scripts/package_latest_version.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import requests -import json -try: - from packaging.version import parse -except ImportError: - from pip._vendor.packaging.version import parse - -# Courtesy of https://stackoverflow.com/questions/28774852/pypi-api-how-to-get-stable-package-version - -URL_PATTERN = 'https://pypi.python.org/pypi/{package}/json' - - -def get_version(package, url_pattern=URL_PATTERN): - """Return version of package on pypi.python.org using json.""" - req = requests.get(url_pattern.format(package=package)) - version = parse('0') - if req.status_code == requests.codes.ok: - j = json.loads(req.text.encode(req.encoding or "utf-8")) - releases = j.get('releases', []) - for release in releases: - ver = parse(release) - if not ver.is_prerelease: - version = max(version, ver) - return version - - -if __name__ == '__main__': - print(get_version(sys.argv[1]), end="") \ No newline at end of file