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_multiline_output(tmpdir): wf = WorkflowGenerator() wf.set_documentation('Testing a multiline\ndocumentation string') tmpfile = os.path.join(str(tmpdir), 'test.cwl') wf.save(tmpfile, mode='abs') with open(tmpfile) as f: contents = f.readlines() assert len(contents) > 7
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_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_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
def test_save_with_wd(self, tmpdir): wf = WorkflowGenerator(working_dir=tmpdir.join('wd').strpath) 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 wf.save(wf_filename, mode='wd') actual = load_yaml(wf_filename) expected_wf_filename = 'tests/data/workflows/echo-wc_wd.cwl' expected = load_yaml(expected_wf_filename) print(' actual:', actual) print('expected:', expected) assert actual == expected
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 with pytest.warns(DeprecationWarning): wf.save(wf_filename, mode='inline') # save with inline=True should result in a packed workflow (that isn't # loaded). 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