コード例 #1
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_run_logcmd():
    test_script = textwrap.dedent("""
    #!/usr/bin/env bash
    echo output $@
    exit 0
    """).strip()

    expcmd = './script.sh 1 2 3\n'
    expstdout = 'output 1 2 3\n'

    with tempdir.tempdir():
        mkexec('script.sh', test_script)

        with open('my_stdout', 'wt') as stdoutf:
            stdout = run.run('./script.sh 1 2 3', log={'cmd': stdoutf})

        assert stdout == expstdout
        assert open('my_stdout', 'rt').read() == expcmd

        with open('my_stdout', 'wt') as stdoutf:
            stdout = run.run('./script.sh 1 2 3',
                             log={
                                 'cmd': stdoutf,
                                 "stdout": stdoutf
                             })

        assert stdout == expstdout
        assert open('my_stdout', 'rt').read() == expcmd + expstdout
コード例 #2
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_run_tee():
    test_script = textwrap.dedent("""
    #!/bin/bash

    echo "standard output - arguments: $@"
    echo "standard error" >&2
    exit 0
    """).strip()

    with tempdir.tempdir():
        mkexec('script.sh', test_script)

        expstdout = "standard output - arguments: 1 2 3\n"
        expstderr = "standard error\n"

        capture = CaptureStdout()

        with capture:
            stdout = run.run('./script.sh 1 2 3', log={'tee': True})

        assert stdout == expstdout
        assert capture.stdout == expstdout

        with capture.reset():
            stdout, stderr = run.run('./script.sh 1 2 3',
                                     stderr=True,
                                     log={'tee': True})

        assert stdout == expstdout
        assert stderr == expstderr
        assert capture.stdout == expstdout
        assert capture.stderr == expstderr

        with capture.reset():
            stdout, stderr, ret = run.run('./script.sh 1 2 3',
                                          stderr=True,
                                          exitcode=True,
                                          log={'tee': True})

        assert ret == 0
        assert stdout == expstdout
        assert stderr == expstderr
        assert capture.stdout == expstdout
        assert capture.stderr == expstderr

        with capture.reset():
            stdout, ret = run.run('./script.sh 1 2 3',
                                  exitcode=True,
                                  log={'tee': True})

        assert ret == 0
        assert stdout == expstdout
        assert capture.stdout == expstdout
コード例 #3
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_run_streams():
    """
    """

    test_script = textwrap.dedent("""
    #!/usr/bin/env bash
    echo standard output
    echo standard error >&2
    exit 0
    """).strip()

    expstdout = 'standard output\n'
    expstderr = 'standard error\n'

    with tempdir.tempdir():
        mkexec('./script.sh', test_script)

        with open('my_stdout', 'wt') as stdout, \
             open('my_stderr', 'wt') as stderr:

            stdout, stderr = run.run('./script.sh',
                                     stderr=True,
                                     log={
                                         'stdout': stdout,
                                         'stderr': stderr
                                     })

        assert stdout == expstdout
        assert stderr == expstderr
        assert open('my_stdout', 'rt').read() == expstdout
        assert open('my_stderr', 'rt').read() == expstderr

        capture = CaptureStdout()

        with open('my_stdout', 'wt') as stdout, \
             open('my_stderr', 'wt') as stderr, \
             capture.reset():

            stdout, stderr = run.run('./script.sh',
                                     stderr=True,
                                     log={
                                         'tee': True,
                                         'stdout': stdout,
                                         'stderr': stderr
                                     })

        assert stdout == expstdout
        assert stderr == expstderr
        assert capture.stdout == expstdout
        assert capture.stderr == expstderr
        assert open('my_stdout', 'rt').read() == expstdout
        assert open('my_stderr', 'rt').read() == expstderr
