Mercurial > repos > iuc > data_manager_pangolearn
comparison data_manager/pangolearn_dm.py @ 0:3eac657893fe draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/data_managers/data_manager_pangolearn commit 68adfad76cdb5ff13ec9fb49895a3cde2c502514"
author | iuc |
---|---|
date | Sat, 24 Apr 2021 20:56:04 +0000 |
parents | |
children | 112bb7a9da3c |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3eac657893fe |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 import argparse | |
4 import datetime | |
5 import json | |
6 import operator | |
7 import os | |
8 import shutil | |
9 import sys | |
10 import tarfile | |
11 | |
12 import requests | |
13 | |
14 | |
15 def extract_date(tag_str): | |
16 parts = tag_str.split("_") | |
17 assert len(parts) < 3, "expected maximum of two parts, got " + str(parts) | |
18 tag_date = datetime.datetime.strptime(parts[0], "%Y-%m-%d") | |
19 if len(parts) == 2: | |
20 version = int(parts[1]) | |
21 assert ( | |
22 version < 24 * 60 | |
23 ) # because the code stores versions as minutes of the day, it can't handle versions > 1440 | |
24 tag_date += datetime.timedelta(minutes=version) | |
25 return tag_date | |
26 | |
27 | |
28 def get_model_list( | |
29 existing_release_tags, | |
30 url="https://api.github.com/repos/cov-lineages/pangoLEARN/releases", | |
31 ): | |
32 response = requests.get(url) | |
33 if response.status_code == 200: | |
34 release_list = json.loads(response.text) | |
35 release_info = [ | |
36 dict( | |
37 tag_name=e["tag_name"], | |
38 name=e["name"], | |
39 date=extract_date(e["tag_name"]), | |
40 tarball_url=e["tarball_url"], | |
41 ) | |
42 for e in release_list | |
43 if e["tag_name"] not in existing_release_tags | |
44 ] | |
45 return release_info | |
46 else: | |
47 response.raise_for_status() | |
48 | |
49 | |
50 def filter_by_date(existing_release_tags, start_date=None, end_date=None): | |
51 release_list = get_model_list(existing_release_tags) | |
52 return [ | |
53 element | |
54 for element in release_list | |
55 if not ( | |
56 (end_date is not None and element["date"] > end_date) | |
57 or (start_date is not None and element["date"] < start_date) | |
58 ) | |
59 ] | |
60 | |
61 | |
62 def download_and_unpack(url, output_directory): | |
63 response = requests.get(url) | |
64 if response.status_code == 200: | |
65 tmp_filename = url.split("/")[-1] | |
66 tmpfile = open(tmp_filename, "wb") | |
67 tmpfile.write(response.content) | |
68 tmpfile.close() | |
69 shutil.copy(tmp_filename, "/tmp") | |
70 tf = tarfile.open(tmp_filename) | |
71 pl_path = tf.next().name | |
72 tf.extractall(output_directory) | |
73 os.unlink(tmp_filename) | |
74 os.rename( | |
75 output_directory + "/" + pl_path + "/" + "pangoLEARN", | |
76 output_directory + "/" + tmp_filename, | |
77 ) | |
78 shutil.rmtree(output_directory + "/" + pl_path) | |
79 return tmp_filename | |
80 else: | |
81 response.raise_for_status() | |
82 | |
83 | |
84 def parse_date(d): | |
85 return datetime.datetime.strptime(d, "%Y-%m-%d") | |
86 | |
87 | |
88 if __name__ == "__main__": | |
89 | |
90 parser = argparse.ArgumentParser() | |
91 parser.add_argument("--testmode", default=False, action="store_true") | |
92 parser.add_argument("--latest", default=False, action="store_true") | |
93 parser.add_argument("--start_date", type=parse_date) | |
94 parser.add_argument("--end_date", type=parse_date) | |
95 parser.add_argument("--overwrite", default=False, action="store_true") | |
96 parser.add_argument('--pangolearn_format_version', default="1.0") | |
97 parser.add_argument("datatable_name") | |
98 parser.add_argument("galaxy_datamanager_filename") | |
99 args = parser.parse_args() | |
100 | |
101 if args.testmode: | |
102 releases = filter_by_date(start_date=args.start_date, end_date=args.end_date) | |
103 for release in releases: | |
104 print(release["tag_name"], release["tarball_url"].split("/")[-1]) | |
105 sys.exit(0) | |
106 | |
107 with open(args.galaxy_datamanager_filename) as fh: | |
108 config = json.load(fh) | |
109 | |
110 output_directory = config.get("output_data", [{}])[0].get("extra_files_path", None) | |
111 data_manager_dict = {} | |
112 data_manager_dict["data_tables"] = config.get("data_tables", {}) | |
113 data_manager_dict["data_tables"][args.datatable_name] = data_manager_dict[ | |
114 "data_tables" | |
115 ].get(args.datatable_name, []) | |
116 | |
117 # NOTE: the data_manager_dict["data_tables"][args.datatable_name] is not actually populated with the | |
118 # contents of the existing data table, so the "no-overwrite" logic and the | |
119 # only-download-what-we-don't-have logic does not in fact work. It is left but unused for now. | |
120 if not args.overwrite: | |
121 existing_release_tags = set( | |
122 [ | |
123 el["value"] | |
124 for el in data_manager_dict["data_tables"][args.datatable_name] | |
125 ] | |
126 ) | |
127 else: | |
128 existing_release_tags = set() | |
129 if args.latest: | |
130 releases = [get_model_list(existing_release_tags)[0]] | |
131 else: | |
132 releases = filter_by_date( | |
133 existing_release_tags, start_date=args.start_date, end_date=args.end_date | |
134 ) | |
135 releases_to_download = [ | |
136 release | |
137 for release in releases | |
138 if release["tag_name"] not in existing_release_tags | |
139 ] | |
140 for release in releases_to_download: | |
141 tag = download_and_unpack(release["tarball_url"], output_directory) | |
142 data_manager_dict["data_tables"][args.datatable_name].append( | |
143 dict( | |
144 value=tag, | |
145 description=release["name"], | |
146 format_version=args.pangolearn_format_version, | |
147 path=output_directory + "/" + tag, | |
148 ) | |
149 ) | |
150 data_manager_dict["data_tables"][args.datatable_name].sort( | |
151 key=operator.itemgetter("value"), reverse=True | |
152 ) | |
153 with open(args.galaxy_datamanager_filename, "w") as fh: | |
154 json.dump(data_manager_dict, fh, indent=2, sort_keys=True) |