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

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
Loading
Loading
Loading
Loading
+44 −19
Original line number Diff line number Diff line
@@ -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,6 +689,7 @@ def cli_run_renderer(argvec=None):
    ReadmeRenderer(yaml_dict, output_file=readme_file)

    # copy yaml file
    if not in_place:
        try:
            shutil.copy(str(yaml_file), str(prefix / "meta.yaml"))
        except shutil.SameFileError as e:
@@ -676,11 +698,13 @@ def cli_run_renderer(argvec=None):

    # copy util scripts (if any):  First, remove targed util, and then copy
    # source util directory.
    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(
@@ -690,4 +714,5 @@ def cli_run_renderer(argvec=None):
    # make scripts executable
    _make_file_executable(update_script)
    _make_file_executable(init_script)
    if not in_place:
        list(map(_make_file_executable, util_dst.glob("*.*")))
+18 −1
Original line number Diff line number Diff line
@@ -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)