コード例 #4
0
def test_func_to_cmd():
    cwd = os.getcwd()
    with tempdir():
        for tmp_dir in (None, '.'):
            for clean in ('never', 'on_success', 'always'):
                for verbose in (False, True):
                    cmd = fslsub.func_to_cmd(_good_func,
                                             clean=clean,
                                             tmp_dir=tmp_dir,
                                             verbose=verbose)
                    fn = cmd.split()[-1]
                    assert op.exists(fn)
                    stdout, stderr, exitcode = run.run(cmd,
                                                       exitcode=True,
                                                       stdout=True,
                                                       stderr=True,
                                                       env={"PYTHONPATH": cwd})
                    assert exitcode == 0
                    if clean == 'never':
                        assert op.exists(
                            fn
                        ), "Successful job got removed, even though this was not requested"
                    else:
                        assert not op.exists(
                            fn
                        ), f"Successful job did not get removed after run for clean = {clean}"
                    if verbose:
                        assert stdout.strip() == f'running {fn}\nhello'
                    else:
                        assert stdout.strip() == 'hello'

                cmd = fslsub.func_to_cmd(_bad_func,
                                         clean=clean,
                                         tmp_dir=tmp_dir)
                fn = cmd.split()[-1]
                assert op.exists(fn)
                stdout, stderr, exitcode = run.run(cmd,
                                                   exitcode=True,
                                                   stdout=True,
                                                   stderr=True,
                                                   env={'PYTHONPATH': cwd})
                assert exitcode != 0
                if clean == 'always':
                    assert not op.exists(
                        fn
                    ), "Failing job should always be removed if requested"
                else:
                    assert op.exists(
                        fn
                    ), f"Failing job got removed even with clean = {clean}"
コード例 #5
0
ファイル: fslsub.py プロジェクト: pauldmccarthy/fslpy
def info(job_ids) -> Dict[str, Optional[Dict[str, str]]]:
    """Gets information on a given job id

    The ``info`` function is deprecated - you should use the
    ``fsl_sub.report`` function from the ``fsl_sub`` Python library, which
    is available in FSL 6.0.5 and newer.

    Uses `qstat -j <job_ids>`

    :arg job_ids: string with job id or (nested) sequence with jobs
    :return: dictionary of jobid -> another dictionary with job information
             (or None if job does not exist)
    """
    if not hasattr(info, '_ncall'):
        info._ncall = 0
    info._ncall += 1
    if info._ncall == 3:
        warnings.warn("Please do not call `fslsub.info` repeatably, because it slows down the cluster. You can avoid this message by simply passing all the job IDs you are interested in to a single `fslsub.info` call.")

    from fsl.utils.run import run
    job_ids_string = _flatten_job_ids(job_ids)
    try:
        result = run(['qstat', '-j', job_ids_string], exitcode=True)[0]
    except FileNotFoundError:
        log.debug("qstat not found; assuming not on cluster")
        return {}
    return _parse_qstat(job_ids_string, result)
コード例 #6
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_run_submit():
    def mkexec(path, contents):
        with open(path, 'wt') as f:
            f.write(contents)
        os.chmod(path, 0o755)

    test_script = textwrap.dedent("""
    #!/usr/bin/env bash
    echo test_script running
    exit 0
    """).strip()

    with tempdir.tempdir(), \
         mockFSLDIR(), \
         mock.patch('fsl.utils.fslsub.submit', mock_submit):

        mkexec(op.expandvars('$FSLDIR/bin/fsltest'), test_script)

        jid = run.run('fsltest', submit=True)
        assert jid == '12345'
        stdout, stderr = fslsub.output(jid)
        assert stdout == 'test_script running\n'
        assert stderr == ''

        # or can pass submit opts as a dict
        kwargs = {'name': 'abcde', 'ram': '4GB'}
        jid = run.run('fsltest', submit=kwargs)
        assert jid == '12345'
        stdout, stderr = fslsub.output(jid)
        experr = '\n'.join(
            ['{}: {}'.format(k, kwargs[k])
             for k in sorted(kwargs.keys())]) + '\n'
        assert stdout == 'test_script running\n'
        assert stderr == experr

        # or can pass submit opts as kwargs
        kwargs = {'name': 'abcde', 'ram': '4GB'}
        jid = run.run('fsltest', submit=True, **kwargs)
        assert jid == '12345'
        stdout, stderr = fslsub.output(jid)
        experr = '\n'.join(
            ['{}: {}'.format(k, kwargs[k])
             for k in sorted(kwargs.keys())]) + '\n'
        assert stdout == 'test_script running\n'
        assert stderr == experr
