Mercurial > repos > fubar > toolfactory_gtn
comparison toolfactory/ToolFactory.py @ 6:efefe43f23c8 draft default tip
Uploaded
author | fubar |
---|---|
date | Fri, 30 Apr 2021 02:10:32 +0000 |
parents | e2c8c2fa192d |
children |
comparison
equal
deleted
inserted
replaced
5:e2c8c2fa192d | 6:efefe43f23c8 |
---|---|
26 import subprocess | 26 import subprocess |
27 import sys | 27 import sys |
28 import tarfile | 28 import tarfile |
29 import tempfile | 29 import tempfile |
30 import time | 30 import time |
31 import urllib | |
31 | 32 |
32 from bioblend import ConnectionError | 33 from bioblend import ConnectionError |
33 from bioblend import galaxy | 34 from bioblend import galaxy |
34 from bioblend import toolshed | 35 from bioblend import toolshed |
35 | 36 |
68 citation_tuples.append(("doi", citation[len("doi") :].strip())) | 69 citation_tuples.append(("doi", citation[len("doi") :].strip())) |
69 else: | 70 else: |
70 citation_tuples.append(("bibtex", citation[len("bibtex") :].strip())) | 71 citation_tuples.append(("bibtex", citation[len("bibtex") :].strip())) |
71 return citation_tuples | 72 return citation_tuples |
72 | 73 |
73 class ToolConfUpdater(): | 74 |
75 class Tool_Conf_Updater(): | |
74 # update config/tool_conf.xml with a new tool unpacked in /tools | 76 # update config/tool_conf.xml with a new tool unpacked in /tools |
75 # requires highly insecure docker settings - like write to tool_conf.xml and to tools ! | 77 # requires highly insecure docker settings - like write to tool_conf.xml and to tools ! |
76 # if in a container possibly not so courageous. | 78 # if in a container possibly not so courageous. |
77 # Fine on your own laptop but security red flag for most production instances | 79 # Fine on your own laptop but security red flag for most production instances |
78 | 80 |
79 def __init__(self, args, tool_conf_path, new_tool_archive_path, new_tool_name, tool_dir): | 81 def __init__(self, args, tool_conf_path, new_tool_archive_path, new_tool_name, tool_dir): |
80 self.args = args | 82 self.args = args |
81 self.tool_conf_path = os.path.join(args.galaxy_root,tool_conf_path) | 83 self.tool_conf_path = os.path.join(args.galaxy_root,tool_conf_path) |
82 self.tool_dir = os.path.join(args.galaxy_root, tool_dir) | 84 self.tool_dir = os.path.join(args.galaxy_root, tool_dir) |
83 self.our_name = 'ToolFactory' | 85 self.our_name = 'ToolFactory' |
84 tff = tarfile.open(new_tool_archive_path, "r:*") | 86 tff = tarfile.open(new_tool_archive_path, "r:*") |
136 tree.write(newconf, pretty_print=True) | 138 tree.write(newconf, pretty_print=True) |
137 self.run_rsync(newconf,self.tool_conf_path) | 139 self.run_rsync(newconf,self.tool_conf_path) |
138 if False and self.args.packages and self.args.packages > '': | 140 if False and self.args.packages and self.args.packages > '': |
139 self.install_deps() | 141 self.install_deps() |
140 | 142 |
141 class ScriptRunner: | 143 class Tool_Factory: |
142 """Wrapper for an arbitrary script | 144 """Wrapper for an arbitrary script |
143 uses galaxyxml | 145 uses galaxyxml |
144 | 146 |
145 """ | 147 """ |
146 | 148 |
192 print( | 194 print( |
193 f"--selecttext_parameters {args.selecttext_parameters} is malformed - should be a dictionary" | 195 f"--selecttext_parameters {args.selecttext_parameters} is malformed - should be a dictionary" |
194 ) | 196 ) |
195 self.args = args | 197 self.args = args |
196 self.cleanuppar() | 198 self.cleanuppar() |
197 self.lastclredirect = None | |
198 self.lastxclredirect = None | 199 self.lastxclredirect = None |
199 self.cl = [] | |
200 self.xmlcl = [] | 200 self.xmlcl = [] |
201 self.is_positional = self.args.parampass == "positional" | 201 self.is_positional = self.args.parampass == "positional" |
202 if self.args.sysexe: | 202 if self.args.sysexe: |
203 if ' ' in self.args.sysexe: | 203 if ' ' in self.args.sysexe: |
204 self.executeme = self.args.sysexe.split(' ') | 204 self.executeme = self.args.sysexe.split(' ') |
207 else: | 207 else: |
208 if self.args.packages: | 208 if self.args.packages: |
209 self.executeme = [self.args.packages.split(",")[0].split(":")[0].strip(), ] | 209 self.executeme = [self.args.packages.split(",")[0].split(":")[0].strip(), ] |
210 else: | 210 else: |
211 self.executeme = None | 211 self.executeme = None |
212 aCL = self.cl.append | |
213 aXCL = self.xmlcl.append | 212 aXCL = self.xmlcl.append |
214 assert args.parampass in [ | 213 assert args.parampass in [ |
215 "0", | 214 "0", |
216 "argparse", | 215 "argparse", |
217 "positional", | 216 "positional", |
250 self.test_override = [x.rstrip() for x in stos] | 249 self.test_override = [x.rstrip() for x in stos] |
251 else: | 250 else: |
252 self.test_override = None | 251 self.test_override = None |
253 if self.args.script_path: | 252 if self.args.script_path: |
254 for ex in self.executeme: | 253 for ex in self.executeme: |
255 aCL(ex) | |
256 aXCL(ex) | 254 aXCL(ex) |
257 aCL(self.sfile) | |
258 aXCL("$runme") | 255 aXCL("$runme") |
259 else: | 256 else: |
260 for ex in self.executeme: | 257 for ex in self.executeme: |
261 aCL(ex) | |
262 aXCL(ex) | 258 aXCL(ex) |
263 | 259 |
264 if self.args.parampass == "0": | 260 if self.args.parampass == "0": |
265 self.clsimple() | 261 self.clsimple() |
266 else: | 262 else: |
271 self.prepargp() | 267 self.prepargp() |
272 self.clargparse() | 268 self.clargparse() |
273 | 269 |
274 def clsimple(self): | 270 def clsimple(self): |
275 """no parameters or repeats - uses < and > for i/o""" | 271 """no parameters or repeats - uses < and > for i/o""" |
276 aCL = self.cl.append | |
277 aXCL = self.xmlcl.append | 272 aXCL = self.xmlcl.append |
278 if len(self.infiles) > 0: | 273 if len(self.infiles) > 0: |
279 aCL("<") | |
280 aCL(self.infiles[0]["infilename"]) | |
281 aXCL("<") | 274 aXCL("<") |
282 aXCL("$%s" % self.infiles[0]["infilename"]) | 275 aXCL("$%s" % self.infiles[0]["infilename"]) |
283 if len(self.outfiles) > 0: | 276 if len(self.outfiles) > 0: |
284 aCL(">") | |
285 aCL(self.outfiles[0]["name"]) | |
286 aXCL(">") | 277 aXCL(">") |
287 aXCL("$%s" % self.outfiles[0]["name"]) | 278 aXCL("$%s" % self.outfiles[0]["name"]) |
288 if self.args.cl_user_suffix: # DIY CL end | 279 if self.args.cl_user_suffix: # DIY CL end |
289 clp = shlex.split(self.args.cl_user_suffix) | 280 clp = shlex.split(self.args.cl_user_suffix) |
290 for c in clp: | 281 for c in clp: |
291 aCL(c) | |
292 aXCL(c) | 282 aXCL(c) |
293 | 283 |
294 def prepargp(self): | 284 def prepargp(self): |
295 clsuffix = [] | |
296 xclsuffix = [] | 285 xclsuffix = [] |
297 for i, p in enumerate(self.infiles): | 286 for i, p in enumerate(self.infiles): |
298 nam = p["infilename"] | 287 nam = p["infilename"] |
299 if p["origCL"].strip().upper() == "STDIN": | 288 if p["origCL"].strip().upper() == "STDIN": |
300 appendme = [ | |
301 nam, | |
302 nam, | |
303 "< %s" % nam, | |
304 ] | |
305 xappendme = [ | 289 xappendme = [ |
306 nam, | 290 nam, |
307 nam, | 291 nam, |
308 "< $%s" % nam, | 292 "< $%s" % nam, |
309 ] | 293 ] |
310 else: | 294 else: |
311 rep = p["repeat"] == "1" | 295 rep = p["repeat"] == "1" |
312 over = "" | 296 over = "" |
313 if rep: | 297 if rep: |
314 over = f'#for $rep in $R_{nam}:\n--{nam} "$rep.{nam}"\n#end for' | 298 over = f'#for $rep in $R_{nam}:\n--{nam} "$rep.{nam}"\n#end for' |
315 appendme = [p["CL"], p["CL"], ""] | |
316 xappendme = [p["CL"], "$%s" % p["CL"], over] | 299 xappendme = [p["CL"], "$%s" % p["CL"], over] |
317 clsuffix.append(appendme) | |
318 xclsuffix.append(xappendme) | 300 xclsuffix.append(xappendme) |
319 for i, p in enumerate(self.outfiles): | 301 for i, p in enumerate(self.outfiles): |
320 if p["origCL"].strip().upper() == "STDOUT": | 302 if p["origCL"].strip().upper() == "STDOUT": |
321 self.lastclredirect = [">", p["name"]] | |
322 self.lastxclredirect = [">", "$%s" % p["name"]] | 303 self.lastxclredirect = [">", "$%s" % p["name"]] |
323 else: | 304 else: |
324 clsuffix.append([p["name"], p["name"], ""]) | |
325 xclsuffix.append([p["name"], "$%s" % p["name"], ""]) | 305 xclsuffix.append([p["name"], "$%s" % p["name"], ""]) |
326 for p in self.addpar: | 306 for p in self.addpar: |
327 nam = p["name"] | 307 nam = p["name"] |
328 rep = p["repeat"] == "1" | 308 rep = p["repeat"] == "1" |
329 if rep: | 309 if rep: |
330 over = f'#for $rep in $R_{nam}:\n--{nam} "$rep.{nam}"\n#end for' | 310 over = f'#for $rep in $R_{nam}:\n--{nam} "$rep.{nam}"\n#end for' |
331 else: | 311 else: |
332 over = p["override"] | 312 over = p["override"] |
333 clsuffix.append([p["CL"], nam, over]) | |
334 xclsuffix.append([p["CL"], '"$%s"' % nam, over]) | 313 xclsuffix.append([p["CL"], '"$%s"' % nam, over]) |
335 for p in self.selpar: | 314 for p in self.selpar: |
336 clsuffix.append([p["CL"], p["name"], p["override"]]) | |
337 xclsuffix.append([p["CL"], '"$%s"' % p["name"], p["override"]]) | 315 xclsuffix.append([p["CL"], '"$%s"' % p["name"], p["override"]]) |
338 self.xclsuffix = xclsuffix | 316 self.xclsuffix = xclsuffix |
339 self.clsuffix = clsuffix | |
340 | 317 |
341 def prepclpos(self): | 318 def prepclpos(self): |
342 clsuffix = [] | |
343 xclsuffix = [] | 319 xclsuffix = [] |
344 for i, p in enumerate(self.infiles): | 320 for i, p in enumerate(self.infiles): |
345 if p["origCL"].strip().upper() == "STDIN": | 321 if p["origCL"].strip().upper() == "STDIN": |
346 appendme = [ | |
347 "999", | |
348 p["infilename"], | |
349 "< $%s" % p["infilename"], | |
350 ] | |
351 xappendme = [ | 322 xappendme = [ |
352 "999", | 323 "999", |
353 p["infilename"], | 324 p["infilename"], |
354 "< $%s" % p["infilename"], | 325 "< $%s" % p["infilename"], |
355 ] | 326 ] |
356 else: | 327 else: |
357 appendme = [p["CL"], p["infilename"], ""] | |
358 xappendme = [p["CL"], "$%s" % p["infilename"], ""] | 328 xappendme = [p["CL"], "$%s" % p["infilename"], ""] |
359 clsuffix.append(appendme) | |
360 xclsuffix.append(xappendme) | 329 xclsuffix.append(xappendme) |
361 for i, p in enumerate(self.outfiles): | 330 for i, p in enumerate(self.outfiles): |
362 if p["origCL"].strip().upper() == "STDOUT": | 331 if p["origCL"].strip().upper() == "STDOUT": |
363 self.lastclredirect = [">", p["name"]] | |
364 self.lastxclredirect = [">", "$%s" % p["name"]] | 332 self.lastxclredirect = [">", "$%s" % p["name"]] |
365 else: | 333 else: |
366 clsuffix.append([p["CL"], p["name"], ""]) | |
367 xclsuffix.append([p["CL"], "$%s" % p["name"], ""]) | 334 xclsuffix.append([p["CL"], "$%s" % p["name"], ""]) |
368 for p in self.addpar: | 335 for p in self.addpar: |
369 nam = p["name"] | 336 nam = p["name"] |
370 rep = p["repeat"] == "1" # repeats make NO sense | 337 rep = p["repeat"] == "1" # repeats make NO sense |
371 if rep: | 338 if rep: |
372 print(f'### warning. Repeats for {nam} ignored - not permitted in positional parameter command lines!') | 339 print(f'### warning. Repeats for {nam} ignored - not permitted in positional parameter command lines!') |
373 over = p["override"] | 340 over = p["override"] |
374 clsuffix.append([p["CL"], nam, over]) | |
375 xclsuffix.append([p["CL"], '"$%s"' % nam, over]) | 341 xclsuffix.append([p["CL"], '"$%s"' % nam, over]) |
376 for p in self.selpar: | 342 for p in self.selpar: |
377 clsuffix.append([p["CL"], p["name"], p["override"]]) | |
378 xclsuffix.append([p["CL"], '"$%s"' % p["name"], p["override"]]) | 343 xclsuffix.append([p["CL"], '"$%s"' % p["name"], p["override"]]) |
379 clsuffix.sort() | |
380 xclsuffix.sort() | 344 xclsuffix.sort() |
381 self.xclsuffix = xclsuffix | 345 self.xclsuffix = xclsuffix |
382 self.clsuffix = clsuffix | |
383 | 346 |
384 def prepScript(self): | 347 def prepScript(self): |
385 rx = open(self.args.script_path, "r").readlines() | 348 rx = open(self.args.script_path, "r").readlines() |
386 rx = [x.rstrip() for x in rx] | 349 rx = [x.rstrip() for x in rx] |
387 rxcheck = [x.strip() for x in rx if x.strip() > ""] | 350 rxcheck = [x.strip() for x in rx if x.strip() > ""] |
441 p["origCL"] = p["CL"] | 404 p["origCL"] = p["CL"] |
442 self.addpar[i] = p | 405 self.addpar[i] = p |
443 | 406 |
444 def clpositional(self): | 407 def clpositional(self): |
445 # inputs in order then params | 408 # inputs in order then params |
446 aCL = self.cl.append | |
447 for (k, v, koverride) in self.clsuffix: | |
448 if " " in v: | |
449 aCL("%s" % v) | |
450 else: | |
451 aCL(v) | |
452 aXCL = self.xmlcl.append | 409 aXCL = self.xmlcl.append |
453 for (k, v, koverride) in self.xclsuffix: | 410 for (k, v, koverride) in self.xclsuffix: |
454 aXCL(v) | 411 aXCL(v) |
455 if self.lastxclredirect: | 412 if self.lastxclredirect: |
456 aXCL(self.lastxclredirect[0]) | 413 aXCL(self.lastxclredirect[0]) |
457 aXCL(self.lastxclredirect[1]) | 414 aXCL(self.lastxclredirect[1]) |
458 if self.args.cl_user_suffix: # DIY CL end | 415 if self.args.cl_user_suffix: # DIY CL end |
459 clp = shlex.split(self.args.cl_user_suffix) | 416 clp = shlex.split(self.args.cl_user_suffix) |
460 for c in clp: | 417 for c in clp: |
461 aCL(c) | |
462 aXCL(c) | 418 aXCL(c) |
463 | 419 |
464 | 420 |
465 def clargparse(self): | 421 def clargparse(self): |
466 """argparse style""" | 422 """argparse style""" |
467 aCL = self.cl.append | |
468 aXCL = self.xmlcl.append | 423 aXCL = self.xmlcl.append |
469 # inputs then params in argparse named form | 424 # inputs then params in argparse named form |
470 | 425 |
471 for (k, v, koverride) in self.xclsuffix: | 426 for (k, v, koverride) in self.xclsuffix: |
472 if koverride > "": | 427 if koverride > "": |
477 k = "-%s" % k | 432 k = "-%s" % k |
478 else: | 433 else: |
479 k = "--%s" % k | 434 k = "--%s" % k |
480 aXCL(k) | 435 aXCL(k) |
481 aXCL(v) | 436 aXCL(v) |
482 for (k, v, koverride) in self.clsuffix: | |
483 if koverride > "": | |
484 k = koverride | |
485 elif len(k.strip()) == 1: | |
486 k = "-%s" % k | |
487 else: | |
488 k = "--%s" % k | |
489 aCL(k) | |
490 aCL(v) | |
491 if self.lastxclredirect: | 437 if self.lastxclredirect: |
492 aXCL(self.lastxclredirect[0]) | 438 aXCL(self.lastxclredirect[0]) |
493 aXCL(self.lastxclredirect[1]) | 439 aXCL(self.lastxclredirect[1]) |
494 if self.args.cl_user_suffix: # DIY CL end | 440 if self.args.cl_user_suffix: # DIY CL end |
495 clp = shlex.split(self.args.cl_user_suffix) | 441 clp = shlex.split(self.args.cl_user_suffix) |
496 for c in clp: | 442 for c in clp: |
497 aCL(c) | |
498 aXCL(c) | 443 aXCL(c) |
499 | 444 |
500 def getNdash(self, newname): | 445 def getNdash(self, newname): |
501 if self.is_positional: | 446 if self.is_positional: |
502 ndash = 0 | 447 ndash = 0 |
855 xf.write(exml) | 800 xf.write(exml) |
856 xf.write("\n") | 801 xf.write("\n") |
857 xf.close() | 802 xf.close() |
858 # ready for the tarball | 803 # ready for the tarball |
859 | 804 |
860 def run(self): #noqa | |
861 """ | |
862 generate test outputs by running a command line | |
863 won't work if command or test override in play - planemo is the | |
864 easiest way to generate test outputs for that case so is | |
865 automagically selected | |
866 """ | |
867 scl = " ".join(self.cl) | |
868 err = None | |
869 logname = f"{self.tool_name}_runner_log" | |
870 if self.args.parampass != "0": | |
871 if self.lastclredirect: | |
872 logf = open(self.lastclredirect[1], "wb") # is name of an output file | |
873 else: | |
874 logf = open(logname,'w') | |
875 logf.write("No dependencies so sending CL = '%s' to the fast direct runner instead of planemo to generate tests" % scl) | |
876 subp = subprocess.run( | |
877 self.cl, shell=False, stdout=logf, stderr=logf | |
878 ) | |
879 logf.close() | |
880 retval = subp.returncode | |
881 else: # work around special case - stdin and write to stdout | |
882 if len(self.infiles) > 0: | |
883 sti = open(self.infiles[0]["name"], "rb") | |
884 else: | |
885 sti = sys.stdin | |
886 if len(self.outfiles) > 0: | |
887 sto = open(self.outfiles[0]["name"], "wb") | |
888 else: | |
889 sto = sys.stdout | |
890 subp = subprocess.run( | |
891 self.cl, shell=False, stdout=sto, stdin=sti | |
892 ) | |
893 retval = subp.returncode | |
894 sto.close() | |
895 sti.close() | |
896 if retval != 0 and err: # problem | |
897 sys.stderr.write(err) | |
898 for p in self.outfiles: | |
899 oname = p["name"] | |
900 tdest = os.path.join(self.testdir, "%s_sample" % oname) | |
901 if not os.path.isfile(tdest): | |
902 if os.path.isfile(oname): | |
903 shutil.copyfile(oname, tdest) | |
904 dest = os.path.join(self.repdir, "%s.sample.%s" % (oname,p['format'])) | |
905 shutil.copyfile(oname, dest) | |
906 else: | |
907 if report_fail: | |
908 tout.write( | |
909 "###Tool may have failed - output file %s not found in testdir after planemo run %s." | |
910 % (oname, self.testdir) | |
911 ) | |
912 for p in self.infiles: | |
913 pth = p["name"] | |
914 dest = os.path.join(self.testdir, "%s_sample" % p["infilename"]) | |
915 shutil.copyfile(pth, dest) | |
916 dest = os.path.join(self.repdir, "%s_sample.%s" % (p["infilename"],p["format"])) | |
917 shutil.copyfile(pth, dest) | |
918 with os.scandir('.') as outs: | |
919 for entry in outs: | |
920 newname = entry.name | |
921 if not entry.is_file() or entry.name.endswith('_sample'): | |
922 continue | |
923 if not (entry.name.endswith('.html') or entry.name.endswith('.gz') or entry.name.endswith(".tgz")): | |
924 fname, ext = os.path.splitext(entry.name) | |
925 if len(ext) > 1: | |
926 newname = f"{fname}_{ext[1:]}.txt" | |
927 else: | |
928 newname = f"{fname}.txt" | |
929 dest = os.path.join(self.repdir, newname) | |
930 src = entry.name | |
931 shutil.copyfile(src, dest) | |
932 return retval | |
933 | |
934 def writeShedyml(self): | 805 def writeShedyml(self): |
935 """for planemo""" | 806 """for planemo""" |
936 yuser = self.args.user_email.split("@")[0] | 807 yuser = self.args.user_email.split("@")[0] |
937 yfname = os.path.join(self.tooloutdir, ".shed.yml") | 808 yfname = os.path.join(self.tooloutdir, ".shed.yml") |
938 yamlf = open(yfname, "w") | 809 yamlf = open(yfname, "w") |
1066 a("--new_tool", default="new_tool") | 937 a("--new_tool", default="new_tool") |
1067 a("--galaxy_root", default="/galaxy-central") | 938 a("--galaxy_root", default="/galaxy-central") |
1068 a("--galaxy_venv", default="/galaxy_venv") | 939 a("--galaxy_venv", default="/galaxy_venv") |
1069 a("--collection", action="append", default=[]) | 940 a("--collection", action="append", default=[]) |
1070 a("--include_tests", default=False, action="store_true") | 941 a("--include_tests", default=False, action="store_true") |
942 a("--admin_only", default=False, action="store_true") | |
1071 a("--install", default=False, action="store_true") | 943 a("--install", default=False, action="store_true") |
1072 a("--run_test", default=False, action="store_true") | 944 a("--run_test", default=False, action="store_true") |
1073 a("--local_tools", default='tools') # relative to $__root_dir__ | 945 a("--local_tools", default='tools') # relative to $__root_dir__ |
1074 a("--tool_conf_path", default='config/tool_conf.xml') # relative to $__root_dir__ | 946 a("--tool_conf_path", default='config/tool_conf.xml') # relative to $__root_dir__ |
1075 a("--galaxy_url", default="http://localhost:8080") | 947 a("--galaxy_url", default="http://localhost:8080") |
1077 # make sure this is identical to tool_sheds_conf.xml | 949 # make sure this is identical to tool_sheds_conf.xml |
1078 # localhost != 127.0.0.1 so validation fails | 950 # localhost != 127.0.0.1 so validation fails |
1079 a("--toolshed_api_key", default="fakekey") | 951 a("--toolshed_api_key", default="fakekey") |
1080 a("--galaxy_api_key", default="8993d65865e6d6d1773c2c34a1cc207d") | 952 a("--galaxy_api_key", default="8993d65865e6d6d1773c2c34a1cc207d") |
1081 args = parser.parse_args() | 953 args = parser.parse_args() |
1082 assert not args.bad_user, ( | 954 if args.admin_only: |
1083 'UNAUTHORISED: %s is NOT authorized to use this tool until Galaxy \ | 955 assert not args.bad_user, ( |
956 'UNAUTHORISED: %s is NOT authorized to use this tool until Galaxy \ | |
1084 admin adds %s to "admin_users" in the galaxy.yml Galaxy configuration file' | 957 admin adds %s to "admin_users" in the galaxy.yml Galaxy configuration file' |
1085 % (args.bad_user, args.bad_user) | 958 % (args.bad_user, args.bad_user) |
1086 ) | 959 ) |
1087 assert args.tool_name, "## Tool Factory expects a tool name - eg --tool_name=DESeq" | 960 assert args.tool_name, "## Tool Factory expects a tool name - eg --tool_name=DESeq" |
1088 assert ( | 961 r = Tool_Factory(args) |
1089 args.sysexe or args.packages | |
1090 ), "## Tool Factory wrapper expects an interpreter \ | |
1091 or an executable package in --sysexe or --packages" | |
1092 print('Hello from',os.getcwd()) | |
1093 r = ScriptRunner(args) | |
1094 r.writeShedyml() | 962 r.writeShedyml() |
1095 r.makeTool() | 963 r.makeTool() |
1096 r.makeToolTar() | 964 r.makeToolTar() |
1097 if args.run_test: | |
1098 if not args.packages or args.packages.strip() == "bash": | |
1099 r.run() | |
1100 r.makeToolTar() | |
1101 else: | |
1102 tt = ToolTester(report_dir=r.repdir, in_tool_archive=r.newtarpath, new_tool_archive=r.args.new_tool, galaxy_root=args.galaxy_root, include_tests=False) | |
1103 if args.install: | 965 if args.install: |
1104 #try: | 966 #try: |
1105 tcu = ToolConfUpdater(args=args, tool_dir=args.local_tools, | 967 tcu = Tool_Conf_Updater(args=args, tool_dir=args.local_tools, |
1106 new_tool_archive_path=r.newtarpath, tool_conf_path=args.tool_conf_path, | 968 new_tool_archive_path=r.newtarpath, tool_conf_path=args.tool_conf_path, |
1107 new_tool_name=r.tool_name) | 969 new_tool_name=r.tool_name) |
1108 #except Exception: | 970 #except Exception: |
1109 # print("### Unable to install the new tool. Are you sure you have all the required special settings?") | 971 # print("### Unable to install the new tool. Are you sure you have all the required special settings?") |
1110 | 972 |