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): ...@@ -592,6 +592,11 @@ def cli_run_renderer(argvec=None):
parser = argparse.ArgumentParser(description="Data repo renderer") parser = argparse.ArgumentParser(description="Data repo renderer")
parser.add_argument("--verbose", action='store_true', parser.add_argument("--verbose", action='store_true',
help="Print debugging output.") 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 " parser.add_argument("--prefix", help=("Custom path to a directory that "
"will contain the rendered repo. " "will contain the rendered repo. "
"Defaults to: './rendered/'")) "Defaults to: './rendered/'"))
...@@ -602,11 +607,27 @@ def cli_run_renderer(argvec=None): ...@@ -602,11 +607,27 @@ def cli_run_renderer(argvec=None):
help="Use this YAML file to render repo.") help="Use this YAML file to render repo.")
args = parser.parse_args(argvec) args = parser.parse_args(argvec)
# extract arguments # are we verbose?
verbose = (args.verbose is True) 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) 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 # set up logging
logger = logging.getLogger("data_repo_renderer") logger = logging.getLogger("data_repo_renderer")
...@@ -668,26 +689,30 @@ def cli_run_renderer(argvec=None): ...@@ -668,26 +689,30 @@ def cli_run_renderer(argvec=None):
ReadmeRenderer(yaml_dict, output_file=readme_file) ReadmeRenderer(yaml_dict, output_file=readme_file)
# copy yaml file # copy yaml file
try: if not in_place:
shutil.copy(str(yaml_file), str(prefix / "meta.yaml")) try:
except shutil.SameFileError as e: shutil.copy(str(yaml_file), str(prefix / "meta.yaml"))
logger.debug("failed to copy `meta.yaml` with: {}".format(e)) except shutil.SameFileError as e:
pass logger.debug("failed to copy `meta.yaml` with: {}".format(e))
pass
# copy util scripts (if any): First, remove targed util, and then copy # copy util scripts (if any): First, remove targed util, and then copy
# source util directory. # source util directory.
try: if not in_place:
shutil.rmtree(str(util_dst)) try:
except Exception as e: shutil.rmtree(str(util_dst))
logger.debug("failed to unlink {} with: {}".format(util_dst, e)) except Exception as e:
pass logger.debug("failed to unlink {} with: {}".format(util_dst, e))
shutil.copytree(str(util_src), str(util_dst)) pass
except Exception as e: try:
logger.debug("failed to copy {} to {} with: {}".format( shutil.copytree(str(util_src), str(util_dst))
util_src, util_dst, e)) except Exception as e:
pass logger.debug("failed to copy {} to {} with: {}".format(
util_src, util_dst, e))
pass
# make scripts executable # make scripts executable
_make_file_executable(update_script) _make_file_executable(update_script)
_make_file_executable(init_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): ...@@ -236,8 +236,10 @@ def util(tmp_path):
return util_path return util_path
@pytest.mark.parametrize("cli_args_verbose", [[], ["--verbose"]])
@pytest.mark.parametrize("util_after", [True, False]) @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 # Set up command line args
cli_args = ["--prefix", str(tmp_path / "rendered"), cli_args = ["--prefix", str(tmp_path / "rendered"),
...@@ -248,6 +250,9 @@ def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after): ...@@ -248,6 +250,9 @@ def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after):
if util_after: if util_after:
cli_args.insert(2, cli_args.pop(-1)) cli_args.insert(2, cli_args.pop(-1))
# cycle over verbose flag
cli_args = cli_args_verbose + cli_args
# and run the renderer # and run the renderer
data_repo_renderer.cli_run_renderer(cli_args) 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): ...@@ -260,3 +265,15 @@ def test_full_yaml_example_01(util, yaml_example, tmp_path, util_after):
assert all( assert all(
(tmp_path / "rendered" / "util" / file_name).exists() (tmp_path / "rendered" / "util" / file_name).exists()
for file_name in ["postprocessing_01.sh", "postprocessing_02.sh"]) 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