Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.tools.deps.mulled.mulled_build_files

"""Build all composite mulled recipes discovered in TSV files.

Use mulled-build-channel to build images for single recipes for a whole conda
channel. This script instead builds images for combinations of recipes. This
script can be given a single TSV file or a directory of TSV files to process.

Examples:

Build all recipes discovered in tsv files in a single directory.

    mulled-build-files build

"""

import collections
import glob
import os
import sys

from ._cli import arg_parser
from .mulled_build import (
    add_build_arguments,
    args_to_mull_targets_kwds,
    BuildExistsException,
    mull_targets,
    target_str_to_targets,
)


[docs]def main(argv=None): """Main entry-point for the CLI tool.""" parser = arg_parser(argv, globals()) add_build_arguments(parser) parser.add_argument('command', metavar='COMMAND', help='Command (build-and-test, build, all)') parser.add_argument('files', metavar="FILES", default=".", help="Path to directory (or single file) of TSV files describing composite recipes.") args = parser.parse_args() for (targets, image_build, name_override) in generate_targets(args.files): try: ret = mull_targets( targets, image_build=image_build, name_override=name_override, **args_to_mull_targets_kwds(args) ) except BuildExistsException: continue if ret > 0: sys.exit(ret)
def generate_targets(target_source): """Generate all targets from TSV files in specified file or directory.""" target_source = os.path.abspath(target_source) if os.path.isdir(target_source): target_source_files = glob.glob(target_source + "/*.tsv") else: target_source_files = [target_source] for target_source_file in target_source_files: with open(target_source_file, "r") as f: for line in f.readlines(): if line: line = line.strip() if not line or line.startswith("#"): continue yield line_to_targets(line) def line_to_targets(line_str): line = _parse_line(line_str) return (target_str_to_targets(line.targets), line.image_build, line.name_override) _Line = collections.namedtuple("_Line", ["targets", "image_build", "name_override"]) def _parse_line(line_str): line_parts = line_str.split("\t") assert len(line_parts) < 3, "Too many fields in line [%s], expect at most 3 - targets, image build number, and name override." % line_str line_parts += [None] * (3 - len(line_parts)) return _Line(*line_parts) __all__ = ("main", ) if __name__ == '__main__': main()