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.tool_util.cwl.schema

"""Abstraction around cwltool and related libraries for loading a CWL artifact."""
import os
import tempfile
from collections import namedtuple

from .cwltool_deps import (
    default_loader,
    ensure_cwltool_available,
    load_tool,
    LoadingContext,
    resolve_and_validate_document,
)

RawProcessReference = namedtuple("RawProcessReference", ["loading_context", "process_object", "uri"])
ResolvedProcessDefinition = namedtuple("ResolvedProcessDefinition", ["loading_context", "uri", "raw_process_reference"])
REWRITE_EXPRESSIONS = False


[docs]class SchemaLoader:
[docs] def __init__(self, strict=True, validate=True): self._strict = strict self._validate = validate
@property def raw_document_loader(self): ensure_cwltool_available() return default_loader(None)
[docs] def loading_context(self): loading_context = LoadingContext() loading_context.strict = self._strict loading_context.do_validate = self._validate loading_context.loader = self.raw_document_loader loading_context.do_update = True loading_context.relax_path_checks = True return loading_context
[docs] def raw_process_reference(self, path, loading_context=None): with tempfile.TemporaryDirectory() as output_dir: suffix = "" if "#" in path: path, suffix = path.split("#") processed_path = os.path.join(output_dir, os.path.basename(path)) path = os.path.abspath(path) uri = f"file://{path}" loading_context = loading_context or self.loading_context() if REWRITE_EXPRESSIONS: from cwl_utils import cwl_expression_refactor exit_code = cwl_expression_refactor.main([output_dir, path, "--skip-some1", "--skip-some2"]) if exit_code == 0: uri = f"file://{processed_path}" if suffix: uri = f"{uri}#{suffix}" loading_context, process_object, uri = load_tool.fetch_document(uri, loadingContext=loading_context) return RawProcessReference(loading_context, process_object, uri)
[docs] def raw_process_reference_for_object(self, process_object, uri=None, loading_context=None): if uri is None: uri = "galaxy://" loading_context = loading_context or self.loading_context() process_object["id"] = uri loading_context, process_object, uri = load_tool.fetch_document(process_object, loadingContext=loading_context) return RawProcessReference(loading_context, process_object, uri)
[docs] def process_definition(self, raw_process_reference): assert raw_process_reference.loading_context is not None, "No loading context found for raw_process_reference" loading_context, uri = resolve_and_validate_document( raw_process_reference.loading_context, raw_process_reference.process_object, raw_process_reference.uri, ) process_def = ResolvedProcessDefinition( loading_context, uri, raw_process_reference, ) return process_def
[docs] def tool(self, **kwds): process_definition = kwds.get("process_definition", None) if process_definition is None: raw_process_reference = kwds.get("raw_process_reference", None) if raw_process_reference is None: raw_process_reference = self.raw_process_reference(kwds["path"]) process_definition = self.process_definition(raw_process_reference) tool = load_tool.make_tool( process_definition.uri, process_definition.loading_context, ) return tool
schema_loader = SchemaLoader() non_strict_non_validating_schema_loader = SchemaLoader(strict=False, validate=False)