annotate 0.2.0/bin/microreact_post.py @ 0:9e8b1c747a6a draft default tip

planemo upload
author galaxytrakr
date Fri, 29 May 2026 13:32:17 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
1 #!/usr/bin/env python3
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
2
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
3 import argparse
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
4 import base64
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
5 import csv
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
6 import inspect
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
7 import json
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
8 import logging
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
9 import os
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
10 import pprint
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
11 import secrets
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
12 import string
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
13
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
14 import requests
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
15 from requests.packages import urllib3
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
16
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
17
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
18 # Multiple inheritence for pretty printing of help text.
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
19 class MultiArgFormatClasses(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
20 argparse.RawTextHelpFormatter, argparse.ArgumentDefaultsHelpFormatter
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
21 ):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
22 pass
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
23
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
24
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
25 # Basic checks
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
26 def check_file_extension(folder_path) -> os.PathLike:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
27 if not os.path.isdir(folder_path):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
28 logging.error(f"The provided path: '{folder_path}' is not a valid directory.")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
29 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
30
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
31 tree_and_metadata_files = [
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
32 file
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
33 for file in os.listdir(folder_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
34 if file.endswith(".nwk") or file.endswith(".csv")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
35 ]
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
36
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
37 if len(tree_and_metadata_files) != 2:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
38 logging.error(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
39 "We need exactly one .nwk file and one metadata "
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
40 + "file in CSV (.csv) format."
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
41 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
42 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
43
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
44 for file in tree_and_metadata_files:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
45 file_path = os.path.join(folder_path, file)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
46
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
47 if os.path.isfile(file_path):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
48 extension = os.path.splitext(file)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
49 if extension[1] not in [".csv", ".nwk"]:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
50 logging.error(f"{file} is not the correct extension: .nwk or .csv")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
51 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
52
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
53 if file_path.endswith(".nwk"):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
54 nwk_file = file_path
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
55
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
56 return nwk_file
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
57
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
58
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
59 # Checking the CSV file
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
60 def uppercase_headers(folder_path) -> list:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
61 for filename in os.listdir(folder_path):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
62 if filename.endswith(".csv"):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
63 filepath = os.path.join(folder_path, filename)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
64 with open(filepath, "r", newline="") as file:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
65 reader = csv.reader(file)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
66 headers = next(reader)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
67 if all(header.isupper() for header in headers):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
68 pass
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
69 else:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
70 headers = [header.upper() for header in headers]
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
71 with open(filepath, "w", newline="") as file:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
72 writer = csv.writer(file)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
73 writer.writerow(headers)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
74 for row in reader:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
75 writer.writerow(row)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
76 file.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
77 file.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
78 return headers
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
79
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
80
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
81 def check_csv(folder_path) -> os.PathLike:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
82 for filename in os.listdir(folder_path):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
83 if filename.endswith(".csv"):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
84 filepath = os.path.join(folder_path, filename)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
85 with open(filepath, "r", newline="") as file:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
86 reader = csv.reader(file)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
87
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
88 # Checking for headers and first column named "ID"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
89 headers = next(reader, None)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
90 if headers is None:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
91 logging.error("Error: CSV file has no column headers.")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
92 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
93 if headers[0] != "ID":
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
94 logging.error("Error: First column header is not 'ID'.")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
95 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
96
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
97 # Check if all values in "ID" column are unique
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
98 col_values = set()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
99 for row in reader:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
100 id_value = row[0].strip()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
101 if id_value in col_values:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
102 logging.error(f"Duplicate ID found: {id_value}")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
103 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
104 col_values.add(id_value)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
105
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
106 # Checking that columns are equal across all rows
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
107 num_columns = None
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
108 for i, row in enumerate(reader):
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
109 if num_columns is None:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
110 num_columns = len(row)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
111 elif len(row) != num_columns:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
112 logging.error(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
113 f"Error: Unequal number of columns in row {i + 1}"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
114 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
115 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
116 file.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
117 return filepath
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
118
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
119
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
120 # Encode files to base64 for uploading
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
121 def encode_file(file) -> str:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
122 with open(file, "r") as f:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
123 file = f.read()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
124 file_64 = base64.b64encode(file.encode()).decode()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
125 f.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
126 return file_64
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
127
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
128
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
129 # Creating the .microreact JSON file
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
130 def gen_ran_string(length=4) -> str:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
131 letters = string.ascii_letters
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
132 return "".join(secrets.choice(letters) for i in range(length))
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
133
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
134
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
135 # Microreact JSON template
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
136 def create_json(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
137 metadata_csv, tree_path, metadata_64, tree_64, ProjectName, folder_path
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
138 ) -> os.PathLike:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
139 file_csv = gen_ran_string()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
140 file_tree = gen_ran_string()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
141 csv_size = os.path.getsize(metadata_csv)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
142 tree_size = os.path.getsize(tree_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
143 headers = uppercase_headers(folder_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
144 columns = [{"field": "ID", "fixed": False}]
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
145
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
146 for header in headers[1:]:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
147 columns.append({"field": header, "fixed": False})
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
148
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
149 microreact_data = {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
150 "charts": {},
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
151 "datasets": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
152 "dataset-1": {"id": "dataset-1", "file": file_csv, "idFieldName": "ID"}
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
153 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
154 "files": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
155 file_csv: {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
156 "blob": f"data:text/csv;base64,{metadata_64}",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
157 "format": "text/csv",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
158 "id": file_csv,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
159 "name": os.path.basename(metadata_csv),
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
160 "size": csv_size,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
161 "type": "data",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
162 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
163 file_tree: {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
164 "blob": f"data:application/octet-stream;base64,{tree_64}",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
165 "format": "text/x-nh",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
166 "id": file_tree,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
167 "name": os.path.basename(tree_path),
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
168 "size": tree_size,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
169 "type": "tree",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
170 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
171 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
172 "filters": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
173 "dataFilters": [],
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
174 "chartFilters": [],
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
175 "searchOperator": "includes",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
176 "searchValue": "",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
177 "selection": [],
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
178 "selectionBreakdownField": None,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
179 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
180 "maps": {},
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
181 "meta": {"name": ProjectName},
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
182 "trees": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
183 "tree-1": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
184 "alignLabels": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
185 "blockHeaderFontSize": 13,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
186 "blockPadding": 0,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
187 "blocks": ["MLST_SEQUENCE_TYPE", "ISOLATION_SOURCE"],
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
188 "blockSize": 14,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
189 "branchLengthsDigits": 4,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
190 "controls": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
191 "fontSize": 16,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
192 "hideOrphanDataRows": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
193 "ids": None,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
194 "internalLabelsFilterRange": [0, 100],
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
195 "internalLabelsFontSize": 13,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
196 "lasso": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
197 "nodeSize": 14,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
198 "path": None,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
199 "roundBranchLengths": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
200 "scaleLineAlpha": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
201 "showBlockHeaders": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
202 "showBlockLabels": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
203 "showBranchLengths": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
204 "showEdges": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
205 "showInternalLabels": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
206 "showLabels": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
207 "showLeafLabels": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
208 "showPiecharts": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
209 "showShapeBorders": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
210 "showShapes": True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
211 "styleLeafLabels": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
212 "styleNodeEdges": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
213 "subtreeIds": None,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
214 "type": "rc",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
215 "title": "Tree",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
216 "labelField": "ID",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
217 "file": file_tree,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
218 }
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
219 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
220 "tables": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
221 "table-1": {
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
222 "displayMode": "cosy",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
223 "hideUnselected": False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
224 "title": "Metadata",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
225 "paneId": "table-1",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
226 "columns": columns,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
227 "file": file_csv,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
228 }
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
229 },
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
230 "views": [],
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
231 "schema": "https://microreact.org/schema/v1.json",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
232 }
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
233 micro_path = os.path.join(os.getcwd(), ProjectName + ".microreact")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
234
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
235 with open(micro_path, "w") as microreact_file:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
236 json.dump(microreact_data, microreact_file, indent=2)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
237 microreact_file.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
238 microreact_file.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
239
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
240 return micro_path
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
241
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
242
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
243 # Main
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
244 def main() -> None:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
245 """
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
246 Will take as input a folder containing 2 files, a tree file and a metadata CSV file
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
247 and upload it to a new project named "Cronology" and get a publicly shareable link from
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
248 microreact.org once the upload is successful
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
249
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
250 """
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
251 # Debug print.
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
252 ppp = pprint.PrettyPrinter(width=55)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
253
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
254 # Set logging.
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
255 logging.basicConfig(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
256 format="\n"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
257 + "=" * 55
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
258 + "\n%(asctime)s - %(levelname)s\n"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
259 + "=" * 55
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
260 + "\n%(message)s\n\n",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
261 level=logging.DEBUG,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
262 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
263
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
264 # Turn off SSL warnings
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
265 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
266
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
267 prog_name = os.path.basename(inspect.stack()[0].filename)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
268
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
269 parser = argparse.ArgumentParser(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
270 prog=prog_name, description=main.__doc__, formatter_class=MultiArgFormatClasses
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
271 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
272
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
273 # Add required arguments
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
274 required = parser.add_argument_group("required arguments")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
275
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
276 required.add_argument(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
277 "-dir",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
278 dest="dir",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
279 default=False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
280 required=True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
281 help="UNIX path to diretory containing the tree and all other\ndataset and annotation files."
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
282 + " Your tree file and metadata files must\nhave the extension .nwk and .csv",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
283 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
284 required.add_argument(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
285 "-atp",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
286 dest="AccessTokenPath",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
287 default=False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
288 required=True,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
289 help="The path to your API Access Token needed for uploading.\n"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
290 + "File must be a .txt file.",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
291 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
292 parser.add_argument(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
293 "-name",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
294 dest="ProjectName",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
295 default="Project",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
296 required=False,
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
297 help="Name for the project you want to upload",
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
298 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
299
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
300 # Define defaults
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
301 args = parser.parse_args()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
302 upload_url = "https://microreact.org/api/projects/create"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
303 folder_path = args.dir
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
304 ProjectName = args.ProjectName
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
305 micro_url_info_path = os.path.join(os.getcwd(), "microreact_url.txt")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
306
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
307 with open(args.AccessTokenPath, "r") as token:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
308 atp = token.readline()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
309 token.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
310
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
311 tree_path = check_file_extension(folder_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
312 metadata_csv = check_csv(folder_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
313 metadata_64 = encode_file(metadata_csv)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
314 tree_64 = encode_file(tree_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
315
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
316 # Prepare the data to be sent in the request
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
317 micro_path = create_json(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
318 metadata_csv, tree_path, metadata_64, tree_64, ProjectName, folder_path
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
319 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
320
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
321 f = open(micro_path)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
322 data = json.load(f)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
323 f.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
324
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
325 # Additional parameters, including the MicroReact API key
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
326 headers = {"Content-type": "application/json; charset=UTF-8", "Access-Token": atp}
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
327
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
328 # Make the POST request to Microreact
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
329 r = requests.post(upload_url, json=data, headers=headers, verify=False)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
330
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
331 if not r.ok:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
332 if r.status_code == 400:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
333 logging.error("Microreact API call failed with response " + r.text + "\n")
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
334 else:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
335 logging.error(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
336 "Microreact API call failed with unknown response code "
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
337 + str(r.status_code)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
338 + "\n"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
339 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
340 exit(1)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
341 if r.status_code == 200:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
342 r_json = json.loads(r.text)
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
343 with open(micro_url_info_path, "w") as out_fh:
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
344 out_fh.write(
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
345 f"Uploaded successfully!\n\nYour project URL:\n{r_json['url']}"
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
346 )
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
347 out_fh.close()
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
348
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
349
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
350 if __name__ == "__main__":
9e8b1c747a6a planemo upload
galaxytrakr
parents:
diff changeset
351 main()