Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"commands", powerset(["ls", "picard.jar", "$ENVVAR"], nonempty=True))
def test_transformation_accumulation(commands):
""" Accumulation of transformations works as expected """
mapjar = lambda c: "java -jar {}".format(c)
envjar = "env.jar"
transforms = [(lambda c: c == "$ENVVAR", lambda _: envjar),
(lambda c: c.endswith(".jar"), mapjar)]
exps = {"ls": "ls", "picard.jar": mapjar("picard.jar"), "$ENVVAR": mapjar(envjar)}
with mock.patch.object(piper_utils, "is_command_callable", return_value=False):
res = piper_utils.determine_uncallable(
commands, transformations=transforms, accumulate=True)
expectation = [(c, exps[c]) for c in commands]
print("EXPECTED: {}".format(expectation))
print("OBSERVED: {}".format(res))
assert expectation == res
argvalues=powerset(
[{NEW_PIPES_KEY: [{"b": 1}, {"c": 2}]}, {"pipeline_config": {}}],
nonempty=True))
def test_grabs_only_sample_independent_data(
self, sample_independent_data, extra_data):
""" Only Project data defined as Sample-independent is retrieved. """
# Create the data to pass the the argument to the call under test.
data = copy.deepcopy(sample_independent_data)
data_updates = {}
for extra in extra_data:
data_updates.update(extra)
data.update(data_updates)
# Convert to the correct argument type for this test case.
p = PathExAttMap(data)
argvalues=powerset(SAMPLE_INDEPENDENT_PROJECT_SECTIONS, nonempty=True))
def test_does_not_need_all_sample_independent_data(
self, sections, basic_project_data, sample_independent_data):
""" Subset of all known independent data that's present is grabbed. """
p = PathExAttMap(sample_independent_data)
expected = {s: data for s, data in basic_project_data.items()
if s in sections}
observed = grab_project_data(p)
compare_mappings(expected, observed)
def _ensure_path_absolute(maybe_relpath, cfg_path):
""" Ensure that a possibly relative path is absolute. """
if not isinstance(maybe_relpath, str):
raise TypeError(
"Attempting to ensure non-text value is absolute path: {} ({})".
format(maybe_relpath, type(maybe_relpath)))
if os.path.isabs(maybe_relpath) or is_url(maybe_relpath):
_LOGGER.debug("Already absolute")
return maybe_relpath
# Maybe we have env vars that make the path absolute?
expanded = os.path.expanduser(os.path.expandvars(maybe_relpath))
if os.path.isabs(expanded):
_LOGGER.debug("Expanded: {}".format(expanded))
return expanded
# Set path to an absolute path, relative to project config.
config_dirpath = os.path.dirname(cfg_path)
_LOGGER.debug("config_dirpath: {}".format(config_dirpath))
abs_path = os.path.join(config_dirpath, maybe_relpath)
_LOGGER.debug("Expanded and/or made absolute: {}".format(abs_path))
return abs_path
def _ensure_path_absolute(maybe_relpath, cfg_path):
""" Ensure that a possibly relative path is absolute. """
if not isinstance(maybe_relpath, str):
raise TypeError(
"Attempting to ensure non-text value is absolute path: {} ({})".
format(maybe_relpath, type(maybe_relpath)))
_LOGGER.debug("Ensuring absolute: '{}'".format(maybe_relpath))
if os.path.isabs(maybe_relpath) or is_url(maybe_relpath):
_LOGGER.debug("Already absolute")
return maybe_relpath
# Maybe we have env vars that make the path absolute?
expanded = os.path.expanduser(os.path.expandvars(maybe_relpath))
_LOGGER.debug("Expanded: '{}'".format(expanded))
if os.path.isabs(expanded):
_LOGGER.debug("Expanded is absolute")
return expanded
_LOGGER.debug("Making non-absolute path '{}' be absolute".
format(maybe_relpath))
# Set path to an absolute path, relative to project config.
config_dirpath = os.path.dirname(cfg_path)
_LOGGER.debug("config_dirpath: {}".format(config_dirpath))
abs_path = os.path.join(config_dirpath, maybe_relpath)
return abs_path
def copy_or_download_file(input_string, outfolder):
"""
Given an input file, which can be a local file or a URL, and output folder,
this downloads or copies the file into the output folder.
:param str input_string: Can be either a URL or a path to a local file
:param str outfolder: Where to store the result.
:return str, str: output/result file and command
"""
result_file = os.path.join(outfolder, os.path.basename(input_string))
parts = ["wget -O", result_file, input_string] \
if is_url(input_string) else ["cp", input_string, result_file]
return result_file, " ".join(parts)
def parse_arguments():
"""
Creat parser instance and parse command-line arguments passed to the pipeline
:return argparse.Namespace: parsed arguments namespace
"""
parser = VersionInHelpParser(prog="PEPATAC_collator",
description='PEPATAC collator' , version=__version__)
parser = pypiper.add_pypiper_args(parser, groups=['pypiper', 'looper'])
parser.add_argument("-n", "--name",
help="Name of the project to use.", type=str)
parser.add_argument("-r", "--results",
help="Output results sub directory path.", type=str)
args = parser.parse_args()
return args
def build_argparser():
"""
Builds argument parser.
:return argparse.ArgumentParser
"""
banner = "%(prog)s - reference genome asset manager"
additional_description = "\nhttps://refgenie.databio.org"
parser = VersionInHelpParser(
prog="refgenie",
version=__version__,
description=banner,
epilog=additional_description)
subparsers = parser.add_subparsers(dest="command")
def add_subparser(cmd, description):
return subparsers.add_parser(
cmd, description=description, help=description)
sps = {}
for cmd, desc in SUBPARSER_MESSAGES.items():
sps[cmd] = add_subparser(cmd, desc)
# It's required for init
sps[cmd].add_argument(
def build_argparser():
banner = "%(prog)s - Interact with PEPs"
additional_description = "\nhttp://peppy.databio.org/"
parser = VersionInHelpParser(
prog=PKG_NAME,
description=banner,
epilog=additional_description,
version=__version__)
subparsers = parser.add_subparsers(dest="command")
sps = {}
for cmd, desc in SUBPARSER_MSGS.items():
sps[cmd] = subparsers.add_parser(cmd, description=desc, help=desc)
sps[cmd].add_argument('pep', metavar="PEP",
help="Path to a PEP configuration "
"file in yaml format.")
sps[VALIDATE_CMD].add_argument("-s", "--schema", required=True,
help="Path to a PEP schema file in yaml format.")
def get_dir_digest(path, pm=None):
"""
Generate a MD5 digest that reflects just the contents of the files in the selected directory.
:param str path: path to the directory to digest
:param pypiper.PipelineManager pm: a pipeline object, optional. The subprocess module will be used if not provided
:return str: a digest, e.g. a3c46f201a3ce7831d85cf4a125aa334
"""
if not is_command_callable("md5sum"):
raise OSError("md5sum command line tool is required for asset digest calculation. \n"
"Install and try again, e.g on macOS: 'brew install md5sha1sum'")
cmd = "cd {}; find . -type f -not -path './" + BUILD_STATS_DIR + \
"*' -exec md5sum {{}} \; | sort -k 2 | awk '{{print $1}}' | md5sum"
if isinstance(pm, pypiper.PipelineManager):
x = pm.checkprint(cmd.format(path))
else:
try:
from subprocess import check_output
x = check_output(cmd.format(path), shell=True).decode("utf-8")
except Exception as e:
_LOGGER.warning("{}: could not calculate digest for '{}'".format(e.__class__.__name__, path))
return
return str(sub(r'\W+', '', x)) # strips non-alphanumeric