Commit a3112832 authored by Willi Rath's avatar Willi Rath

Merge branch 'develop' into 'master'


See merge request !92
parents b597001d af989196
import argparse
import logging
from pathlib import Path
from pkg_resources import get_distribution, DistributionNotFound
import shutil
......@@ -8,12 +9,31 @@ import stat
import textwrap
import yaml
# Set version string
__version__ = get_distribution(__name__).version
except DistributionNotFound:
def maybe_get_installed_version(pkg_name):
"""If `pkg_name` is installed, set version from there.
pkg_name : str
Package name.
version : str
Version number from installed package or 'vX.X.X'
version = get_distribution(pkg_name).version
except DistributionNotFound:
# package is not installed
__version__ = "vX.X.X"
version = "vX.X.X"
return version
# Set version string
__version__ = maybe_get_installed_version(__name__)
class Renderer(object):
......@@ -439,6 +459,10 @@ class ReadmeRenderer(Renderer):
# {{repo_name}}
**Note:** *This dataset is just a mirror of an external source.
Please make sure to properly credit the original creators of the data
set just as you would do if you'd obtained the data directly from
......@@ -447,11 +471,6 @@ class ReadmeRenderer(Renderer):
To learn more about how to use and access the data, check the central
documentation: <>
......@@ -571,6 +590,13 @@ def cli_run_renderer(argvec=None):
"""Run renderer."""
# parse command line args
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',
"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/'"))
......@@ -581,10 +607,37 @@ def cli_run_renderer(argvec=None):
help="Use this YAML file to render repo.")
args = parser.parse_args(argvec)
# extract arguments
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/")
# are we verbose?
verbose = (args.verbose is True)
# 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"
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")
if verbose:
_log_level = logging.DEBUG
_log_level = logging.INFO
format='%(asctime)s %(name)-16s: %(levelname)-8s %(message)s')
# load YAML file
with as stream:
......@@ -602,6 +655,7 @@ def cli_run_renderer(argvec=None):
except Exception as e:
logger.debug("failed to unlink {} with: {}".format(f, e))
_unlink_files([update_script, init_script, readme_file])
......@@ -635,18 +689,30 @@ def cli_run_renderer(argvec=None):
ReadmeRenderer(yaml_dict, output_file=readme_file)
# copy yaml file
if not in_place:
shutil.copy(str(yaml_file), str(prefix / "meta.yaml"))
except shutil.SameFileError as e:
logger.debug("failed to copy `meta.yaml` with: {}".format(e))
# copy util scripts (if any)
# copy util scripts (if any): First, remove targed util, and then copy
# source util directory.
if not in_place:
except Exception as e:
logger.debug("failed to unlink {} with: {}".format(util_dst, e))
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))
# make scripts executable
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,
# 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
......@@ -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 ["", ""])
@pytest.mark.parametrize("cli_args_verbose", [[], ["--verbose"]])
[["--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):
# -*- coding:utf-8 -*-
import data_repo_renderer
import pytest
def test_generic_version_if_not_installed():
vers = data_repo_renderer.maybe_get_installed_version("datareporenderer")
assert vers == "vX.X.X"
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment