"""Abstraction around cwltool and related libraries for loading a CWL artifact."""
import os
import tempfile
from typing import NamedTuple
from .cwltool_deps import (
CommentedMap,
default_loader,
ensure_cwltool_available,
load_tool,
LoadingContext,
resolve_and_validate_document,
)
[docs]class RawProcessReference(NamedTuple):
loading_context: LoadingContext
process_object: CommentedMap
uri: str
[docs]class ResolvedProcessDefinition(NamedTuple):
loading_context: LoadingContext
uri: str
raw_process_reference: RawProcessReference
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):
suffix = ""
if "#" in path:
path, suffix = path.split("#")
path = os.path.abspath(path)
uri = f"file://{path}"
loading_context = loading_context or self.loading_context()
with tempfile.TemporaryDirectory() as output_dir:
processed_path = os.path.join(output_dir, os.path.basename(path)) # noqa: F841
# if REWRITE_EXPRESSIONS:
# The cwl_expression_refactor import below doesn't work any more
# because there are now 3 cwl_v1_X_expression_refactor modules.
# 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: RawProcessReference) -> ResolvedProcessDefinition:
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,
)
return ResolvedProcessDefinition(
loading_context,
uri,
raw_process_reference,
)
schema_loader = SchemaLoader()
non_strict_non_validating_schema_loader = SchemaLoader(strict=False, validate=False)