Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/galaxy/tool_util/deps/mulled/mulled_list.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/galaxy/tool_util/deps/mulled/mulled_list.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,133 @@ +#!/usr/bin/env python + +import argparse +import logging +from glob import glob +from html.parser import HTMLParser + +import requests + +QUAY_API_ENDPOINT = 'https://quay.io/api/v1/repository' + + +def get_quay_containers(repository='biocontainers'): + """ + Get all quay containers in the biocontainers repo + """ + containers = [] + + repos_parameters = {'public': 'true', 'namespace': repository} + repos_headers = {'Accept-encoding': 'gzip', 'Accept': 'application/json'} + repos_response = requests.get( + QUAY_API_ENDPOINT, headers=repos_headers, params=repos_parameters, timeout=12) + + repos = repos_response.json()['repositories'] + + for repo in repos: + logging.info(repo) + tags_response = requests.get( + "{}/{}/{}".format(QUAY_API_ENDPOINT, repository, repo['name'])) + tags = tags_response.json()['tags'] + for tag in tags: + containers.append('{}:{}'.format(repo['name'], tag)) + + return containers + + +def get_singularity_containers(): + """ + Get all existing singularity containers from "https://depot.galaxyproject.org/singularity/" + """ + class GetContainerNames(HTMLParser): # small parser which gets list of containers + def __init__(self): + HTMLParser.__init__(self) + self.containers = [] + + def handle_starttag(self, tag, attrs): + try: + for attr in attrs: + if attr[0] == 'href' and attr[1] != '../': + self.containers.append(attr[1].replace('%3A', ':')) + except IndexError: + pass + + parser = GetContainerNames() + index = requests.get("https://depot.galaxyproject.org/singularity/") + parser.feed(index.text) + return parser.containers + + +def get_conda_envs(filepath): + """ + Get list of already existing envs + """ + return [n.split('__')[-1].replace('@', ':') for n in glob('%s/*' % filepath)] + + +def get_missing_containers(quay_list, singularity_list, blocklist_file=None): + r""" + Return list of quay containers that do not exist as singularity containers. Files stored in a blocklist will be ignored + """ + blocklist = [] + if blocklist_file: + with open(blocklist_file) as fh: + blocklist = fh.read().split('\n') + return [n for n in quay_list if n not in singularity_list and n not in blocklist] + + +def get_missing_envs(quay_list, conda_list, blocklist_file=None): + r""" + Compares list of conda envs and docker containers and returns missing conda envs + """ + blocklist = [] + if blocklist_file: + with open(blocklist_file) as fh: + blocklist = fh.read().split('\n') + + return [n for n in quay_list if n.split('--')[0] not in conda_list and n.split('--')[0] not in blocklist] + + +def main(): + parser = argparse.ArgumentParser( + description='Returns list of Docker containers in the quay.io biocontainers repository.') + parser.add_argument('--source', '-s', + help="Docker, Singularity or Conda.") + parser.add_argument('--not-singularity', dest='not_singularity', action="store_true", + help="Exclude Docker containers from which Singularity containers have already been built.") + parser.add_argument('--not-conda', dest='not_conda', action="store_true", + help="Exclude Docker containers from which Conda environments have already been extracted.") + parser.add_argument('--conda-filepath', dest='conda_filepath', default=None, + help="If searching for conda environments or employing the --not-conda option, a filepath where the environments are located.") + parser.add_argument('-b', '--blocklist', '--blacklist', dest='blocklist', default=None, + help="Provide a 'blocklist file' containing containers which should be excluded from the list.") + parser.add_argument('-f', '--file', dest='output', default=None, + help="File to write list to. If not given output will be returned on the command line.") + + args = parser.parse_args() + + if args.source == 'docker': + containers = get_quay_containers() + if args.not_singularity: + containers = get_missing_containers( + containers, get_singularity_containers(), args.blocklist) + if args.not_conda: + containers = get_missing_envs(containers, get_conda_envs( + args.conda_filepath), args.blocklist) + elif args.source == 'singularity': + containers = get_singularity_containers() + elif args.source == 'conda': + containers = get_conda_envs(args.conda_filepath) + else: + print("The 'source' argument was not understood.") + return + + if args.output: + with open(args.output, 'a') as f: + for container in containers: + f.write('%s\n' % container) + else: + print(containers) + + +if __name__ == '__main__': + main()