1 from contextlib import contextmanager
3 from StringIO import StringIO
8 from htsworkflow.submission import daf
9 from htsworkflow.util.rdfhelp import \
20 test_daf = """# Lab and general info
24 variables cell, antibody,sex,age,strain,control
25 compositeSuffix CaltechHistone
28 validationSettings validateFiles.bam:mismatches=2,bamPercent=99.9;validateFiles.fastq:quick=1000
30 # Track/view definition
32 longLabelPrefix Caltech Fastq Read 1
38 longLabelPrefix Caltech Histone Signal
44 class TestDAF(unittest.TestCase):
47 parsed = daf.fromstring(test_daf)
49 self.failUnlessEqual(parsed['assembly'], 'mm9')
50 self.failUnlessEqual(parsed['grant'], 'Hardison')
51 self.failUnlessEqual(len(parsed['variables']), 6)
52 self.failUnlessEqual(len(parsed['views']), 2)
53 self.failUnlessEqual(len(parsed['views']['FastqRd1']), 5)
54 self.failUnlessEqual(len(parsed['views']['Signal']), 5)
55 signal = parsed['views']['Signal']
56 self.failUnlessEqual(signal['required'], False)
57 self.failUnlessEqual(signal['longLabelPrefix'],
58 'Caltech Histone Signal')
62 parsed = daf.fromstring(test_daf)
63 #mem = RDF.Storage(storage_name='hashes',
64 # options_string='hash-type="memory"'),
65 mem = RDF.MemoryStorage()
66 model = RDF.Model(mem)
69 subNS = RDF.NS(str(submissionLog[name].uri))
70 daf.add_to_model(model, parsed, name)
72 signal_view_node = RDF.Node(subNS['/view/Signal'].uri)
74 writer = get_serializer()
75 turtle = writer.serialize_model_to_string(model)
77 self.failUnless(str(signal_view_node.uri) in turtle)
79 statements = list(model.find_statements(
81 signal_view_node, None, None)))
82 self.failUnlessEqual(len(statements), 6)
83 name = model.get_target(signal_view_node, dafTermOntology['name'])
84 self.failUnlessEqual(fromTypedNode(name), u'Signal')
86 def load_daf_mapper(name, extra_statements=None):
90 if extra_statements is not None:
91 parser = RDF.Parser(name='turtle')
92 parser.parse_string_into_model(model, extra_statements,
95 test_daf_stream = StringIO(test_daf)
96 mapper = daf.DAFMapper(name, daf_file = test_daf_stream, model=model)
99 def dump_model(model):
100 writer = get_serializer()
101 turtle = writer.serialize_model_to_string(model)
104 class TestDAFMapper(unittest.TestCase):
105 def test_create_mapper_add_pattern(self):
107 mapper = load_daf_mapper(name)
108 pattern = '.bam\Z(?ms)'
109 mapper.add_pattern('Signal', pattern)
111 s = RDF.Statement(daf.get_view_namespace(name)['Signal'],
112 dafTermOntology['filename_re'],
114 search = list(mapper.model.find_statements(s))
115 self.failUnlessEqual(len(search), 1)
116 self.failUnlessEqual(str(search[0].subject),
117 str(submissionLog['testsub/view/Signal']))
118 self.failUnlessEqual(str(search[0].predicate),
119 str(dafTermOntology['filename_re']))
120 #self.failUnlessEqual(search[0].object.literal_value['string'], pattern)
122 def test_find_one_view(self):
123 extra = '''@prefix dafTerm:<http://jumpgate.caltech.edu/wiki/UcscDaf#> .
125 <%(submissionLog)s/testfind/view/Signal> dafTerm:filename_re ".*\\\\.bam" .
126 <%(submissionLog)s/testfind/view/FastqRd1> dafTerm:filename_re ".*_r1\\\\.fastq" .
127 ''' % {'submissionLog': 'http://jumpgate.caltech.edu/wiki/SubmissionsLog'}
129 daf_mapper = load_daf_mapper('testfind', extra_statements = extra)
131 view = daf_mapper.find_view('filename_r1.fastq')
132 self.failUnlessEqual(str(view),
133 str(submissionLog['testfind/view/FastqRd1']))
135 #writer = get_serializer()
136 #turtle = writer.serialize_model_to_string(model)
139 def test_find_overlapping_view(self):
140 extra = '''@prefix dafTerm:<http://jumpgate.caltech.edu/wiki/UcscDaf#> .
142 <%(submissionLog)s/testfind/view/fastq> dafTerm:filename_re ".*\\\\.fastq" .
143 <%(submissionLog)s/testfind/view/FastqRd1> dafTerm:filename_re ".*_r1\\\\.fastq" .
144 ''' % {'submissionLog': 'http://jumpgate.caltech.edu/wiki/SubmissionsLog'}
146 daf_mapper = load_daf_mapper('testfind', extra_statements = extra)
148 self.failUnlessRaises(daf.ModelException,
149 daf_mapper.find_view,
152 def test_find_attributes(self):
154 lib_url = 'http://jumpgate.caltech.edu/library/%s/' %(lib_id)
155 extra = '''@prefix dafTerm: <http://jumpgate.caltech.edu/wiki/UcscDaf#> .
156 @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
158 <%(submissionLog)s/testfind/view/Signal> dafTerm:filename_re ".*\\\\.bam" .
159 <%(submissionLog)s/testfind/view/FastqRd1> dafTerm:filename_re ".*\\\\.fastq" .
160 <%(libUrl)s> <%(libraryOntology)sgel_cut> "100"^^xsd:decimal .
161 ''' % {'submissionLog': 'http://jumpgate.caltech.edu/wiki/SubmissionsLog',
162 'libraryOntology': 'http://jumpgate.caltech.edu/wiki/LibraryOntology#',
165 daf_mapper = load_daf_mapper('testfind', extra)
166 libNode = RDF.Node(RDF.Uri(lib_url))
167 daf_mapper._add_library_details_to_model(libNode)
168 gel_cut = daf_mapper._get_library_attribute(libNode, 'gel_cut')
169 # make sure we can override attributes, the value in our
170 # server is 500 for this library
171 self.failUnlessEqual(gel_cut, 100)
173 species = daf_mapper._get_library_attribute(libNode, 'species')
174 self.failUnlessEqual(species, "Homo sapiens")
176 with mktempdir('analysis') as analysis_dir:
177 path, analysis_name = os.path.split(analysis_dir)
178 with mktempfile('.bam', dir=analysis_dir) as filename:
179 print 'dir', os.listdir(analysis_dir)
180 daf_mapper.construct_file_attributes(analysis_dir,
184 sub_root = "http://jumpgate.caltech.edu/wiki/SubmissionsLog/testfind/"
185 submission_name = sub_root + analysis_name
186 source = daf_mapper.model.get_source(rdfNS['type'], submissionOntology['submission'])
188 self.failUnlessEqual(str(source.uri), submission_name)
190 view_name = submission_name + '/Signal'
191 view = daf_mapper.model.get_target(source, submissionOntology['has_view'])
192 self.failUnlessEqual(str(view.uri), view_name)
194 def test_library_url(self):
195 daf_mapper = load_daf_mapper('urltest')
197 self.failUnlessEqual(daf_mapper.library_url,
198 'http://jumpgate.caltech.edu/library/')
199 daf_mapper.library_url = 'http://google.com'
200 self.failUnlessEqual(daf_mapper.library_url, 'http://google.com' )
203 def mktempdir(prefix='tmp'):
204 d = tempfile.mkdtemp(prefix=prefix)
211 def mktempfile(suffix='', prefix='tmp', dir=None):
212 fd, pathname = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir)
214 print "made", pathname
217 print "unmade", pathname
220 suite = unittest.makeSuite(TestDAF, 'test')
221 suite.addTest(unittest.makeSuite(TestDAFMapper, 'test'))
224 if __name__ == "__main__":
225 unittest.main(defaultTest='suite')