def test_03_input(instance_path): """Check the essential input parameters.""" whale = Path(instance_path) / 'whale.txt' whale.touch() argv = [ 'echo', '-f', '-i42', '--example-string', 'hello', '--file=whale.txt', ] tool = CommandLineToolFactory(argv, directory=instance_path).generate_tool() assert tool.arguments[0].prefix == '-f' assert tool.inputs[0].default == 42 assert tool.inputs[0].type == 'int' assert tool.inputs[0].inputBinding.prefix == '-i' assert tool.inputs[0].inputBinding.separate is False assert tool.inputs[1].default == 'hello' assert tool.inputs[1].type == 'string' assert tool.inputs[1].inputBinding.prefix == '--example-string' assert tool.inputs[1].inputBinding.separate is True assert tool.inputs[2].default.path == Path('whale.txt') assert tool.inputs[2].type == 'File' assert tool.inputs[2].inputBinding.prefix == '--file=' assert tool.inputs[2].inputBinding.separate is False assert tool.to_argv() == argv
def test_06_params(instance_path): """Test referencing input parameters in other fields.""" hello = Path(instance_path) / 'hello.tar' hello.touch() argv = ['tar', 'xf', 'hello.tar', 'goodbye.txt'] factory = CommandLineToolFactory( argv, directory=instance_path, ) assert factory.inputs[1].default == 'goodbye.txt' assert factory.inputs[1].type == 'string' assert factory.inputs[1].inputBinding.position == 2 goodbye_id = factory.inputs[1].id # simulate run output = Path(instance_path) / 'goodbye.txt' output.touch() parameters = list(factory.guess_outputs([output])) assert parameters[0][0].type == 'File' assert parameters[0][0].outputBinding.glob == \ '$(inputs.{0})'.format(goodbye_id) tool = factory.generate_tool() assert tool.to_argv() == argv
def test_stdin_and_stdout(argv, instance_path): """Test stdout mapping.""" input_ = Path(instance_path) / 'input.txt' input_.touch() output = Path(instance_path) / 'output.txt' output.touch() factory = CommandLineToolFactory( argv, directory=instance_path, working_dir=instance_path, stdin='input.txt', stdout='output.txt', stderr='error.log', ) assert factory.stdin if len(argv) > 1: assert factory.arguments assert factory.stdout == 'output.txt' assert factory.outputs[0].type == 'stdout' tool = factory.generate_tool() assert tool.to_argv() == argv std_streams = ' < input.txt > output.txt 2> error.log' assert str(tool) == ' '.join(argv) + std_streams
def test_base_command_detection(instance_path): """Test base command detection.""" hello = Path(instance_path) / 'hello.tar' hello.touch() argv = ['tar', 'xf', 'hello.tar'] tool = CommandLineToolFactory(argv, directory=instance_path).generate_tool() assert tool.baseCommand == ['tar', 'xf'] assert tool.inputs[0].default.path == Path('hello.tar') assert tool.inputs[0].type == 'File' assert tool.inputs[0].inputBinding.prefix is None assert tool.inputs[0].inputBinding.separate is True assert tool.to_argv() == argv
def test_05_stdout(instance_path): """Test stdout mapping.""" output = Path(instance_path) / 'output.txt' output.touch() argv = ['echo', 'Hello world!'] factory = CommandLineToolFactory( argv, directory=instance_path, stdout='output.txt', ) assert factory.stdout == 'output.txt' assert factory.outputs[0].type == 'stdout' tool = factory.generate_tool() assert tool.to_argv() == argv
def test_stdout_with_conflicting_arg(instance_path): """Test stdout with conflicting argument value.""" output = Path(instance_path) / 'lalala' output.touch() argv = ['echo', 'lalala'] factory = CommandLineToolFactory( argv, directory=instance_path, stdout='lalala', ) assert factory.inputs[0].default == 'lalala' assert factory.inputs[0].type == 'string' assert factory.stdout == 'lalala' assert factory.outputs[0].type == 'stdout' tool = factory.generate_tool() assert tool.to_argv() == argv
def test_04_output(instance_path): """Test describtion of outputs from a command.""" hello = Path(instance_path) / 'hello.tar' hello.touch() argv = ['tar', 'xf', 'hello.tar'] factory = CommandLineToolFactory(argv, directory=instance_path) # simulate run output = Path(instance_path) / 'hello.txt' output.touch() parameters = list(factory.guess_outputs([output])) assert parameters[0][0].type == 'File' assert parameters[0][0].outputBinding.glob == 'hello.txt' tool = factory.generate_tool() assert tool.to_argv() == argv
def test_stdin_and_stdout(argv, instance_path): """Test stdout mapping.""" input_ = Path(instance_path) / 'input.txt' input_.touch() output = Path(instance_path) / 'output.txt' output.touch() factory = CommandLineToolFactory( argv, directory=instance_path, stdin='input.txt', stdout='output.txt', ) assert factory.stdin if len(argv) > 1: assert factory.arguments assert factory.stdout == 'output.txt' assert factory.outputs[0].type == 'stdout' tool = factory.generate_tool() assert tool.to_argv() == argv
def worktree( self, path=None, branch_name=None, commit=None, merge_args=('--ff-only', ), ): """Create new worktree.""" from git import GitCommandError, NULL_TREE from renku._contexts import Isolation delete = path is None path = path or tempfile.mkdtemp() branch_name = branch_name or 'renku/run/isolation/' + uuid.uuid4().hex # TODO sys.argv if commit is NULL_TREE: args = ['add', '--detach', path] self.repo.git.worktree(*args) client = attr.evolve(self, path=path) client.repo.git.checkout('--orphan', branch_name) client.repo.git.rm('-rf', '*') else: args = ['add', '-b', branch_name, path] if commit: args.append(commit) self.repo.git.worktree(*args) client = attr.evolve(self, path=path) client.repo.config_reader = self.repo.config_reader # Keep current directory relative to repository root. relative = Path('.').resolve().relative_to(self.path) # Reroute standard streams original_mapped_std = _mapped_std_streams(self.candidate_paths) mapped_std = {} for name, stream in original_mapped_std.items(): stream_path = Path(path) / (Path(stream).relative_to(self.path)) stream_path = stream_path.absolute() if not stream_path.exists(): stream_path.parent.mkdir(parents=True, exist_ok=True) stream_path.touch() mapped_std[name] = stream_path _clean_streams(self.repo, original_mapped_std) new_cwd = Path(path) / relative new_cwd.mkdir(parents=True, exist_ok=True) with Isolation(cwd=str(new_cwd), **mapped_std): yield client try: self.repo.git.merge(branch_name, *merge_args) except GitCommandError: raise errors.FailedMerge(self.repo) if delete: shutil.rmtree(path) self.repo.git.worktree('prune') self.checkout_paths_from_storage()