Commit 1958fec7 authored by Willi Rath's avatar Willi Rath

Merge branch '72-add-in-place-rendering' into 'develop'

Resolve "Add `--in-place` flag for in-place re-rendering"

See merge request !91
parents cf189ee5 6a735855
......@@ -592,6 +592,11 @@ def cli_run_renderer(argvec=None):
parser = argparse.ArgumentParser(description="Data repo renderer")
parser.add_argument("--verbose", action='store_true',
help="Print debugging output.")
parser.add_argument("--in-place", action='store_true',
help=(
"Render in place? This will render everything in "
"the parent directory of `yaml_file`. "
"Incompatible with --prefix and --util."))
parser.add_argument("--prefix", help=("Custom path to a directory that "
"will contain the rendered repo. "
"Defaults to: './rendered/'"))
......@@ -602,11 +607,27 @@ def cli_run_renderer(argvec=None):
help="Use this YAML file to render repo.")
args = parser.parse_args(argvec)
# extract arguments
# are we verbose?
verbose = (args.verbose is True)
util_src = Path(args.util if args.util is not None else "./util/")
prefix = Path(args.prefix if args.prefix is not None else "./rendered/")
# do we do in-place rerendering?
in_place = (args.in_place is True)
# check for incompatible args
if in_place and args.prefix is not None:
raise ValueError("--prefix and --in-place are incompatible.")
if in_place and args.util is not None:
raise ValueError("--util and --in-place are incompatible.")
# Read paths from cli
yaml_file = Path(args.yaml_file)
if in_place:
prefix = yaml_file.parent
util_src = prefix / "util"
else:
util_src = Path(args.util if args.util is not None else "./util/")
prefix = Path(args.prefix if args.prefix is not None
else "./rendered/")
# set up logging
logger = logging.getLogger("data_repo_renderer")
......@@ -668,26 +689,30 @@ def cli_run_renderer(argvec=None):
ReadmeRenderer(yaml_dict, output_file=readme_file)
# copy yaml file
try:
shutil.copy(str(yaml_file), str(prefix / "meta.yaml"))
except shutil.SameFileError as e:
logger.debug("failed to copy `meta.yaml` with: {}".format(e))
pass
if not in_place:
try:
shutil.copy(str(yaml_file), str(prefix / "meta.yaml"))
except shutil.SameFileError as e:
logger.debug("failed to copy `meta.yaml` with: {}".format(e))
pass
# copy util scripts (if any): First, remove targed util, and then copy
# source util directory.
try:
shutil.rmtree(str(util_dst))
except Exception as e:
logger.debug("failed to unlink {} with: {}".format(util_dst, e))
pass
shutil.copytree(str(util_src), str(util_dst))
except Exception as e:
logger.debug("failed to copy {} to {} with: {}".format(
util_src, util_dst, e))
pass
if not in_place:
try:
shutil.rmtree(str(util_dst))
except Exception as e:
logger.debug("failed to unlink {} with: {}".format(util_dst, e))
pass
try:
shutil.copytree(str(util_src), str(util_dst))
except Exception as e:
logger.debug("failed to copy {} to {} with: {}".format(
util_src, util_dst, e))
pass
# make scripts executable
_make_file_executable(update_script)
_make_file_executable(init_script)
list(map(_make_file_executable, util_dst.glob("*.*")))
if not in_place:
list(map(_make_file_executable, util_dst.glob("*.*")))
......@@ -236,8 +236,10 @@ def util(tmp_path):
return util_path
@pytest.mark.parametrize("cli_args_verbose", [[], ["--verbose"]])
@pytest.mark.parametrize("util_after", [True, False])
def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after):
def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after,
cli_args_verbose):
# Set up command line args
cli_args = ["--prefix", str(tmp_path / "rendered"),
......@@ -248,6 +250,9 @@ def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after):
if util_after:
cli_args.insert(2, cli_args.pop(-1))
# cycle over verbose flag
cli_args = cli_args_verbose + cli_args
# and run the renderer
data_repo_renderer.cli_run_renderer(cli_args)
......@@ -260,3 +265,15 @@ def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after):
assert all(
(tmp_path / "rendered" / "util" / file_name).exists()
for file_name in ["postprocessing_01.sh", "postprocessing_02.sh"])
@pytest.mark.parametrize("cli_args_verbose", [[], ["--verbose"]])
@pytest.mark.parametrize(
"cli_args_i_p_u",
[["--in-place", "--prefix", "some_prefix"],
["--in-place", "--util", "some_util"],
["--in-place", "--prefix", "some_prefix", "--util", "some_util"]])
def test_incompatible_cli_args(cli_args_i_p_u, cli_args_verbose):
cli_args = cli_args_verbose + cli_args_i_p_u + ["meta.yaml"]
with pytest.raises(ValueError):
data_repo_renderer.cli_run_renderer(cli_args)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment