Mercurial > repos > fubar > tool_factory_2
comparison toolfactory/rgToolFactory2.py @ 50:bf432f4486c7 draft
Uploaded
author | fubar |
---|---|
date | Sun, 30 Aug 2020 01:45:27 -0400 |
parents | 35a912ce0c83 |
children | 4b71b252eacb |
comparison
equal
deleted
inserted
replaced
49:35a912ce0c83 | 50:bf432f4486c7 |
---|---|
21 # essential problem is to create two command lines - one for the tool xml and a different | 21 # essential problem is to create two command lines - one for the tool xml and a different |
22 # one to run the executable with the supplied test data and settings | 22 # one to run the executable with the supplied test data and settings |
23 # Be simpler to write the tool, then run it with planemo and soak up the test outputs. | 23 # Be simpler to write the tool, then run it with planemo and soak up the test outputs. |
24 | 24 |
25 | 25 |
26 | |
27 import argparse | 26 import argparse |
28 import logging | 27 import logging |
29 import os | 28 import os |
30 import re | 29 import re |
31 import shutil | 30 import shutil |
45 myversion = "V2.1 July 2020" | 44 myversion = "V2.1 July 2020" |
46 verbose = True | 45 verbose = True |
47 debug = True | 46 debug = True |
48 toolFactoryURL = "https://github.com/fubar2/toolfactory" | 47 toolFactoryURL = "https://github.com/fubar2/toolfactory" |
49 ourdelim = "~~~" | 48 ourdelim = "~~~" |
50 ALOT = 10000000 # srsly. command or test overrides use read() so just in case | 49 ALOT = 10000000 # srsly. command or test overrides use read() so just in case |
51 STDIOXML = """<stdio> | 50 STDIOXML = """<stdio> |
52 <exit_code range="100:" level="debug" description="shite happens" /> | 51 <exit_code range="100:" level="debug" description="shite happens" /> |
53 </stdio>""" | 52 </stdio>""" |
54 | 53 |
55 # --input_files="$input_files~~~$CL~~~$input_formats~~~$input_label | 54 # --input_files="$input_files~~~$CL~~~$input_formats~~~$input_label |
170 "argparse", | 169 "argparse", |
171 "positional", | 170 "positional", |
172 ], 'args.parampass must be "0","positional" or "argparse"' | 171 ], 'args.parampass must be "0","positional" or "argparse"' |
173 self.tool_name = re.sub("[^a-zA-Z0-9_]+", "", args.tool_name) | 172 self.tool_name = re.sub("[^a-zA-Z0-9_]+", "", args.tool_name) |
174 self.tool_id = self.tool_name | 173 self.tool_id = self.tool_name |
175 self.tool = gxt.Tool( | 174 self.newtool = gxt.Tool( |
176 self.args.tool_name, | 175 self.args.tool_name, |
177 self.tool_id, | 176 self.tool_id, |
178 self.args.tool_version, | 177 self.args.tool_version, |
179 self.args.tool_desc, | 178 self.args.tool_desc, |
180 FAKEEXE, | 179 FAKEEXE, |
181 ) | 180 ) |
182 if self.args.script_path: | |
183 self.tool.interpreter = self.executeme | |
184 self.tooloutdir = "tfout" | 181 self.tooloutdir = "tfout" |
185 self.repdir = "TF_run_report_tempdir" | 182 self.repdir = "TF_run_report_tempdir" |
186 self.testdir = os.path.join(self.tooloutdir, "test-data") | 183 self.testdir = os.path.join(self.tooloutdir, "test-data") |
187 if not os.path.exists(self.tooloutdir): | 184 if not os.path.exists(self.tooloutdir): |
188 os.mkdir(self.tooloutdir) | 185 os.mkdir(self.tooloutdir) |
203 if self.args.test_override: | 200 if self.args.test_override: |
204 stos = open(self.args.test_override, "r").readlines() | 201 stos = open(self.args.test_override, "r").readlines() |
205 self.test_override = [x.rstrip() for x in stos] | 202 self.test_override = [x.rstrip() for x in stos] |
206 else: | 203 else: |
207 self.test_override = None | 204 self.test_override = None |
208 if self.args.cl_prefix: # DIY CL start | 205 if self.args.cl_prefix: # DIY CL start |
209 clp = self.args.cl_prefix.split(" ") | 206 clp = self.args.cl_prefix.split(" ") |
210 for c in clp: | 207 for c in clp: |
211 aCL(c) | 208 aCL(c) |
212 aXCL(c) | 209 aXCL(c) |
213 else: | 210 else: |
214 if self.args.runmode == "Executable": | 211 if self.args.runmode == "Executable": |
215 if self.args.script_path: | 212 if self.args.script_path: |
216 aCL(self.executeme) | 213 aCL(self.executeme) |
217 aCL(self.sfile) | 214 aCL(self.sfile) |
215 aXCL(self.executeme) | |
218 aXCL("$runme") | 216 aXCL("$runme") |
219 else: | 217 else: |
220 aCL(self.executeme) # this little CL will just run | 218 aCL(self.executeme) # this little CL will just run |
221 aXCL(self.executeme) | 219 aXCL(self.executeme) |
222 else: | 220 else: |
223 if self.args.script_path: | 221 if self.args.script_path: |
224 aCL(self.executeme) | 222 aCL(self.executeme) |
225 aCL(self.sfile) | 223 aCL(self.sfile) |
224 aXCL(self.executeme) | |
226 aXCL("$runme") | 225 aXCL("$runme") |
227 else: | 226 else: |
228 aCL(self.executeme) # this little CL will just run | 227 aCL(self.executeme) # this little CL will just run |
229 aXCL(self.executeme) | 228 aXCL(self.executeme) |
230 self.elog = os.path.join(self.repdir,"%s_error_log.txt" % self.tool_name) | 229 self.elog = os.path.join(self.repdir, "%s_error_log.txt" % self.tool_name) |
231 self.tlog = os.path.join(self.repdir,"%s_runner_log.txt" % self.tool_name) | 230 self.tlog = os.path.join(self.repdir, "%s_runner_log.txt" % self.tool_name) |
232 | 231 |
233 if self.args.parampass == "0": | 232 if self.args.parampass == "0": |
234 self.clsimple() | 233 self.clsimple() |
235 else: | 234 else: |
236 clsuffix = [] | 235 clsuffix = [] |
410 aparm.positional = int(oldcl) | 409 aparm.positional = int(oldcl) |
411 aparm.command_line_override = "$%s" % newcl | 410 aparm.command_line_override = "$%s" % newcl |
412 self.toutputs.append(aparm) | 411 self.toutputs.append(aparm) |
413 usetest = None | 412 usetest = None |
414 ld = None | 413 ld = None |
415 if test > '': | 414 if test > "": |
416 if test.startswith('diff'): | 415 if test.startswith("diff"): |
417 usetest = 'diff' | 416 usetest = "diff" |
418 if test.split(':')[1].isdigit: | 417 if test.split(":")[1].isdigit: |
419 ld = int(test.split(':')[1]) | 418 ld = int(test.split(":")[1]) |
420 else: | 419 else: |
421 usetest = test | 420 usetest = test |
422 tp = gxtp.TestOutput(name=newcl, value="%s_sample" % newcl, format=newfmt, | 421 tp = gxtp.TestOutput( |
423 compare=usetest, lines_diff=ld, delta=None,) | 422 name=newcl, |
423 value="%s_sample" % newcl, | |
424 format=newfmt, | |
425 compare=usetest, | |
426 lines_diff=ld, | |
427 delta=None, | |
428 ) | |
424 self.testparam.append(tp) | 429 self.testparam.append(tp) |
425 for p in self.infiles: | 430 for p in self.infiles: |
426 newname = p[ICLPOS] | 431 newname = p[ICLPOS] |
427 newfmt = p[IFMTPOS] | 432 newfmt = p[IFMTPOS] |
428 ndash = self.getNdash(newname) | 433 ndash = self.getNdash(newname) |
524 Create a Galaxy xml tool wrapper for the new script | 529 Create a Galaxy xml tool wrapper for the new script |
525 Uses galaxyhtml | 530 Uses galaxyhtml |
526 Hmmm. How to get the command line into correct order... | 531 Hmmm. How to get the command line into correct order... |
527 """ | 532 """ |
528 if self.command_override: | 533 if self.command_override: |
529 self.tool.command_line_override = self.command_override # config file | 534 self.newtool.command_line_override = self.command_override # config file |
530 else: | 535 else: |
531 self.tool.command_line_override = self.xmlcl | 536 self.newtool.command_line_override = self.xmlcl |
532 # if self.args.interpreter_name: | |
533 # self.tool.interpreter = self.args.interpreter_name | |
534 if self.args.help_text: | 537 if self.args.help_text: |
535 helptext = open(self.args.help_text, "r").readlines() | 538 helptext = open(self.args.help_text, "r").readlines() |
536 helptext = [html_escape(x) for x in helptext] | 539 safertext = [html_escape(x) for x in helptext] |
537 self.tool.help = "".join([x for x in helptext]) | 540 if self.args.script_path: |
538 else: | 541 scrpt = self.script.split('\n') |
539 self.tool.help = ( | 542 scrpt.append("```\n") |
543 if len(scrpt) > 300: | |
544 safertext = safertext + scrpt[:100] + ['>500 lines - stuff deleted','......'] + scrpt[-100:] | |
545 else: | |
546 safertext = safertext + scrpt | |
547 safertext.append("\n```") | |
548 self.newtool.help = "".join([x for x in safertext]) | |
549 else: | |
550 self.newtool.help = ( | |
540 "Please ask the tool author (%s) for help \ | 551 "Please ask the tool author (%s) for help \ |
541 as none was supplied at tool generation\n" | 552 as none was supplied at tool generation\n" |
542 % (self.args.user_email) | 553 % (self.args.user_email) |
543 ) | 554 ) |
544 self.tool.version_command = None # do not want | 555 self.newtool.version_command = None # do not want |
545 requirements = gxtp.Requirements() | 556 requirements = gxtp.Requirements() |
546 if self.args.packages: | 557 if self.args.packages: |
547 for d in self.args.packages.split(","): | 558 for d in self.args.packages.split(","): |
548 if ":" in d: | 559 if ":" in d: |
549 packg, ver = d.split(":") | 560 packg, ver = d.split(":") |
550 else: | 561 else: |
551 packg = d | 562 packg = d |
552 ver = "" | 563 ver = "" |
553 requirements.append(gxtp.Requirement("package", packg.strip(), ver.strip())) | 564 requirements.append( |
554 self.tool.requirements = requirements | 565 gxtp.Requirement("package", packg.strip(), ver.strip()) |
566 ) | |
567 self.newtool.requirements = requirements | |
555 if self.args.parampass == "0": | 568 if self.args.parampass == "0": |
556 self.doNoXMLparam() | 569 self.doNoXMLparam() |
557 else: | 570 else: |
558 self.doXMLparam() | 571 self.doXMLparam() |
559 self.tool.outputs = self.toutputs | 572 self.newtool.outputs = self.toutputs |
560 self.tool.inputs = self.tinputs | 573 self.newtool.inputs = self.tinputs |
561 if ( | 574 if self.args.script_path: |
562 self.args.script_path | |
563 ): | |
564 configfiles = gxtp.Configfiles() | 575 configfiles = gxtp.Configfiles() |
565 configfiles.append(gxtp.Configfile(name="runme", text=self.script)) | 576 configfiles.append(gxtp.Configfile(name="runme", text=self.script)) |
566 self.tool.configfiles = configfiles | 577 self.newtool.configfiles = configfiles |
567 tests = gxtp.Tests() | 578 tests = gxtp.Tests() |
568 test_a = gxtp.Test() | 579 test_a = gxtp.Test() |
569 for tp in self.testparam: | 580 for tp in self.testparam: |
570 test_a.append(tp) | 581 test_a.append(tp) |
571 tests.append(test_a) | 582 tests.append(test_a) |
572 self.tool.tests = tests | 583 self.newtool.tests = tests |
573 self.tool.add_comment( | 584 self.newtool.add_comment( |
574 "Created by %s at %s using the Galaxy Tool Factory." | 585 "Created by %s at %s using the Galaxy Tool Factory." |
575 % (self.args.user_email, timenow()) | 586 % (self.args.user_email, timenow()) |
576 ) | 587 ) |
577 self.tool.add_comment("Source in git at: %s" % (toolFactoryURL)) | 588 self.newtool.add_comment("Source in git at: %s" % (toolFactoryURL)) |
578 self.tool.add_comment( | 589 self.newtool.add_comment( |
579 "Cite: Creating re-usable tools from scripts doi: \ | 590 "Cite: Creating re-usable tools from scripts doi: \ |
580 10.1093/bioinformatics/bts573" | 591 10.1093/bioinformatics/bts573" |
581 ) | 592 ) |
582 exml0 = self.tool.export() | 593 exml0 = self.newtool.export() |
583 exml = exml0.replace(FAKEEXE, "") # temporary work around until PR accepted | 594 exml = exml0.replace(FAKEEXE, "") # temporary work around until PR accepted |
584 if self.test_override: # cannot do this inside galaxyxml as it expects lxml objects for tests | 595 if ( |
585 part1 = exml.split('<tests>')[0] | 596 self.test_override |
586 part2 = exml.split('</tests>')[1] | 597 ): # cannot do this inside galaxyxml as it expects lxml objects for tests |
587 fixed = '%s\n%s\n%s' % (part1,self.test_override,part2) | 598 part1 = exml.split("<tests>")[0] |
599 part2 = exml.split("</tests>")[1] | |
600 fixed = "%s\n%s\n%s" % (part1, self.test_override, part2) | |
588 exml = fixed | 601 exml = fixed |
589 xf = open("%s.xml" % self.tool_name, "w") | 602 xf = open("%s.xml" % self.tool_name, "w") |
590 xf.write(exml) | 603 xf.write(exml) |
591 xf.write("\n") | 604 xf.write("\n") |
592 xf.close() | 605 xf.close() |
593 # ready for the tarball | 606 # ready for the tarball |
594 | 607 |
595 def makeTool(self): | |
596 """write xmls and samples into place | |
597 """ | |
598 self.makeXML() | |
599 if self.args.script_path: | |
600 stname = os.path.join(self.tooloutdir, "%s" % (self.sfile)) | |
601 if not os.path.exists(stname): | |
602 shutil.copyfile(self.sfile, stname) | |
603 xreal = "%s.xml" % self.tool_name | |
604 xout = os.path.join(self.tooloutdir, xreal) | |
605 shutil.copyfile(xreal, xout) | |
606 for p in self.infiles: | |
607 pth = p[IPATHPOS] | |
608 dest = os.path.join(self.testdir, "%s_sample" % p[ICLPOS]) | |
609 shutil.copyfile(pth, dest) | |
610 | |
611 def makeToolTar(self): | |
612 self.newtarpath = "toolfactory_%s.tgz" % self.tool_name | |
613 tf = tarfile.open(self.newtarpath, "w:gz") | |
614 tf.add(name=self.tooloutdir, arcname=self.tool_name) | |
615 tf.close() | |
616 shutil.copyfile(self.newtarpath, self.args.new_tool) | |
617 if os.path.exists(self.tlog) and os.stat(self.tlog).st_size > 0: | |
618 shutil.copyfile( | |
619 self.tlog, os.path.join(self.tooloutdir, "test1_log_outfiletxt") | |
620 ) | |
621 | |
622 def moveRunOutputs(self): | |
623 """need to move files into toolfactory collection after any run - planemo or not | |
624 """ | |
625 for p in self.outfiles: | |
626 naym = p[ONAMEPOS] | |
627 src = os.path.join(self.tooloutdir,naym) | |
628 if os.path.isfile(src): | |
629 dest = os.path.join(self.testdir, "%s_sample" % naym) | |
630 shutil.copyfile(naym, dest) | |
631 else: | |
632 print('### problem - output file %s not found in tooloutdir %s' % (src,self.tooloutdir)) | |
633 with os.scandir(self.tooloutdir) as outs: | |
634 for entry in outs: | |
635 if not entry.is_file() or entry.name.startswith('.'): | |
636 continue | |
637 if "." in entry.name: | |
638 nayme,ext = os.path.splitext(entry.name) | |
639 else: | |
640 ext = ".txt" | |
641 ofn = "%s%s" % (entry.name.replace(".", "_"), ext) | |
642 dest = os.path.join(self.repdir, ofn) | |
643 src = os.path.join(self.tooloutdir,entry.name) | |
644 shutil.copyfile(src, dest) | |
645 | |
646 def run(self): | 608 def run(self): |
647 """ | 609 """ |
648 | 610 generate test outputs by running a command line |
611 won't work if command or test override in play - planemo is the | |
612 easiest way to generate test outputs for that case so is | |
613 automagically selected | |
649 """ | 614 """ |
650 s = "run cl=%s" % str(self.cl) | 615 s = "run cl=%s" % str(self.cl) |
651 | |
652 logging.debug(s) | 616 logging.debug(s) |
653 scl = " ".join(self.cl) | 617 scl = " ".join(self.cl) |
654 err = None | 618 err = None |
655 if self.args.parampass != "0": | 619 if self.args.parampass != "0": |
656 ste = open(self.elog, "wb") | 620 ste = open(self.elog, "wb") |
701 """ | 665 """ |
702 planemo shed_create --shed_target testtoolshed | 666 planemo shed_create --shed_target testtoolshed |
703 planemo shed_update --check_diff --shed_target testtoolshed | 667 planemo shed_update --check_diff --shed_target testtoolshed |
704 """ | 668 """ |
705 if os.path.exists(self.tlog): | 669 if os.path.exists(self.tlog): |
706 tout = open(self.tlog,'a') | 670 tout = open(self.tlog, "a") |
707 else: | 671 else: |
708 tout = open(self.tlog,'w') | 672 tout = open(self.tlog, "w") |
709 cll = ["planemo", "shed_create", "--shed_target", "local"] | 673 cll = ["planemo", "shed_create", "--shed_target", "local"] |
710 try: | 674 try: |
711 p = subprocess.run(cll, shell=False, cwd=self.tooloutdir, stdout=tout, stderr = tout) | 675 p = subprocess.run( |
676 cll, shell=True, cwd=self.tooloutdir, stdout=tout, stderr=tout | |
677 ) | |
712 except: | 678 except: |
713 pass | 679 pass |
714 if p.returncode != 0: | 680 if p.returncode != 0: |
715 print("Repository %s exists" % self.args.tool_name) | 681 print("Repository %s exists" % self.args.tool_name) |
716 else: | 682 else: |
727 "--shed_key", | 693 "--shed_key", |
728 self.args.toolshed_api_key, | 694 self.args.toolshed_api_key, |
729 "--tar", | 695 "--tar", |
730 self.newtarpath, | 696 self.newtarpath, |
731 ] | 697 ] |
732 print("Run", " ".join(cll)) | 698 p = subprocess.run(cll, shell=True) |
733 p = subprocess.run(cll, shell=False) | |
734 print("Ran", " ".join(cll), "got", p.returncode) | 699 print("Ran", " ".join(cll), "got", p.returncode) |
735 tout.close() | 700 tout.close() |
736 return p.returncode | 701 return p.returncode |
737 | 702 |
738 def planemo_test(self, genoutputs=True): | 703 def planemo_test(self, genoutputs=True): |
739 """planemo is a requirement so is available | 704 """planemo is a requirement so is available for testing |
705 and for generating test outputs if command or test overrides are supplied | |
706 test outputs are sent to repdir for display | |
740 """ | 707 """ |
741 xreal = "%s.xml" % self.tool_name | 708 xreal = "%s.xml" % self.tool_name |
742 if os.path.exists(self.tlog): | 709 if os.path.exists(self.tlog): |
743 tout = open(self.tlog,'a') | 710 tout = open(self.tlog, "a") |
744 else: | 711 else: |
745 tout = open(self.tlog,'w') | 712 tout = open(self.tlog, "w") |
746 if genoutputs: | 713 if genoutputs: |
747 cll = [ | 714 cll = [ |
748 "planemo", | 715 "planemo", |
749 "test", | 716 "test", |
750 "--galaxy_root", | 717 "--galaxy_root", |
751 self.args.galaxy_root, | 718 self.args.galaxy_root, |
752 "--update_test_data", | 719 "--update_test_data", |
720 "--galaxy_python_version", | |
721 "3.6", | |
722 "--no_conda_auto_install", | |
723 "--no_conda_auto_init", | |
753 xreal, | 724 xreal, |
754 ] | 725 ] |
755 else: | 726 else: |
756 cll = ["planemo", "test", "--galaxy_root", self.args.galaxy_root, xreal] | 727 cll = ["planemo", "test", "--galaxy_python_version", |
757 try: | 728 "3.6", "--galaxy_root", |
758 p = subprocess.run(cll, shell=False, cwd=self.tooloutdir, stderr=tout, stdout=tout) | 729 self.args.galaxy_root, |
759 except: | 730 "--no_conda_auto_install", |
760 pass | 731 "--no_conda_auto_init", |
732 xreal,] | |
733 p = subprocess.run( | |
734 cll, shell=True, cwd=self.tooloutdir, stderr=tout, stdout=tout | |
735 ) | |
736 if genoutputs: | |
737 with os.scandir(self.testdir) as outs: | |
738 for entry in outs: | |
739 if entry.is_file(): | |
740 dest = os.path.join(self.repdir, entry.name) | |
741 src = os.path.join(self.testdir, entry.name) | |
742 shutil.copyfile(src, dest) | |
743 tout.write( | |
744 "Copied output %s to %s after planemo test\n" % (src, dest) | |
745 ) | |
761 tout.close() | 746 tout.close() |
762 return p.returncode | 747 return p.returncode |
763 | 748 |
764 def eph_galaxy_load(self): | 749 def eph_galaxy_load(self): |
765 """ | 750 """load the new tool from the local toolshed after planemo uploads it |
766 """ | 751 """ |
767 if os.path.exists(self.tlog): | 752 if os.path.exists(self.tlog): |
768 tout = open(self.tlog,'a') | 753 tout = open(self.tlog, "a") |
769 else: | 754 else: |
770 tout = open(self.tlog,'w') | 755 tout = open(self.tlog, "w") |
771 cll = [ | 756 cll = [ |
772 "shed-tools", | 757 "shed-tools", |
773 "install", | 758 "install", |
774 "-g", | 759 "-g", |
775 self.args.galaxy_url, | 760 self.args.galaxy_url, |
797 print("installed %s" % self.args.tool_name) | 782 print("installed %s" % self.args.tool_name) |
798 tout.close() | 783 tout.close() |
799 return p.returncode | 784 return p.returncode |
800 | 785 |
801 def writeShedyml(self): | 786 def writeShedyml(self): |
787 """for planemo | |
788 """ | |
802 yuser = self.args.user_email.split("@")[0] | 789 yuser = self.args.user_email.split("@")[0] |
803 yfname = os.path.join(self.tooloutdir, ".shed.yml") | 790 yfname = os.path.join(self.tooloutdir, ".shed.yml") |
804 yamlf = open(yfname, "w") | 791 yamlf = open(yfname, "w") |
805 odict = { | 792 odict = { |
806 "name": self.tool_name, | 793 "name": self.tool_name, |
807 "owner": yuser, | 794 "owner": yuser, |
808 "type": "unrestricted", | 795 "type": "unrestricted", |
809 "description": self.args.tool_desc, | 796 "description": self.args.tool_desc, |
797 "synopsis": self.args.tool_desc, | |
798 "category": "TF Generated Tools", | |
810 } | 799 } |
811 yaml.dump(odict, yamlf, allow_unicode=True) | 800 yaml.dump(odict, yamlf, allow_unicode=True) |
812 yamlf.close() | 801 yamlf.close() |
813 | 802 |
814 | 803 def makeTool(self): |
815 def install_load(self): | 804 """write xmls and input samples into place |
816 _ = self.planemo_test(genoutputs=True) | 805 """ |
817 testres = self.planemo_test(genoutputs=False) | 806 self.makeXML() |
818 if testres == 0: | 807 if self.args.script_path: |
819 if self.args.make_Tool == "install": | 808 stname = os.path.join(self.tooloutdir, "%s" % (self.sfile)) |
820 self.planemo_shedload() | 809 if not os.path.exists(stname): |
821 self.eph_galaxy_load() | 810 shutil.copyfile(self.sfile, stname) |
822 else: | 811 xreal = "%s.xml" % self.tool_name |
823 os.stderr.write( | 812 xout = os.path.join(self.tooloutdir, xreal) |
824 "Planemo test failed - tool %s was not installed" % self.args.tool_name | 813 shutil.copyfile(xreal, xout) |
825 ) | 814 for p in self.infiles: |
815 pth = p[IPATHPOS] | |
816 dest = os.path.join(self.testdir, "%s_sample" % p[ICLPOS]) | |
817 shutil.copyfile(pth, dest) | |
818 dest = os.path.join(self.repdir, "%s.%s" % (p[ICLPOS], p[IFMTPOS])) | |
819 shutil.copyfile(pth, dest) | |
820 | |
821 def makeToolTar(self): | |
822 """ move outputs into test-data and prepare the tarball | |
823 """ | |
824 for p in self.outfiles: | |
825 src = p[ONAMEPOS] | |
826 if os.path.isfile(src): | |
827 dest = os.path.join(self.testdir, "%s_sample" % src) | |
828 shutil.copyfile(src, dest) | |
829 dest = os.path.join(self.repdir, "%s.%s" % (src, p[OFMTPOS])) | |
830 shutil.copyfile(src, dest) | |
831 else: | |
832 print( | |
833 "### problem - output file %s not found in tooloutdir %s" | |
834 % (src, self.tooloutdir) | |
835 ) | |
836 self.newtarpath = "toolfactory_%s.tgz" % self.tool_name | |
837 tf = tarfile.open(self.newtarpath, "w:gz") | |
838 tf.add(name=self.tooloutdir, arcname=self.tool_name) | |
839 tf.close() | |
840 shutil.copyfile(self.newtarpath, self.args.new_tool) | |
841 | |
842 def moveRunOutputs(self): | |
843 """need to move planemo or run outputs into toolfactory collection | |
844 """ | |
845 with os.scandir(self.tooloutdir) as outs: | |
846 for entry in outs: | |
847 if not entry.is_file() or entry.name.startswith("."): | |
848 continue | |
849 if "." in entry.name: | |
850 nayme, ext = os.path.splitext(entry.name) | |
851 else: | |
852 ext = ".txt" | |
853 ofn = "%s%s" % (entry.name.replace(".", "_"), ext) | |
854 dest = os.path.join(self.repdir, ofn) | |
855 src = os.path.join(self.tooloutdir, entry.name) | |
856 shutil.copyfile(src, dest) | |
857 | |
826 | 858 |
827 def main(): | 859 def main(): |
828 """ | 860 """ |
829 This is a Galaxy wrapper. It expects to be called by a special purpose tool.xml as: | 861 This is a Galaxy wrapper. It expects to be called by a special purpose tool.xml as: |
830 <command interpreter="python">rgBaseScriptWrapper.py --script_path "$scriptPath" | 862 <command interpreter="python">rgBaseScriptWrapper.py --script_path "$scriptPath" |
855 a("--parampass", default="positional") | 887 a("--parampass", default="positional") |
856 a("--tfout", default="./tfout") | 888 a("--tfout", default="./tfout") |
857 a("--new_tool", default="new_tool") | 889 a("--new_tool", default="new_tool") |
858 a("--runmode", default=None) | 890 a("--runmode", default=None) |
859 a("--galaxy_url", default="http://localhost:8080") | 891 a("--galaxy_url", default="http://localhost:8080") |
860 a("--galaxy_api_key", default="fbdd3c2eecd191e88939fffc02eeeaf8") | 892 a("--galaxy_api_key", default="fakekey") |
861 a("--toolshed_url", default="http://localhost:9009") | 893 a("--toolshed_url", default="http://localhost:9009") |
862 a("--toolshed_api_key", default="d46e5ed0e242ed52c6e1f506b5d7f9f7") | 894 a("--toolshed_api_key", default="fakekey") |
863 a("--galaxy_root", default="/home/ross/galaxy") | 895 a("--galaxy_root", default="/galaxy-central") |
864 | 896 |
865 args = parser.parse_args() | 897 args = parser.parse_args() |
866 assert not args.bad_user, ( | 898 assert not args.bad_user, ( |
867 'UNAUTHORISED: %s is NOT authorized to use this tool until Galaxy admin adds %s to "admin_users" in the Galaxy configuration file' | 899 'UNAUTHORISED: %s is NOT authorized to use this tool until Galaxy admin adds %s to "admin_users" in the Galaxy configuration file' |
868 % (args.bad_user, args.bad_user) | 900 % (args.bad_user, args.bad_user) |
876 for i, x in enumerate(args.additional_parameters): | 908 for i, x in enumerate(args.additional_parameters): |
877 args.additional_parameters[i] = args.additional_parameters[i].replace('"', "") | 909 args.additional_parameters[i] = args.additional_parameters[i].replace('"', "") |
878 r = ScriptRunner(args) | 910 r = ScriptRunner(args) |
879 r.writeShedyml() | 911 r.writeShedyml() |
880 r.makeTool() | 912 r.makeTool() |
881 if args.make_Tool == "runonly": | 913 if args.command_override or args.test_override: |
914 retcode = r.planemo_test(genoutputs=True) # this fails :( - see PR | |
915 r.moveRunOutputs() | |
916 r.makeToolTar() | |
917 retcode = r.planemo_test(genoutputs=False) | |
918 r.moveRunOutputs() | |
919 if args.make_Tool == "gentestinstall": | |
920 r.planemo_shedload() | |
921 r.eph_galaxy_load() | |
922 else: | |
882 retcode = r.run() | 923 retcode = r.run() |
883 if retcode: | 924 if retcode: |
884 sys.stderr.write( | 925 sys.stderr.write( |
885 "## Run failed with return code %d. Cannot build yet. Please fix and retry" | 926 "## Run failed with return code %d. Cannot build yet. Please fix and retry" |
886 % retcode | 927 % retcode |
887 ) | 928 ) |
888 sys.exit(1) | 929 sys.exit(1) |
889 else: | 930 else: |
890 r.moveRunOutputs() | 931 r.moveRunOutputs() |
891 elif args.make_Tool in ["gentestinstall", "generate", "gentest"]: | 932 r.makeToolTar() |
892 retcode = r.run() | 933 if args.make_Tool in ["gentestinstall", "gentest"]: |
893 if retcode: | 934 r.planemo_test(genoutputs=False) |
894 sys.stderr.write( | 935 r.moveRunOutputs() |
895 "## Run failed with return code %d. Cannot build yet. Please fix and retry" | 936 if args.make_Tool == "gentestinstall": |
896 % retcode | 937 r.planemo_shedload() |
897 ) | 938 r.eph_galaxy_load() |
898 sys.exit(1) | |
899 r.moveRunOutputs() | |
900 r.makeToolTar() | |
901 if args.make_Tool in ["gentestinstall","gentest"]: | |
902 r.planemo_test(genoutputs=False) | |
903 r.moveRunOutputs() | |
904 r.planemo_shedload() | |
905 r.eph_galaxy_load() | |
906 else: | |
907 retcode = r.planemo_test(genoutputs=True) # this fails :( | |
908 r.moveRunOutputs() | |
909 r.makeToolTar() | |
910 retcode = r.planemo_test(genoutputs=False) | |
911 r.moveRunOutputs() | |
912 if args.make_Tool == "planemotestinstall": | |
913 r.planemo_shedload() | |
914 r.eph_galaxy_load() | |
915 # if retcode: | |
916 # sys.exit(retcode) # indicate failure to job runner | |
917 | 939 |
918 | 940 |
919 if __name__ == "__main__": | 941 if __name__ == "__main__": |
920 main() | 942 main() |