def test_detect_wrong_type(self): wf = WorkflowGenerator() wf.load('tests/data/tools') x = wf.add_input(msg='string') x = 3 with pytest.raises(ValueError): wf.echo(message=x)
def test_load(self): wf = WorkflowGenerator() wf.load('tests/data/tools') step_keys = wf.steps_library.keys() step_keys.sort() assert step_keys == ['echo', 'wc']
def test_step_with_incompatible_input(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_input(wfmessage='string') with pytest.raises(ValueError): wced = wf.wc(file2count=wfmessage)
def test_step_with_compatible_step_output(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) wced = wf.wc(file2count=echoed)
def test_load(self): wf = WorkflowGenerator() wf.load('tests/data/tools') step_keys = wf.steps_library.steps.keys() step_keys = sorted(step_keys) assert step_keys == ['echo', 'multiple-out-args', 'wc']
def test_save_with_inline_tools(self, tmpdir): wf = WorkflowGenerator() wf.load('tests/data/tools') wf.set_documentation('Counts words of a message via echo and wc') wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) wced = wf.wc(file2count=echoed) wf.add_outputs(wfcount=wced) wf_filename = tmpdir.join('echo-wc.cwl').strpath wf.save(wf_filename, inline=True) # Strip absolute paths from ids actual = load_yaml(wf_filename) expected_wf_filename = 'tests/data/workflows/echo-wc_inline.cwl' expected = load_yaml(expected_wf_filename) # Random id's will differ and that's ok, so just remove them def remove_random_ids(step): del(step['outputs'][0]['outputBinding']['glob']) del(step['stdout']) remove_random_ids(actual['steps']['wc']['run']) remove_random_ids(actual['steps']['echo']['run']) remove_random_ids(expected['steps']['wc']['run']) remove_random_ids(expected['steps']['echo']['run']) print(' actual:', actual) print('expected:', expected) assert actual == expected
def test_optional_type(self): wf = WorkflowGenerator() wf.load('tests/data/tools') # This could work, if you pass a string for input, even if # the echo step requires an input. So we expect it to work. wfmessage = wf.add_input(message='string?') echod = wf.echo(message=wfmessage)
def test_step_with_incompatible_step_output(self): wf = WorkflowGenerator() wf.load('tests/data/tools') infile = wf.add_input(infile='File') wced = wf.wc(file2count=infile) with pytest.raises(ValueError): echoed = wf.echo(message=wced)
def test_scatter_method_incorrect(self): wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_inputs(wfmessages='string[]') with pytest.raises(ValueError): wf.echo(message=msgs, scatter='message', scatter_method='blah')
def test_step_with_compatible_input(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) wf.validate()
def test_scattered_step_with_scalar_input(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_input(message='string') with pytest.raises(ValueError): echoed = wf.echo(message=wfmessage, scatter='message', scatter_method='dotproduct')
def test_step_with_scattered_input_no_scatter_method(self): wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_input(wfmessages='string[]') wf.echo(message=msgs, scatter='message') wf.validate()
def test_missing_scatter_argument(self): wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_inputs(wfmessages='string[]') with pytest.raises(ValueError): wf.echo(message=msgs, scatter_method='nested_crossproduct')
def test_load_with_list(self): wf = WorkflowGenerator() wf.load(step_list=['tests/data/workflows/echo-wc.cwl', 'tests/data/tools']) # 'https://raw.githubusercontent.com/WhatWorksWhenForWhom/nlppln/develop/cwl/anonymize.cwl',\ step_keys = wf.steps_library.steps.keys() step_keys = sorted(step_keys) assert step_keys == ['echo', 'echo-wc', 'multiple-out-args', 'wc']
def test_step_with_scattered_step_output(self): wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_input(msgs='string[]') echoed = wf.echo(message=msgs, scatter='message', scatter_method='dotproduct') wced = wf.wc(file2count=echoed, scatter='file2count', scatter_method='dotproduct')
def test_missing_scatter_method_argument(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wf.load('tests/data/misc') msgs = wf.add_input(wfmessages='string[]') with pytest.raises(ValueError): wf.echo3(msg1=msgs, msg2=msgs, scatter=['msg1', 'msg2'])
def test_optional_to_optional_type(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wf_infiles = wf.add_input(in_files='File[]') wf_outdir = wf.add_input(out_dir='string?') wf_counselors = wf.add_input(counselors='string[]') out_files, meta_out = wf.multiple_out_args( in_files=wf_infiles, out_dir=wf_outdir, counselors=wf_counselors)
def test_validate_with_inline_tools(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) echoed2 = wf.echo(message=wfmessage) wf.add_outputs(echoed2=echoed2) wf.validate(inline=True)
def test_scatter_variable_incorrect(self): wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_input(wfmessages='string[]') with pytest.raises(ValueError): wf.echo( message=msgs, scatter='incorrect', scatter_method='nested_crossproduct')
def test_required_to_optional(self): wf = WorkflowGenerator() wf.load('tests/data/tools') # out_dir is optional, attaching to non-optional input # should work. wf_infiles = wf.add_input(in_files='File[]') wf_outdir = wf.add_input(out_dir='string') wf_counselors = wf.add_input(counselors='string[]') out_files, meta_out = wf.multiple_out_args( in_files=wf_infiles, out_dir=wf_outdir, counselors=wf_counselors)
def test_save_with_relative_url(self, tmpdir): wf = WorkflowGenerator() url = 'https://raw.githubusercontent.com/NLeSC/scriptcwl/master/' \ 'tests/data/tools/echo.cwl' wf.load(step_file=url) wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) wf.add_outputs(echoed=echoed) wf_filename = tmpdir.join('echo-wf.cwl').strpath wf.save(wf_filename, mode='rel')
def test_scatter_variable_correct(self): scatter_methods = [ 'dotproduct', 'nested_crossproduct', 'flat_crossproduct' ] wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_inputs(wfmessages='string[]') for method in scatter_methods: echoed = wf.echo(message=msgs, scatter='message', scatter_method=method) assert echoed == 'echo/echoed'
def test_scatter_method_correct(self): scatter_methods = [ 'dotproduct', 'nested_crossproduct', 'flat_crossproduct' ] for method in scatter_methods: wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_input(wfmessages='string[]') echoed = wf.echo( message=msgs, scatter='message', scatter_method=method) assert echoed.step_name == 'echo' assert echoed.output_name == 'echoed'
def test_add_shebang_to_saved_cwl_file(self, tmpdir): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_inputs(wfmessage='string') echoed = wf.echo(message=wfmessage) wced = wf.wc(file2count=echoed) wf.add_outputs(wfcount=wced) wf_filename = tmpdir.join('echo-wc.cwl').strpath wf.save(wf_filename) with open(wf_filename) as f: shebang = f.readline() assert shebang == '#!/usr/bin/env cwl-runner\n'
def test_save_with_wd_no_wd(self, tmpdir): wf = WorkflowGenerator() assert wf.get_working_dir() is None wf.load('tests/data/tools') wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) wced = wf.wc(file2count=echoed) wf.add_outputs(wfcount=wced) wf_filename = tmpdir.join('echo-wc.cwl').strpath with pytest.raises(ValueError): wf.save(wf_filename, mode='wd')
def test_save_with_workflow(self, tmpdir): wf = WorkflowGenerator() wf.load('tests/data/workflows') wfmessage = wf.add_inputs(wfmessage='string') wced = wf.echo_wc(wfmessage=wfmessage) wf.add_outputs(wfcount=wced) wf_filename = tmpdir.join('echo-wc.cwl').strpath wf.save(wf_filename) # make workflows contents relative to tests/data/tools directory actual = load_yaml(wf_filename, os.getcwd() + '/tests/data/workflows') expected_wf_filename = 'tests/data/echo-wc.workflowstep.cwl' expected = load_yaml(expected_wf_filename, '../workflows') assert actual == expected
def test_generate_step_name(self): wf = WorkflowGenerator() wf.load('tests/data/tools') wfmessage = wf.add_input(wfmessage='string') name = wf._generate_step_name('echo') echoed = wf.echo(message=wfmessage) assert name == 'echo' assert name == echoed.step_name name = wf._generate_step_name('echo') echoed2 = wf.echo(message=wfmessage) assert name != 'echo' assert name == echoed2.step_name
def test_save_with_pack(self, tmpdir): wf = WorkflowGenerator() wf.load('tests/data/tools') wf.set_documentation('Counts words of a message via echo and wc') wfmessage = wf.add_input(wfmessage='string') echoed = wf.echo(message=wfmessage) wced = wf.wc(file2count=echoed) wf.add_outputs(wfcount=wced) wf_filename = tmpdir.join('echo-wc.cwl').strpath wf.save(wf_filename, mode='pack') with WorkflowGenerator() as wf2: wf2.load(wf_filename) # wf_filename shouldn't be in the steps library, because it is a # packed workflow assert len(wf2.steps_library.steps.keys()) == 0
def test_save_with_scattered_step(self, tmpdir): wf = WorkflowGenerator() wf.load('tests/data/tools') msgs = wf.add_inputs(wfmessages='string[]') echoed = wf.echo(message=msgs, scatter='message', scatter_method='nested_crossproduct') wf.add_outputs(out_files=echoed) wf_filename = tmpdir.join('echo-scattered.cwl').strpath wf.save(wf_filename) # make workflows contents relative to tests/data/tools directory actual = load_yaml(wf_filename, os.getcwd() + '/tests/data/tools') expected_wf_filename = 'tests/data/echo.scattered.cwl' expected = load_yaml(expected_wf_filename, '../tools') assert actual == expected
def test_save_with_tools(self, tmpdir): wf = WorkflowGenerator() wf.load('tests/data/tools') wf.set_documentation('Counts words of a message via echo and wc') wfmessage = wf.add_inputs(wfmessage='string') echoed = wf.echo(message=wfmessage) wced = wf.wc(file2count=echoed) wf.add_outputs(wfcount=wced) wf_filename = tmpdir.join('echo-wc.cwl').strpath wf.save(wf_filename) # make workflows contents relative to tests/data/tools directory actual = load_yaml(wf_filename, os.getcwd() + '/tests/data/tools') expected_wf_filename = 'tests/data/workflows/echo-wc.cwl' expected = load_yaml(expected_wf_filename, '../tools') assert actual == expected