def sh_script(self, context, **args): if 'echo_name' in args and args['echo_name']: echo_part="\n# step %s:\n" % self.name echo_part+="echo step %s 1>&2" % self.name else: echo_part='' try: usage=self.usage(context) except KeyError as ke: raise ConfigError("missing config item '%s'" % ke) # check for missing attrs after calling step.usage() missing_attrs=self.missing_required_attrs() if len(missing_attrs) > 0: raise ConfigError("step %s: missing attributes: %s" % (self.name, ', '.join(missing_attrs))) vars={} vars.update(self.__dict__) vars.update(self.pipeline.readset) if not self.is_prov_step: vars.update(self.pipeline[self.name]) vars['inputs']=context.inputs[self.name] vars['outputs']=context.outputs[self.name] vars['pipeline']=self.pipeline vars['pipeline_run_id']=context.pipeline_run_id #vars['step_run_id']=context.step_runs[self.name].id #vars['next_step_run_id']=context.step_runs[self.pipeline.step_after(step.name)].id vars['config']=RnaseqGlobals.config vars['readset']=self.pipeline.readset # need to add shell variables for 'set': (in cufflinks.s_?.sh scripts) # currently root_dir, programs, reads_file, ID, format, readlen # but really, the pipeline should specify these? # or only things that are truly universal vars['root_dir']=RnaseqGlobals.root_dir() # add readset exports: readset=self.pipeline.readset for attr in readset.exports: try: vars[attr]=getattr(readset, attr) except AttributeError: vars[attr]='' #warn("%s.sh_script: no '%s' readset attribute!" % (self.name, attr)) # add self.exports: try: export_list=self.exports except: export_list=[] for attr in export_list: vars[attr]=getattr(self,attr) try: script_part=evoque_template(usage, vars) except Exception as e: raise ConfigError("step %s: %s" % (self.name, e)) script="\n".join([echo_part,script_part]) # tried using echo_part+sh_script, got weird '>' -> '>' substitutions return script
def test_missing_value(self): template="This has a ${missing} value" vars={'not_missing':1} try: string=evoque_template(template, vars) self.fail() except exceptions.NameError as e: # warn("caught %s (%s)" % (e, type(e))) self.assertRegexpMatches(str(e), "name 'missing' is not defined")
def evoque_fields(self): vars=self.__dict__ vars.update(RnaseqGlobals.conf_value('rnaseq')) for a in dir(self): if a.startswith('__'): continue attr=getattr(self,a) if type(attr) != type(''): continue if not re.search('\$\{', attr): continue try: setattr(self, a, evoque_template(attr, vars)) except NameError: pass return self
def load_glob(self,yml,filename): try: reads_files=yml['reads_file'] except KeyError: try: reads_files=yml['reads_files'] except KeyError: raise ConfigError("%s: readset does not define reads_file(s)" % filename) # get the reads directory, if present try: reads_dir=yml['reads_dir'] except KeyError: reads_dir=os.getcwd() # fixme: hope this is right thing to do # hack? reads_dir=evoque_template(reads_dir, RnaseqGlobals.config['rnaseq']) # in case of ${root_dir} #print "lg: reads_dir is %s" % reads_dir files=[] globlist=re.split('[\s,]+',reads_files) missing=[] for fglob in globlist: if not os.path.isabs(fglob): fglob=os.path.normpath(os.path.join(reads_dir, fglob)) filelist=glob.glob(fglob) if len(files)==0: missing.append("%s: no matching files for %s" % (filename, fglob)) files.extend(filelist) if len(files)==0: msg=", ".join(missing) raise ConfigError(msg) # Make the Readset object: #print "load_glob: files is %s" % files scalars=scalar_values(yml) scalars['filename']=filename scalars['reads_files']=files return [Readset(scalars)]
def test_basic(self): template="This is a ${adjective} template" vars={'adjective': 'simple'} string=evoque_template(template, vars) self.assertEqual(string, 'This is a simple template')
def output_list_expanded(self): l=[evoque_template(x, self, self.pipeline.readset) for x in self.output_list()] return l