Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
'''Test workdir option for runtime environment'''
import tempfile
tdir = tempfile.mkdtemp()
with open(os.path.join(tdir, 'aaa.pp'), 'w') as aaa:
aaa.write('something')
script = r"""
import os
[0]
task: workdir={0!r}
with open(os.path.join({1!r}, 'result.txt'), 'w') as res:
for file in os.listdir({1!r}):
res.write(file + '\n')
""".format(os.path.split(tdir)[0],
os.path.split(tdir)[1])
wf = SoS_Script(script).workflow()
env.config['sig_mode'] = 'force'
Base_Executor(wf, config={'default_queue': 'localhost'}).run()
with open(os.path.join(tdir, 'result.txt')) as res:
content = [x.strip() for x in res.readlines()]
self.assertTrue('aaa.pp' in content)
def testBash(self):
'''Test action bash'''
script = SoS_Script(r'''
[0]
bash:
echo 'Echo'
''')
wf = script.workflow()
Base_Executor(wf).run()
script = SoS_Script(r'''
[0]
bash:
echo 'Echo
''')
wf = script.workflow()
self.assertRaises(Exception, Base_Executor(wf).run)
def testProgressBar(self):
'''Test progress bar'''
env.verbosity = 1
#
script = SoS_Script('''
[1]
[2]
[3]
[4]
[5]
''')
wf = script.workflow()
Base_Executor(wf).run()
def testChainedDepends(self):
'''Test chain dependent'''
script = SoS_Script(r'''
# this step provides variable `var`
[index: provides='{filename}.bam.bai']
input: f"{filename}.bam"
run: expand=True
echo "Generating {_output}"
touch {_output}
[call: provides='{filename}.vcf']
input: f"{filename}.bam"
depends: f"{_input}.bai"
run: expand=True
echo "Calling variants from {_input} with {_depends} to {_output}"
touch {_output}
''')
if file_target('a.bam.bai').exists():
file_target('a.bam.bai').unlink()
def testTrunkSizeWithStopIf(self):
'''Test a case when some tasks are not submitted due to holes in slots #1159'''
for i in range(5):
f = f'{i+1}.txt'
if os.path.isfile(f):
os.remove(f)
script = SoS_Script('''\
[1]
output: [f'{x+1}.txt' for x in range(5)]
for i in range(5):
name = f'{i+1}.txt'
if i not in [0,1,2]:
path(name).touch()
else:
with open(name, 'w') as f:
f.write('test it')
[2]
input: group_by = 1
output: f'{_input:n}.out'
stop_if(_input.stat().st_size==0, no_output=True)
task: trunk_size = 80
script.workflow()
#
# script with first-line indent
#
script = SoS_Script('''
[0]
sh:
echo "a"
sh('echo "b"')
''')
script.workflow()
#
# script with triple quote and format string
# #1211
script = SoS_Script('''
[1]
python3: expand = "${ }"
ld = ${'100'}
a = """doc"""
''')
wf = script.workflow()
Base_Executor(wf).run()
script = SoS_Script('''
[default]
report: expand = "${ }"
ld_file = ${_input['']:r}
""" \'\'\'
{}, ${_output:r},
files = ['a.txt', 'b.txt']
vars = [1, 2]
input: files, paired_with='vars', group_by=1
output: f"{_input}{_vars[0]}"
run: expand=True
touch {_output}
''')
wf = script.workflow()
Base_Executor(wf).run()
for ofile in ['a.txt1', 'b.txt2']:
self.assertTrue(file_target(ofile).target_exists('target'))
file_target(ofile).unlink()
#
# list input
script = SoS_Script(r'''
[0]
files = ['a.txt', 'b.txt']
vars = [1, 2]
vars2 = ['a', 'b']
input: files, paired_with=('vars', 'vars2'), group_by=1
output: f"{_input}{_vars[0]}"
run: expand=True
touch {_output}
''')
wf = script.workflow()
Base_Executor(wf).run()
for ofile in ['a.txt1', 'b.txt2']:
self.assertTrue(file_target(ofile).target_exists('target'))
file_target(ofile).unlink()
#
def testTypeTraitParameter(self):
# type trait
script = SoS_Script('''
parameter: b
[0]
''')
wf = script.workflow()
Base_Executor(wf, args=['--b', '5']).run(mode='dryrun')
self.assertEqual(env.sos_dict['b'], '5')
#
script = SoS_Script('''
parameter: b :str
[0]
''')
wf = script.workflow()
Base_Executor(wf, args=['--b', '5']).run(mode='dryrun')
self.assertEqual(env.sos_dict['b'], '5')
#
script = SoS_Script('''
parameter: b : list
[0]
''')
wf = script.workflow()
Base_Executor(wf, args=['--b', '5']).run(mode='dryrun')
self.assertEqual(env.sos_dict['b'], ['5'])
#
executed = []
input: ['a{}.txt'.format(x) for x in range(1, 10)], group_by=3
executed.append(_input)
''')
wf = script.workflow()
Base_Executor(wf).run(mode='dryrun')
self.assertEqual(env.sos_dict['executed'], [
sos_targets('a1.txt', 'a2.txt', 'a3.txt'),
sos_targets('a4.txt', 'a5.txt', 'a6.txt'),
sos_targets('a7.txt', 'a8.txt', 'a9.txt')
])
# group_by chunks specified as integer strings
script = SoS_Script('''
[0: shared='executed']
executed = []
input: ['a{}.txt'.format(x) for x in range(1, 10)], group_by='3'
executed.append(_input)
''')
wf = script.workflow()
Base_Executor(wf).run(mode='dryrun')
self.assertEqual(env.sos_dict['executed'], [
sos_targets('a1.txt', 'a2.txt', 'a3.txt'),
sos_targets('a4.txt', 'a5.txt', 'a6.txt'),
sos_targets('a7.txt', 'a8.txt', 'a9.txt')
])
# number of files should be divisible by group_by
def testPython(self):
'''Test python command. This might fail if python3 is the
default interpreter'''
script = SoS_Script(r'''
[0]
python: expand='${ }'
a = {'1': 2}
print(a)
''')
wf = script.workflow()
Base_Executor(wf).run()