Mercurial > repos > iuc > data_manager_cat
comparison data_manager/data_manager_cat.py @ 0:cffd8e2382cf draft
"planemo upload commit 4e5a8d7629d90c41219b48b648dd4ab675b84af0"
| author | iuc |
|---|---|
| date | Mon, 09 Dec 2019 10:28:15 -0500 |
| parents | |
| children | 74af283d8ebd |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:cffd8e2382cf |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 from __future__ import print_function | |
| 3 | |
| 4 import argparse | |
| 5 import json | |
| 6 import os.path | |
| 7 import subprocess | |
| 8 import sys | |
| 9 import tarfile | |
| 10 import tempfile | |
| 11 import zipfile | |
| 12 try: | |
| 13 # For Python 3.0 and later | |
| 14 from urllib.request import urlopen | |
| 15 except ImportError: | |
| 16 # Fall back to Python 2 imports | |
| 17 from urllib2 import urlopen | |
| 18 | |
| 19 | |
| 20 def url_download(url, workdir): | |
| 21 file_path = os.path.join(workdir, 'download.dat') | |
| 22 src = None | |
| 23 dst = None | |
| 24 try: | |
| 25 src = urlopen(url) | |
| 26 with open(file_path, 'wb') as dst: | |
| 27 while True: | |
| 28 chunk = src.read(2**10) | |
| 29 if chunk: | |
| 30 dst.write(chunk) | |
| 31 else: | |
| 32 break | |
| 33 finally: | |
| 34 if src: | |
| 35 src.close() | |
| 36 if tarfile.is_tarfile(file_path): | |
| 37 fh = tarfile.open(file_path, 'r:*') | |
| 38 elif zipfile.is_zipfile(file_path): | |
| 39 fh = zipfile.ZipFile(file_path, 'r') | |
| 40 else: | |
| 41 return | |
| 42 fh.extractall(workdir) | |
| 43 os.remove(file_path) | |
| 44 | |
| 45 | |
| 46 def cat_prepare(install_dir, db_dir=None, tax_dir=None): | |
| 47 if db_dir and tax_dir: | |
| 48 cmd = ['CAT', 'prepare', '--existing', '-d', db_dir, '-t', tax_dir] | |
| 49 else: | |
| 50 cmd = ['CAT', 'prepare', '--fresh', '-q'] | |
| 51 cmd_stdout = tempfile.NamedTemporaryFile() | |
| 52 cmd_stderr = tempfile.NamedTemporaryFile() | |
| 53 return_code = subprocess.call(cmd, shell=False, cwd=install_dir, | |
| 54 stdout=cmd_stdout, stderr=cmd_stderr) | |
| 55 if return_code: | |
| 56 msg = "stdout:\n%s\nstderr:\n%s" % (cmd_stdout.read(), | |
| 57 cmd_stderr.read()) | |
| 58 cmd_stdout.close() | |
| 59 cmd_stderr.close() | |
| 60 raise Exception('Error: (%s), returncode=%s %s' | |
| 61 % (' '.join(cmd), return_code, msg)) | |
| 62 | |
| 63 | |
| 64 def main(): | |
| 65 parser = argparse.ArgumentParser() | |
| 66 parser.add_argument('--config_file', required=True) | |
| 67 parser.add_argument('--install_path', default=None) | |
| 68 parser.add_argument('--db_url', default=None) | |
| 69 parser.add_argument('--database_folder', default=None) | |
| 70 parser.add_argument('--taxonomy_folder', default=None) | |
| 71 args = parser.parse_args() | |
| 72 | |
| 73 cat_path = None | |
| 74 cat_db = None | |
| 75 tax_db = None | |
| 76 if args.database_folder and args.taxonomy_folder: | |
| 77 cat_path = os.path.dirname(args.database_folder) | |
| 78 cat_db = os.path.basename(args.database_folder) | |
| 79 tax_db = os.path.basename(args.taxonomy_folder) | |
| 80 cat_prepare(os.getcwd(), | |
| 81 db_dir=args.database_folder, | |
| 82 tax_dir=args.taxonomy_folder) | |
| 83 elif not args.install_path: | |
| 84 sys.exit(1) | |
| 85 else: | |
| 86 if not os.path.exists(args.install_path): | |
| 87 os.makedirs(args.install_path) | |
| 88 if args.db_url: | |
| 89 url_download(args.db_url, args.install_path) | |
| 90 else: | |
| 91 cat_prepare(args.install_path) | |
| 92 for root, dirs, files in os.walk(args.install_path): | |
| 93 for dname in dirs: | |
| 94 if dname.endswith('CAT_database'): | |
| 95 cat_db = dname | |
| 96 elif dname.endswith('taxonomy'): | |
| 97 tax_db = dname | |
| 98 if cat_db and tax_db: | |
| 99 cat_path = root | |
| 100 break | |
| 101 cat_dir = os.path.basename(cat_path) | |
| 102 dm_dict = {} | |
| 103 dm_dict['data_tables'] = dm_dict.get('data_tables', {}) | |
| 104 data_table = 'cat_database' | |
| 105 dm_dict['data_tables'][data_table]\ | |
| 106 = dm_dict['data_tables'].get(data_table, []) | |
| 107 data_table_entry = dict(value=cat_dir, name=cat_dir, | |
| 108 database_folder=os.path.join(cat_dir, cat_db), | |
| 109 taxonomy_folder=os.path.join(cat_dir, tax_db)) | |
| 110 dm_dict['data_tables'][data_table].append(data_table_entry) | |
| 111 # save info to json file | |
| 112 open(args.config_file, 'w').write(json.dumps(dm_dict)) | |
| 113 | |
| 114 | |
| 115 if __name__ == "__main__": | |
| 116 main() |