コード例 #7
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_dryrun():

    test_script = textwrap.dedent("""
    #!/bin/bash
    touch foo
    """).strip()

    with tempdir.tempdir():
        mkexec('./script.sh', test_script)

        run.run('./script.sh')
        assert op.exists('foo')

        os.remove('foo')

        with run.dryrun():
            run.run('./script.sh')

        assert not op.exists('foo')
コード例 #8
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_run_passthrough():

    test_script = textwrap.dedent("""
    #!/bin/bash

    echo "env: $RUN_TEST_ENV_VAR"
    """).strip()

    with tempdir.tempdir():

        # return code == 0
        mkexec('script.sh', test_script.format(0))

        env = {'RUN_TEST_ENV_VAR': 'howdy ho'}
        expstdout = "env: howdy ho\n"

        assert run.run('./script.sh', env=env) == expstdout
コード例 #9
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def mock_submit(cmd, **kwargs):
    if isinstance(cmd, six.string_types):
        name = cmd.split()[0]
    else:
        name = cmd[0]

    name = op.basename(name)

    jid = '12345'
    output = run.run(cmd)

    with open('{}.o{}'.format(name, jid), 'wt') as f:
        f.write(output)

    with open('{}.e{}'.format(name, jid), 'wt') as f:
        for k in sorted(kwargs.keys()):
            f.write('{}: {}\n'.format(k, kwargs[k]))

    return jid
コード例 #10
0
ファイル: publish.py プロジェクト: MichielCottaar/mcot.core
#!/usr/bin/env python
# Script to publish the documentation on jalapeno

from fsl.utils.run import run
import os.path as op
from sphinx.cmd.build import main

main(('doc', 'doc/html'))
target = op.expanduser("~/www/doc/mcot/core")
if op.isdir(target):
    run(f"rsync -aP doc/html/ {target}/")

コード例 #11
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_run():

    test_script = textwrap.dedent("""
    #!/bin/bash

    echo "standard output - arguments: $@"
    echo "standard error" >&2
    exit {}
    """).strip()

    with tempdir.tempdir():

        # return code == 0
        mkexec('script.sh', test_script.format(0))

        expstdout = "standard output - arguments: 1 2 3\n"
        expstderr = "standard error\n"

        # test:
        #   - single string
        #   - packed sequence
        #   - unpacked sequence
        assert run.run('./script.sh 1 2 3') == expstdout
        assert run.run(('./script.sh', '1', '2', '3')) == expstdout
        assert run.run(*('./script.sh', '1', '2', '3')) == expstdout

        # test stdout/stderr
        stdout, stderr = run.run('./script.sh 1 2 3', stderr=True)
        assert stdout == expstdout
        assert stderr == expstderr

        # test return code
        res = run.run('./script.sh 1 2 3', exitcode=True)
        stdout, ret = res
        assert stdout == expstdout
        assert ret == 0
        stdout, stderr, ret = run.run('./script.sh 1 2 3',
                                      stderr=True,
                                      exitcode=True)
        assert stdout == expstdout
        assert stderr == expstderr
        assert ret == 0

        # stdout=False
        res = run.run('./script.sh 1 2 3', stdout=False)
        assert res == ()
        stderr = run.run('./script.sh 1 2 3', stdout=False, stderr=True)
        assert stderr == expstderr

        # return code != 0
        mkexec('./script.sh', test_script.format(255))

        with pytest.raises(RuntimeError):
            run.run('./script.sh 1 2 3')

        stdout, ret = run.run('./script.sh 1 2 3', exitcode=True)
        assert stdout == expstdout
        assert ret == 255
コード例 #12
0
ファイル: test_run.py プロジェクト: physimals/fslpy
def test_cmdonly():
    assert run.run('script.sh', cmdonly=True) == ['script.sh']
    assert run.run('script.sh 1 2 3',
                   cmdonly=True) == ['script.sh', '1', '2', '3']
    assert run.run(['script.sh'], cmdonly=True) == ['script.sh']
    assert run.run(['script.sh', '1'], cmdonly=True) == ['script.sh', '1']