comparison rgToolFactory.py @ 12:d12728e33c3d

Changed to deliver a gz file - requires a new datatypes_conf.xml entry: <datatype extension="gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /> There's some wierd shit going on with filter values and such but it now all appears to be working ok
author ross lazarus ross.lazarus@gmail.com
date Sun, 03 Jun 2012 15:39:20 +1000
parents 71f2ac0eee95
children 7725e4ab27e1
comparison
equal deleted inserted replaced
11:a0a5d0757e39 12:d12728e33c3d
65 self.script = s 65 self.script = s
66 self.myname = sys.argv[0] # get our name because we write ourselves out as a tool later 66 self.myname = sys.argv[0] # get our name because we write ourselves out as a tool later
67 self.pyfile = self.myname # crude but efficient - the cruft won't hurt much 67 self.pyfile = self.myname # crude but efficient - the cruft won't hurt much
68 self.xmlfile = '%s.xml' % self.toolname 68 self.xmlfile = '%s.xml' % self.toolname
69 self.sfile = '%s.%s' % (self.toolname,opts.interpreter) 69 self.sfile = '%s.%s' % (self.toolname,opts.interpreter)
70 if opts.output_dir or self.opts.make_Tool: # may not want these complexities 70 if opts.output_dir: # may not want these complexities
71 self.tlog = os.path.join(opts.output_dir,"%s_runner.log" % self.toolname) 71 self.tlog = os.path.join(opts.output_dir,"%s_runner.log" % self.toolname)
72 artifactpath = os.path.join(opts.output_dir,'%s_run.script' % self.toolname) 72 artifactpath = os.path.join(opts.output_dir,'%s_run.script' % self.toolname)
73 artifact = open(artifactpath,'w') 73 artifact = open(artifactpath,'w')
74 artifact.write(self.script) 74 artifact.write(self.script)
75 artifact.write('\n') 75 artifact.write('\n')
76 artifact.close() 76 artifact.close()
77 if opts.make_Tool: # need this code and the user script for the tarball
77 localscript = open(self.sfile,'w') 78 localscript = open(self.sfile,'w')
78 localscript.write(self.script) 79 localscript.write(self.script)
79 localscript.close() 80 localscript.close()
80 shutil.copyfile(self.myname,'%s.py' % self.toolname) # for tool and for user 81 shutil.copyfile(self.myname,'%s.py' % self.toolname) # for tool and for user
81 localpy = open('%s.py' % self.toolname,'w')
82 localpy.write(open(self.myname,'r').read())
83 self.cl = [] 82 self.cl = []
84 self.html = [] 83 self.html = []
85 a = self.cl.append 84 a = self.cl.append
86 a(opts.interpreter) 85 a(opts.interpreter)
87 a('-') # use stdin 86 a('-') # use stdin
88 if opts.input_tab: 87 a(opts.input_tab)
89 a(opts.input_tab) 88 a(opts.output_tab)
90 if opts.output_tab:
91 a(opts.output_tab)
92 self.outFormats = 'tabular' # TODO make this an option at tool generation time 89 self.outFormats = 'tabular' # TODO make this an option at tool generation time
93 self.inputFormats = 'tabular' # TODO make this an option at tool generation time 90 self.inputFormats = 'tabular' # TODO make this an option at tool generation time
94 91
95 92
96 def makeXML(self): 93 def makeXML(self):
132 xdict['tooldesc'] = '<description>%s</description>' % self.opts.tool_desc 129 xdict['tooldesc'] = '<description>%s</description>' % self.opts.tool_desc
133 else: 130 else:
134 xdict['tooldesc'] = '' 131 xdict['tooldesc'] = ''
135 xdict['command_outputs'] = '' 132 xdict['command_outputs'] = ''
136 xdict['outputs'] = '' 133 xdict['outputs'] = ''
137 if self.opts.input_tab: 134 if self.opts.input_tab <> 'None':
138 xdict['command_inputs'] = '--input_tab "$input1"' 135 xdict['command_inputs'] = '--input_tab "$input1"'
139 xdict['inputs'] = '<param name="input1" type="data" format="%s" label="Select a suitable input file from your history"/>' % self.inputFormats 136 xdict['inputs'] = '<param name="input1" type="data" format="%s" label="Select a suitable input file from your history"/>' % self.inputFormats
140 else: 137 else:
141 xdict['command_inputs'] = '' # assume no input - eg a random data generator 138 xdict['command_inputs'] = '' # assume no input - eg a random data generator
142 xdict['inputs'] = '' 139 xdict['inputs'] = ''
146 xdict['interpreter'] = self.opts.interpreter 143 xdict['interpreter'] = self.opts.interpreter
147 xdict['scriptname'] = self.sfile 144 xdict['scriptname'] = self.sfile
148 if self.opts.make_HTML: 145 if self.opts.make_HTML:
149 xdict['command_outputs'] += '--output_dir "$html_file.files_path" --output_html "$html_file" --make_HTML "yes"' 146 xdict['command_outputs'] += '--output_dir "$html_file.files_path" --output_html "$html_file" --make_HTML "yes"'
150 xdict['outputs'] += '<data format="html" name="html_file" label="${job_name}.html"/>\n' 147 xdict['outputs'] += '<data format="html" name="html_file" label="${job_name}.html"/>\n'
151 if self.opts.output_tab: 148 if self.opts.output_tab <> 'None':
152 xdict['command_outputs'] += '--output_tab "$tab_file"' 149 xdict['command_outputs'] += '--output_tab "$tab_file"'
153 xdict['outputs'] += '<data format="%s" name="tab_file" label="${job_name}"/>\n' % self.outFormats 150 xdict['outputs'] += '<data format="%s" name="tab_file" label="${job_name}"/>\n' % self.outFormats
154 xdict['command'] = newCommand % xdict 151 xdict['command'] = newCommand % xdict
155 xmls = newXML % xdict 152 xmls = newXML % xdict
156 xf = open(self.xmlfile,'w') 153 xf = open(self.xmlfile,'w')
170 print >> sys.stderr,'## Run failed. Cannot build yet. Please fix and retry' 167 print >> sys.stderr,'## Run failed. Cannot build yet. Please fix and retry'
171 sys.exit(1) 168 sys.exit(1)
172 self.makeXML() 169 self.makeXML()
173 tdir = self.toolname 170 tdir = self.toolname
174 os.mkdir(tdir) 171 os.mkdir(tdir)
175 if self.opts.input_tab: # we may have test data? 172 if self.opts.input_tab <> 'None': # we may have test data?
176 testdir = os.path.join(tdir,'test-data') 173 testdir = os.path.join(tdir,'test-data')
177 os.mkdir(testdir) # make tests directory 174 os.mkdir(testdir) # make tests directory
178 shutil.copyfile(self.opts.input_tab,os.path.join(testdir,'test1_in.tab')) 175 shutil.copyfile(self.opts.input_tab,os.path.join(testdir,'test1_in.tab'))
179 if self.opts.output_tab: 176 if self.opts.output_tab <> 'None':
180 shutil.copyfile(self.opts.output_tab,os.path.join(testdir,'test1_out.tab')) 177 shutil.copyfile(self.opts.output_tab,os.path.join(testdir,'test1_out.tab'))
181 if self.opts.make_HTML: 178 if self.opts.make_HTML:
182 shutil.copyfile(self.opts.output_html,os.path.join(testdir,'test1_out.html')) 179 shutil.copyfile(self.opts.output_html,os.path.join(testdir,'test1_out.html'))
183 shutil.copyfile(self.opts.tlog,os.path.join(testdir,'test1_out.log')) 180 if self.opts.output_dir:
181 shutil.copyfile(self.tlog,os.path.join(testdir,'test1_out.log'))
184 shutil.copyfile(self.xmlfile,os.path.join(tdir,self.xmlfile)) 182 shutil.copyfile(self.xmlfile,os.path.join(tdir,self.xmlfile))
185 shutil.copyfile(self.pyfile,os.path.join(tdir,'%s.py' % self.toolname)) 183 shutil.copyfile(self.pyfile,os.path.join(tdir,'%s.py' % self.toolname))
186 shutil.copyfile(self.sfile,os.path.join(tdir,self.sfile)) 184 shutil.copyfile(self.sfile,os.path.join(tdir,self.sfile))
187 tarpath = "%s.gz" % self.toolname 185 tarpath = "%s.gz" % self.toolname
188 tar = tarfile.open(tarpath, "w:gz") 186 tar = tarfile.open(tarpath, "w:gz")
189 tar.add(tdir,arcname=self.toolname) 187 tar.add(tdir,arcname=self.toolname)
190 tar.close() 188 tar.close()
189 shutil.copy(tarpath,self.opts.new_tool)
191 shutil.rmtree(tdir) 190 shutil.rmtree(tdir)
192 self.makeHtml() # call this to return the new gzip inside the autogenerated html file
193 ## TODO: replace with optional direct upload to local toolshed? 191 ## TODO: replace with optional direct upload to local toolshed?
194 return retval 192 return retval
195 193
196 def compressPDF(self,inpdf=None,thumbformat='png'): 194 def compressPDF(self,inpdf=None,thumbformat='png'):
197 """need absolute path to pdf 195 """need absolute path to pdf
292 290
293 291
294 def run(self): 292 def run(self):
295 """ 293 """
296 """ 294 """
297 if self.opts.output_dir or self.opts.make_Tool: 295 if self.opts.output_dir:
298 sto = open(self.tlog,'w') 296 sto = open(self.tlog,'w')
299 p = subprocess.Popen(' '.join(self.cl),shell=True,stdout=sto,stderr=sto,stdin=subprocess.PIPE,cwd=self.opts.output_dir) 297 p = subprocess.Popen(' '.join(self.cl),shell=True,stdout=sto,stderr=sto,stdin=subprocess.PIPE,cwd=self.opts.output_dir)
300 else: 298 else:
301 p = subprocess.Popen(' '.join(self.cl),shell=True,stdin=subprocess.PIPE) 299 p = subprocess.Popen(' '.join(self.cl),shell=True,stdin=subprocess.PIPE)
302 p.stdin.write(self.script) 300 p.stdin.write(self.script)
303 p.stdin.close() 301 p.stdin.close()
304 retval = p.wait() 302 retval = p.wait()
305 if self.opts.make_HTML or self.opts.make_Tool: 303 if self.opts.output_dir:
306 sto.close() 304 sto.close()
305 if self.opts.make_HTML:
307 self.makeHtml() 306 self.makeHtml()
308 return retval 307 return retval
309 308
310 309
311 def main(): 310 def main():
319 a('--script_path',default=None) 318 a('--script_path',default=None)
320 a('--tool_name',default=None) 319 a('--tool_name',default=None)
321 a('--interpreter',default=None) 320 a('--interpreter',default=None)
322 a('--output_dir',default=None) 321 a('--output_dir',default=None)
323 a('--output_html',default=None) 322 a('--output_html',default=None)
324 a('--input_tab',default=None) 323 a('--input_tab',default="None")
325 a('--output_tab',default=None) 324 a('--output_tab',default="None")
326 a('--user_email',default=None) 325 a('--user_email',default=None)
327 a('--bad_user',default=None) 326 a('--bad_user',default=None)
328 a('--make_Tool',default=None) 327 a('--make_Tool',default=None)
329 a('--make_HTML',default=None) 328 a('--make_HTML',default=None)
330 a('--help_text',default=None) 329 a('--help_text',default=None)
331 a('--tool_desc',default=None) 330 a('--tool_desc',default=None)
331 a('--new_tool',default=None)
332 opts, args = op.parse_args() 332 opts, args = op.parse_args()
333 assert not opts.bad_user,'%s is NOT authorized to use this tool. Please ask your friendly admin' % opts.bad_user 333 assert not opts.bad_user,'%s is NOT authorized to use this tool. Please ask your friendly admin' % opts.bad_user
334 assert opts.tool_name,'## Tool Factory expects a tool name - eg --tool_name=DESeq' 334 assert opts.tool_name,'## Tool Factory expects a tool name - eg --tool_name=DESeq'
335 assert opts.interpreter,'## Tool Factory wrapper expects an interpreter - eg --interpreter=Rscript' 335 assert opts.interpreter,'## Tool Factory wrapper expects an interpreter - eg --interpreter=Rscript'
336 assert os.path.isfile(opts.script_path),'## Tool Factory wrapper expects a script path - eg --script_path=foo.R' 336 assert os.path.isfile(opts.script_path),'## Tool Factory wrapper expects a script path - eg --script_path=foo.R'