def test_unchanged_stdout(runner, project, capsys, no_lfs_warning): """Test detection of unchanged stdout.""" with capsys.disabled(): with open("output.txt", "wb") as stdout: try: old_stdout = sys.stdout sys.stdout = stdout try: cli.main(args=("run", "echo", "1"), ) except SystemExit as e: assert e.code in {None, 0} finally: sys.stdout = old_stdout with capsys.disabled(): with open("output.txt", "wb") as stdout: try: old_stdout = sys.stdout sys.stdout = stdout try: cli.main(args=("run", "echo", "1"), ) except SystemExit as e: # The stdout has not been modified! assert e.code in {None, 1} finally: sys.stdout = old_stdout
def test_unchanged_stdout(runner, project, capsys): """Test detection of unchanged stdout.""" with capsys.disabled(): with open('output.txt', 'wb') as stdout: try: old_stdout = sys.stdout sys.stdout = stdout try: cli.main(args=('run', 'echo', '1'), ) except SystemExit as e: assert e.code in {None, 0} finally: sys.stdout = old_stdout with capsys.disabled(): with open('output.txt', 'wb') as stdout: try: old_stdout = sys.stdout sys.stdout = stdout try: cli.main(args=('run', 'echo', '1'), ) except SystemExit as e: # The stdout has not been modified! assert e.code in {None, 1} finally: sys.stdout = old_stdout
def test_workflow(runner, project): """Test workflow command.""" result = runner.invoke(cli, ['run', 'touch', 'data.csv']) assert 0 == result.exit_code with open('counted.txt', 'w') as stdout: with contextlib.redirect_stdout(stdout): try: cli.main( args=('run', 'wc', 'data.csv'), prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: assert e.code in {None, 0} result = runner.invoke( cli, ['workflow', 'create', 'counted.txt', '-o', 'workflow.cwl'], catch_exceptions=False, ) assert 0 == result.exit_code with open('workflow.cwl', 'r') as f: workflow = Workflow.from_cwl(yaml.safe_load(f)) assert workflow.steps[0].run.startswith('.renku/workflow/') # Compare default log and log for a specific file. result_default = runner.invoke(cli, ['log']) result_arg = runner.invoke(cli, ['log', 'counted.txt']) assert 0 == result_default.exit_code assert 0 == result_arg.exit_code assert result_default.output == result_arg.output
def test_workflow(runner, project): """Test workflow command.""" result = runner.invoke(cli, ["run", "touch", "data.csv"]) assert 0 == result.exit_code with open("counted.txt", "w") as stdout: with contextlib.redirect_stdout(stdout): try: cli.main( args=("run", "wc", "data.csv"), prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: assert e.code in {None, 0} result = runner.invoke( cli, ["workflow", "create", "counted.txt", "-o", "workflow.cwl"], catch_exceptions=False, ) assert 0 == result.exit_code workflow = parse_cwl("workflow.cwl") assert 2 == len(workflow.steps) # Compare default log and log for a specific file. result_default = runner.invoke(cli, ["log"]) result_arg = runner.invoke(cli, ["log", "counted.txt"]) assert 0 == result_default.exit_code assert 0 == result_arg.exit_code assert result_default.output == result_arg.output
def generate(args=('update', ), cwd=None, **streams): """Generate an output.""" with capsys.disabled(), Isolation(cwd=cwd, **streams): try: cli.main( args=args, prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: return 0 if e.code is None else e.code except Exception: raise
def test_streams_and_args_names(runner, project, capsys): """Test streams and conflicting argument names.""" with capsys.disabled(): with open('lalala', 'wb') as stdout: try: old_stdout = sys.stdout sys.stdout = stdout try: cli.main(args=('run', 'echo', 'lalala'), ) except SystemExit as e: assert e.code in {None, 0} finally: sys.stdout = old_stdout with open('lalala', 'r') as f: assert f.read().strip() == 'lalala' result = runner.invoke(cli, ['status'], catch_exceptions=False) assert 0 == result.exit_code
def test_streams_and_args_names(runner, project, capsys, no_lfs_warning): """Test streams and conflicting argument names.""" with capsys.disabled(): with open("lalala", "wb") as stdout: try: old_stdout = sys.stdout sys.stdout = stdout try: cli.main(args=("run", "echo", "lalala"), ) except SystemExit as e: assert e.code in {None, 0} finally: sys.stdout = old_stdout with open("lalala", "r") as f: assert f.read().strip() == "lalala" result = runner.invoke(cli, ["status"], catch_exceptions=False) assert 0 == result.exit_code
def test_status_with_submodules(isolated_runner, monkeypatch): """Test status calculation with submodules.""" runner = isolated_runner os.mkdir('foo') os.mkdir('bar') with open('woop', 'w') as f: f.write('woop') os.chdir('foo') result = runner.invoke(cli, [ 'init', '.', '--template', 'Basic Python Project', '--no-external-storage' ], catch_exceptions=False) assert 0 == result.exit_code os.chdir('../bar') result = runner.invoke(cli, [ 'init', '.', '--template', 'Basic Python Project', '--no-external-storage' ], catch_exceptions=False) assert 0 == result.exit_code os.chdir('../foo') with monkeypatch.context() as monkey: monkey.setattr(StorageApiMixin, 'storage_installed', False) result = runner.invoke(cli, ['dataset', 'add', 'f', '../woop'], catch_exceptions=False) assert 1 == result.exit_code subprocess.call(['git', 'clean', '-dff']) result = runner.invoke(cli, ['-S', 'dataset', 'add', 'f', '../woop'], catch_exceptions=False) assert 0 == result.exit_code os.chdir('../bar') result = runner.invoke(cli, ['-S', 'dataset', 'add', 'b', '../foo/data/f/woop'], catch_exceptions=False) assert 0 == result.exit_code # Produce a derived data from the imported data. with open('woop.wc', 'w') as stdout: with contextlib.redirect_stdout(stdout): try: cli.main( args=('-S', 'run', 'wc', 'data/b/woop'), prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: assert e.code in {None, 0} result = runner.invoke(cli, ['status'], catch_exceptions=False) assert 0 == result.exit_code # Modify the source data. os.chdir('../foo') with open('data/f/woop', 'w') as f: f.write('woop2') subprocess.call(['git', 'commit', '-am', 'commiting changes to woop']) os.chdir('../bar') subprocess.call(['git', 'submodule', 'update', '--rebase', '--remote']) subprocess.call(['git', 'commit', '-am', 'update submodule']) result = runner.invoke(cli, ['status'], catch_exceptions=False) assert 0 != result.exit_code # Test relative log output cmd = ['--path', '../foo', 'log'] result = runner.invoke(cli, cmd, catch_exceptions=False) assert '../foo/data/f/woop' in result.output assert 0 == result.exit_code
def test_streams(runner, project, capsys): """Test redirection of std streams.""" repo = git.Repo('.') with open('source.txt', 'w') as source: source.write('first,second,third') repo.git.add('--all') repo.index.commit('Added source.txt') with capsys.disabled(): with open('source.txt', 'rb') as stdin: with open('result.txt', 'wb') as stdout: try: old_stdin, old_stdout = sys.stdin, sys.stdout sys.stdin, sys.stdout = stdin, stdout try: cli.main( args=('run', 'cut', '-d,', '-f', '2', '-s'), prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: assert e.code in {None, 0} finally: sys.stdin, sys.stdout = old_stdin, old_stdout with open('result.txt', 'r') as f: assert f.read().strip() == 'second' result = runner.invoke(cli, ['workflow', 'create', 'result.txt']) assert 0 == result.exit_code result = runner.invoke(cli, ['status']) assert 0 == result.exit_code # Check that source.txt is not shown in outputs. result = runner.invoke(cli, ['show', 'outputs', 'source.txt']) assert 1 == result.exit_code result = runner.invoke(cli, ['show', 'outputs']) assert 0 == result.exit_code assert { 'result.txt', } == set(result.output.strip().split('\n')) # Check that source.txt is shown in inputs. result = runner.invoke(cli, ['show', 'inputs']) assert 0 == result.exit_code assert { 'source.txt', } == set(result.output.strip().split('\n')) with open('source.txt', 'w') as source: source.write('first,second,third,fourth') repo.git.add('--all') repo.index.commit('Changed source.txt') result = runner.invoke(cli, ['status']) assert 1 == result.exit_code assert 'source.txt' in result.output
def test_status_with_submodules(isolated_runner, monkeypatch, project_init): """Test status calculation with submodules.""" runner = isolated_runner data, commands = project_init os.mkdir("foo") os.mkdir("bar") with open("woop", "w") as f: f.write("woop") os.chdir("foo") result = runner.invoke(cli, commands["init"] + commands["id"] + ["--no-external-storage"], commands["confirm"], catch_exceptions=False) assert 0 == result.exit_code os.chdir("../bar") result = runner.invoke(cli, commands["init"] + commands["id"] + ["--no-external-storage"], commands["confirm"], catch_exceptions=False) assert 0 == result.exit_code os.chdir("../foo") with monkeypatch.context() as monkey: monkey.setattr(StorageApiMixin, "storage_installed", False) result = runner.invoke(cli, ["dataset", "add", "f", "../woop"], catch_exceptions=False) assert 1 == result.exit_code subprocess.call(["git", "clean", "-dff"]) result = runner.invoke(cli, ["-S", "dataset", "add", "f", "../woop"], catch_exceptions=False) assert 0 == result.exit_code os.chdir("../bar") result = runner.invoke(cli, ["-S", "dataset", "add", "b", "../foo/data/f/woop"], catch_exceptions=False) assert 0 == result.exit_code # Produce a derived data from the imported data. with open("woop.wc", "w") as stdout: with contextlib.redirect_stdout(stdout): try: cli.main( args=("-S", "run", "wc", "data/b/woop"), prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: assert e.code in {None, 0} result = runner.invoke(cli, ["status"], catch_exceptions=False) assert 0 == result.exit_code # Modify the source data. os.chdir("../foo") with open("data/f/woop", "w") as f: f.write("woop2") subprocess.call(["git", "commit", "-am", "commiting changes to woop"]) os.chdir("../bar") subprocess.call(["git", "submodule", "update", "--rebase", "--remote"]) subprocess.call(["git", "commit", "-am", "update submodule"]) result = runner.invoke(cli, ["status"], catch_exceptions=False) assert 0 != result.exit_code # Test relative log output cmd = ["--path", "../foo", "log"] result = runner.invoke(cli, cmd, catch_exceptions=False) assert "../foo/data/f/woop" in result.output assert 0 == result.exit_code
def test_streams(runner, project, capsys, no_lfs_warning): """Test redirection of std streams.""" repo = git.Repo(".") with open("source.txt", "w") as source: source.write("first,second,third") repo.git.add("--all") repo.index.commit("Added source.txt") with capsys.disabled(): with open("source.txt", "rb") as stdin: with open("result.txt", "wb") as stdout: try: old_stdin, old_stdout = sys.stdin, sys.stdout sys.stdin, sys.stdout = stdin, stdout try: cli.main( args=("run", "cut", "-d,", "-f", "2", "-s"), prog_name=runner.get_default_prog_name(cli), ) except SystemExit as e: assert e.code in {None, 0} finally: sys.stdin, sys.stdout = old_stdin, old_stdout with open("result.txt", "r") as f: assert f.read().strip() == "second" result = runner.invoke(cli, ["workflow", "create", "result.txt"]) assert 0 == result.exit_code result = runner.invoke(cli, ["status"]) assert 0 == result.exit_code # Check that source.txt is not shown in outputs. result = runner.invoke(cli, ["show", "outputs", "source.txt"]) assert 1 == result.exit_code result = runner.invoke(cli, ["show", "outputs"]) assert 0 == result.exit_code assert { "result.txt", } == set(result.output.strip().split("\n")) # Check that source.txt is shown in inputs. result = runner.invoke(cli, ["show", "inputs"]) assert 0 == result.exit_code assert { "source.txt", } == set(result.output.strip().split("\n")) with open("source.txt", "w") as source: source.write("first,second,third,fourth") repo.git.add("--all") repo.index.commit("Changed source.txt") result = runner.invoke(cli, ["status"]) assert 1 == result.exit_code assert "source.txt" in result.output