def _fill_stage_dependencies(self, **kwargs): assert not self.deps self.deps = [] self.deps += dependency.loads_from(self, kwargs.get("deps", []), erepo=kwargs.get("erepo", None)) self.deps += dependency.loads_params(self, kwargs.get("params", []))
def fill_stage_dependencies(stage, deps=None, erepo=None, params=None): from dvc.dependency import loads_from, loads_params assert not stage.deps stage.deps = [] stage.deps += loads_from(stage, deps or [], erepo=erepo) stage.deps += loads_params(stage, params or [])
def test_loads_params(dvc): stage = Stage(dvc) deps = loads_params( stage, [ "foo", "bar", { "a_file": ["baz", "bat"] }, { "b_file": ["cat"] }, {}, { "a_file": ["foobar"] }, ], ) assert len(deps) == 3 assert isinstance(deps[0], ParamsDependency) assert deps[0].def_path == ParamsDependency.DEFAULT_PARAMS_FILE assert deps[0].params == ["foo", "bar"] assert not deps[0].hash_info assert isinstance(deps[1], ParamsDependency) assert deps[1].def_path == "a_file" assert deps[1].params == ["baz", "bat", "foobar"] assert not deps[1].hash_info assert isinstance(deps[2], ParamsDependency) assert deps[2].def_path == "b_file" assert deps[2].params == ["cat"] assert not deps[2].hash_info
def test_loads_params(dvc): stage = Stage(dvc) deps = loads_params(stage, ["foo", "bar,baz", "a_file:qux"]) assert len(deps) == 2 assert isinstance(deps[0], ParamsDependency) assert deps[0].def_path == ParamsDependency.DEFAULT_PARAMS_FILE assert deps[0].params == ["foo", "bar", "baz"] assert deps[0].info == {} assert isinstance(deps[1], ParamsDependency) assert deps[1].def_path == "a_file" assert deps[1].params == ["qux"] assert deps[1].info == {}
def fill_stage_dependencies(stage, deps=None, erepo=None, params=None): assert not stage.deps stage.deps = [] stage.deps += dependency.loads_from(stage, deps or [], erepo=erepo) stage.deps += dependency.loads_params(stage, params or [])
def test_params_error(dvc, params): with pytest.raises(ValueError): loads_params(Stage(dvc), params)
def create(repo, accompany_outs=False, **kwargs): wdir = kwargs.get("wdir", None) cwd = kwargs.get("cwd", None) fname = kwargs.get("fname", None) # Backward compatibility for `cwd` option if wdir is None and cwd is not None: if fname is not None and os.path.basename(fname) != fname: raise StageFileBadNameError( "DVC-file name '{fname}' may not contain subdirectories" " if `-c|--cwd` (deprecated) is specified. Use `-w|--wdir`" " along with `-f` to specify DVC-file path with working" " directory.".format(fname=fname)) wdir = cwd elif wdir is None: wdir = os.curdir stage = Stage( repo=repo, wdir=wdir, cmd=kwargs.get("cmd", None), locked=kwargs.get("locked", False), always_changed=kwargs.get("always_changed", False), ) Stage._fill_stage_outputs(stage, **kwargs) deps = dependency.loads_from(stage, kwargs.get("deps", []), erepo=kwargs.get("erepo", None)) params = dependency.loads_params(stage, kwargs.get("params", [])) stage.deps = deps + params stage._check_circular_dependency() stage._check_duplicated_arguments() if not fname: fname = Stage._stage_fname(stage.outs, accompany_outs) stage._check_dvc_filename(fname) # Autodetecting wdir for add, we need to create outs first to do that, # so we start with wdir = . and remap out paths later. if accompany_outs and kwargs.get("wdir") is None and cwd is None: wdir = os.path.dirname(fname) for out in chain(stage.outs, stage.deps): if out.is_in_repo: out.def_path = relpath(out.path_info, wdir) wdir = os.path.abspath(wdir) if cwd is not None: path = os.path.join(wdir, fname) else: path = os.path.abspath(fname) Stage._check_stage_path(repo, wdir, is_wdir=kwargs.get("wdir")) Stage._check_stage_path(repo, os.path.dirname(path)) stage.wdir = wdir stage.path = path ignore_build_cache = kwargs.get("ignore_build_cache", False) # NOTE: remove outs before we check build cache if kwargs.get("remove_outs", False): logger.warning("--remove-outs is deprecated." " It is now the default behavior," " so there's no need to use this option anymore.") stage.remove_outs(ignore_remove=False) logger.warning("Build cache is ignored when using --remove-outs.") ignore_build_cache = True if os.path.exists(path) and any(out.persist for out in stage.outs): logger.warning("Build cache is ignored when persisting outputs.") ignore_build_cache = True if os.path.exists(path): if (not ignore_build_cache and stage.is_cached and not stage.is_callback and not stage.always_changed): logger.info("Stage is cached, skipping.") return None msg = ("'{}' already exists. Do you wish to run the command and " "overwrite it?".format(stage.relpath)) if not kwargs.get("overwrite", True) and not prompt.confirm(msg): raise StageFileAlreadyExistsError(stage.relpath) os.unlink(path) return stage