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)
Beispiel #2
0
    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)
Beispiel #4
0
    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']
Beispiel #6
0
    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
Beispiel #7
0
    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)
Beispiel #8
0
    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)
Beispiel #9
0
    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()
Beispiel #13
0
    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']
Beispiel #15
0
    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'])
Beispiel #17
0
    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)
Beispiel #18
0
    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')
Beispiel #20
0
    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')
Beispiel #22
0
    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'
Beispiel #23
0
    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'
Beispiel #24
0
    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')
Beispiel #26
0
    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
Beispiel #27
0
    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
Beispiel #29
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
Beispiel #30
0
    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