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.cwl.representation

""" This module is responsible for converting between Galaxy's tool
input description and the CWL description for a job json. """

import json
import logging
import os

from six import string_types

from galaxy.exceptions import RequestParameterInvalidException
from galaxy.util import safe_makedirs, string_as_bool

log = logging.getLogger(__name__)

NOT_PRESENT = object()

GALAXY_TO_CWL_TYPES = {
    'integer': 'integer',
    'float': 'float',
    'data': 'File',
    'boolean': 'boolean',
    'text': 'text'
}


[docs]def to_cwl_job(tool, param_dict, local_working_directory): """ tool is Galaxy's representation of the tool and param_dict is the parameter dictionary with wrapped values. """ inputs = tool.inputs input_json = {} inputs_dir = os.path.join(local_working_directory, "_inputs") def simple_value(input, param_dict_value, cwl_type=None): # Hmm... cwl_type isn't really the cwl type in every case, # like in the case of json for instance. if cwl_type is None: input_type = input.type cwl_type = GALAXY_TO_CWL_TYPES[input_type] if cwl_type == "null": assert param_dict_value is None return None if cwl_type == "File": dataset_wrapper = param_dict_value extra_files_path = dataset_wrapper.extra_files_path secondary_files_path = os.path.join(extra_files_path, "__secondary_files__") path = str(dataset_wrapper) if os.path.exists(secondary_files_path): safe_makedirs(inputs_dir) name = os.path.basename(path) new_input_path = os.path.join(inputs_dir, name) os.symlink(path, new_input_path) for secondary_file_name in os.listdir(secondary_files_path): secondary_file_path = os.path.join(secondary_files_path, secondary_file_name) os.symlink(secondary_file_path, new_input_path + secondary_file_name) path = new_input_path return {"location": path, "class": "File"} elif cwl_type == "integer": return int(str(param_dict_value)) elif cwl_type == "long": return int(str(param_dict_value)) elif cwl_type == "float": return float(str(param_dict_value)) elif cwl_type == "double": return float(str(param_dict_value)) elif cwl_type == "boolean": return string_as_bool(param_dict_value) elif cwl_type == "text": return str(param_dict_value) elif cwl_type == "json": raw_value = param_dict_value.value log.info("raw_value is %s (%s)" % (raw_value, type(raw_value))) return json.loads(raw_value) else: return str(param_dict_value) for input_name, input in inputs.items(): if input.type == "repeat": only_input = next(iter(input.inputs.values())) array_value = [] for instance in param_dict[input_name]: array_value.append(simple_value(only_input, instance[input_name[:-len("_repeat")]])) input_json[input_name[:-len("_repeat")]] = array_value elif input.type == "conditional": assert input_name in param_dict, "No value for %s in %s" % (input_name, param_dict) current_case = param_dict[input_name]["_cwl__type_"] if str(current_case) != "null": # str because it is a wrapped... case_index = input.get_current_case(current_case) case_input = input.cases[case_index].inputs["_cwl__value_"] case_value = param_dict[input_name]["_cwl__value_"] input_json[input_name] = simple_value(case_input, case_value, cwl_type=current_case) else: input_json[input_name] = simple_value(input, param_dict[input_name]) return input_json
[docs]def to_galaxy_parameters(tool, as_dict): """ Tool is Galaxy's representation of the tool and as_dict is a Galaxified representation of the input json (no paths, HDA references for instance). """ inputs = tool.inputs galaxy_request = {} def from_simple_value(input, param_dict_value, cwl_type=None): if cwl_type == "json": return json.dumps(param_dict_value) else: return param_dict_value for input_name, input in inputs.items(): as_dict_value = as_dict.get(input_name, NOT_PRESENT) galaxy_input_type = input.type if galaxy_input_type == "repeat": if input_name not in as_dict: continue only_input = next(iter(input.inputs.values())) for index, value in enumerate(as_dict_value): key = "%s_repeat_0|%s" % (input_name, only_input.name) galaxy_value = from_simple_value(only_input, value) galaxy_request[key] = galaxy_value elif galaxy_input_type == "conditional": case_strings = input.case_strings # TODO: less crazy handling of defaults... if (as_dict_value is NOT_PRESENT or as_dict_value is None) and "null" in case_strings: cwl_type = "null" elif (as_dict_value is NOT_PRESENT or as_dict_value is None): raise RequestParameterInvalidException( "Cannot translate CWL datatype - value [%s] of type [%s] with case_strings [%s]. Non-null property must be set." % ( as_dict_value, type(as_dict_value), case_strings ) ) elif isinstance(as_dict_value, bool) and "boolean" in case_strings: cwl_type = "boolean" elif isinstance(as_dict_value, int) and "integer" in case_strings: cwl_type = "integer" elif isinstance(as_dict_value, int) and "long" in case_strings: cwl_type = "long" elif isinstance(as_dict_value, (int, float)) and "float" in case_strings: cwl_type = "float" elif isinstance(as_dict_value, (int, float)) and "double" in case_strings: cwl_type = "double" elif isinstance(as_dict_value, string_types) and "string" in case_strings: cwl_type = "string" elif isinstance(as_dict_value, dict) and "src" in as_dict_value and "id" in as_dict_value: # Bit problematic... cwl_type = "File" elif "json" in case_strings and as_dict_value is not None: cwl_type = "json" else: raise RequestParameterInvalidException( "Cannot translate CWL datatype - value [%s] of type [%s] with case_strings [%s]." % ( as_dict_value, type(as_dict_value), case_strings ) ) galaxy_request["%s|_cwl__type_" % input_name] = cwl_type if cwl_type != "null": current_case_index = input.get_current_case(cwl_type) current_case_inputs = input.cases[current_case_index].inputs current_case_input = current_case_inputs["_cwl__value_"] galaxy_value = from_simple_value(current_case_input, as_dict_value, cwl_type) galaxy_request["%s|_cwl__value_" % input_name] = galaxy_value elif as_dict_value is NOT_PRESENT: continue else: galaxy_value = from_simple_value(input, as_dict_value) galaxy_request[input_name] = galaxy_value log.info("Converted galaxy_request is %s" % galaxy_request) return galaxy_request