Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/planemo/conda.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
| author | shellac |
|---|---|
| date | Sat, 02 May 2020 07:14:21 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 """Planemo specific utilities for dealing with conda. | |
| 2 | |
| 3 The extend galaxy-tool-util's features with planemo specific idioms. | |
| 4 """ | |
| 5 | |
| 6 from __future__ import absolute_import | |
| 7 | |
| 8 import collections | |
| 9 import os | |
| 10 import threading | |
| 11 | |
| 12 from galaxy.tool_util.deps import conda_util | |
| 13 | |
| 14 from planemo.exit_codes import EXIT_CODE_FAILED_DEPENDENCIES, ExitCodeException | |
| 15 from planemo.io import error, shell | |
| 16 from planemo.tools import yield_tool_sources_on_paths | |
| 17 | |
| 18 MESSAGE_ERROR_FAILED_INSTALL = "Attempted to install conda and failed." | |
| 19 MESSAGE_ERROR_CANNOT_INSTALL = "Cannot install Conda - perhaps due to a failed installation or permission problems." | |
| 20 MESSAGE_ERROR_NOT_INSTALLING = "Conda not configured - run ``planemo conda_init`` or pass ``--conda_auto_init`` to continue." | |
| 21 | |
| 22 BEST_PRACTICE_CHANNELS = ["conda-forge", "bioconda", "defaults"] | |
| 23 | |
| 24 | |
| 25 def build_conda_context(ctx, **kwds): | |
| 26 """Build a galaxy-tool-util CondaContext tailored to planemo use. | |
| 27 | |
| 28 Using planemo's common command-line/global config options. | |
| 29 """ | |
| 30 condarc_override_default = os.path.join(ctx.workspace, "condarc") | |
| 31 conda_prefix = kwds.get("conda_prefix", None) | |
| 32 use_planemo_shell = kwds.get("use_planemo_shell_exec", True) | |
| 33 ensure_channels = kwds.get("conda_ensure_channels", "") | |
| 34 condarc_override = kwds.get("condarc", condarc_override_default) | |
| 35 use_local = kwds.get("conda_use_local", False) | |
| 36 shell_exec = shell if use_planemo_shell else None | |
| 37 conda_context = conda_util.CondaContext(conda_prefix=conda_prefix, | |
| 38 ensure_channels=ensure_channels, | |
| 39 condarc_override=condarc_override, | |
| 40 use_local=use_local, | |
| 41 shell_exec=shell_exec) | |
| 42 handle_auto_init = kwds.get("handle_auto_init", False) | |
| 43 if handle_auto_init and not conda_context.is_installed(): | |
| 44 auto_init = kwds.get("conda_auto_init", True) | |
| 45 failed = True | |
| 46 if auto_init: | |
| 47 if conda_context.can_install_conda(): | |
| 48 if conda_util.install_conda(conda_context): | |
| 49 error(MESSAGE_ERROR_FAILED_INSTALL) | |
| 50 else: | |
| 51 failed = False | |
| 52 else: | |
| 53 error(MESSAGE_ERROR_CANNOT_INSTALL) | |
| 54 else: | |
| 55 error(MESSAGE_ERROR_NOT_INSTALLING) | |
| 56 | |
| 57 if failed: | |
| 58 raise ExitCodeException(EXIT_CODE_FAILED_DEPENDENCIES) | |
| 59 if handle_auto_init: | |
| 60 conda_context.ensure_conda_build_installed_if_needed() | |
| 61 return conda_context | |
| 62 | |
| 63 | |
| 64 def collect_conda_targets(ctx, paths, recursive=False, found_tool_callback=None): | |
| 65 """Load CondaTarget objects from supplied artifact sources. | |
| 66 | |
| 67 If a tool contains more than one requirement, the requirements will each | |
| 68 appear once in the output. | |
| 69 """ | |
| 70 conda_targets = set([]) | |
| 71 real_paths = [] | |
| 72 for path in paths: | |
| 73 if not os.path.exists(path): | |
| 74 targets = target_str_to_targets(path) | |
| 75 [conda_targets.add(_) for _ in targets] | |
| 76 else: | |
| 77 real_paths.append(path) | |
| 78 | |
| 79 for (tool_path, tool_source) in yield_tool_sources_on_paths(ctx, real_paths, recursive=recursive, exclude_deprecated=True): | |
| 80 if found_tool_callback: | |
| 81 found_tool_callback(tool_path) | |
| 82 for target in tool_source_conda_targets(tool_source): | |
| 83 conda_targets.add(target) | |
| 84 return conda_targets | |
| 85 | |
| 86 | |
| 87 # Copied and modified from mulled stuff - need to syncronize these concepts. | |
| 88 def target_str_to_targets(targets_raw): | |
| 89 def parse_target(target_str): | |
| 90 if "=" in target_str: | |
| 91 package_name, version = target_str.split("=", 1) | |
| 92 else: | |
| 93 package_name = target_str | |
| 94 version = None | |
| 95 target = conda_util.CondaTarget(package_name, version) | |
| 96 return target | |
| 97 | |
| 98 targets = [parse_target(_) for _ in targets_raw.split(",")] | |
| 99 return targets | |
| 100 | |
| 101 | |
| 102 def collect_conda_target_lists(ctx, paths, recursive=False, found_tool_callback=None): | |
| 103 """Load CondaTarget lists from supplied artifact sources. | |
| 104 | |
| 105 If a tool contains more than one requirement, the requirements will all | |
| 106 appear together as one list element of the output list. | |
| 107 """ | |
| 108 conda_target_lists, _ = collect_conda_target_lists_and_tool_paths(ctx, paths, recursive=recursive, found_tool_callback=found_tool_callback) | |
| 109 return conda_target_lists | |
| 110 | |
| 111 | |
| 112 def collect_conda_target_lists_and_tool_paths(ctx, paths, recursive=False, found_tool_callback=None): | |
| 113 """Load CondaTarget lists from supplied artifact sources. | |
| 114 | |
| 115 If a tool contains more than one requirement, the requirements will all | |
| 116 appear together as one list element of the output list. | |
| 117 """ | |
| 118 conda_target_lists = set([]) | |
| 119 tool_paths = collections.defaultdict(list) | |
| 120 for (tool_path, tool_source) in yield_tool_sources_on_paths(ctx, paths, recursive=recursive, yield_load_errors=False): | |
| 121 if found_tool_callback: | |
| 122 found_tool_callback(tool_path) | |
| 123 targets = frozenset(tool_source_conda_targets(tool_source)) | |
| 124 conda_target_lists.add(targets) | |
| 125 tool_paths[targets].append(tool_path) | |
| 126 | |
| 127 # Turn them into lists so the order matches before returning... | |
| 128 conda_target_lists = list(conda_target_lists) | |
| 129 conda_target_tool_paths = [tool_paths[c] for c in conda_target_lists] | |
| 130 | |
| 131 return conda_target_lists, conda_target_tool_paths | |
| 132 | |
| 133 | |
| 134 def tool_source_conda_targets(tool_source): | |
| 135 """Load CondaTarget object from supplied abstract tool source.""" | |
| 136 requirements, _ = tool_source.parse_requirements_and_containers() | |
| 137 return conda_util.requirements_to_conda_targets(requirements) | |
| 138 | |
| 139 | |
| 140 best_practice_search_first = threading.local() | |
| 141 | |
| 142 | |
| 143 def best_practice_search(conda_target, conda_context=None, platform=None): | |
| 144 # Call it in offline mode after the first time. | |
| 145 try: | |
| 146 best_practice_search_first.previously_called | |
| 147 # TODO: Undo this... | |
| 148 offline = False | |
| 149 except AttributeError: | |
| 150 best_practice_search_first.previously_called = True | |
| 151 offline = False | |
| 152 | |
| 153 if not conda_context: | |
| 154 conda_context = conda_util.CondaContext() | |
| 155 return conda_util.best_search_result( | |
| 156 conda_target, | |
| 157 conda_context=conda_context, | |
| 158 channels_override=BEST_PRACTICE_CHANNELS, | |
| 159 offline=offline, | |
| 160 platform=platform, | |
| 161 ) | |
| 162 | |
| 163 | |
| 164 __all__ = ( | |
| 165 "BEST_PRACTICE_CHANNELS", | |
| 166 "best_practice_search", | |
| 167 "build_conda_context", | |
| 168 "collect_conda_targets", | |
| 169 "collect_conda_target_lists", | |
| 170 "collect_conda_target_lists_and_tool_paths", | |
| 171 "tool_source_conda_targets", | |
| 172 ) |
