1
+ # pylint: disable=unused-import
2
+ """Loads a CWL document."""
3
+
1
4
import os
2
5
import logging
3
6
import re
4
7
import urlparse
5
- import sys
6
- import json
7
8
from schema_salad .ref_resolver import Loader
8
9
import schema_salad .validate as validate
9
10
import schema_salad .schema as schema
11
+ from avro .schema import Names
10
12
from . import update
11
13
from . import process
14
+ from .process import Process , shortname
12
15
from .errors import WorkflowException
16
+ from typing import Any , Callable , cast , Dict , Tuple , Union
13
17
14
- _logger = logging .getLogger ("cwltool" )
15
18
16
19
def fetch_document (argsworkflow ):
20
+ # type: (Union[str, unicode, dict[unicode, Any]]) -> Tuple[Loader, Dict[unicode, Any], unicode]
21
+ """Retrieve a CWL document."""
17
22
document_loader = Loader ({"cwl" : "https://w3id.org/cwl/cwl#" , "id" : "@id" })
18
23
19
- jobobj = None
20
- uri = None # type: str
24
+ uri = None # type: unicode
21
25
workflowobj = None # type: Dict[unicode, Any]
22
- if isinstance (argsworkflow , basestring ):
26
+ if isinstance (argsworkflow , ( str , unicode ) ):
23
27
split = urlparse .urlsplit (argsworkflow )
24
28
if split .scheme :
25
29
uri = argsworkflow
26
30
else :
27
31
uri = "file://" + os .path .abspath (argsworkflow )
28
- fileuri , urifrag = urlparse .urldefrag (uri )
32
+ fileuri = urlparse .urldefrag (uri )[ 0 ]
29
33
workflowobj = document_loader .fetch (fileuri )
30
34
elif isinstance (argsworkflow , dict ):
31
35
workflowobj = argsworkflow
32
36
uri = "#" + str (id (argsworkflow ))
33
37
else :
34
- raise validate .ValidationException ("Must be URI or object: '%s'" % argsworkflow )
38
+ raise validate .ValidationException (
39
+ "Must be URI or object: '%s'" % argsworkflow )
35
40
36
41
return document_loader , workflowobj , uri
37
42
38
43
39
44
def validate_document (document_loader , workflowobj , uri ,
40
45
enable_dev = False , strict = True , preprocess_only = False ):
46
+ # type: (Loader, Dict[unicode, Any], unicode, bool, bool, bool) -> Tuple[Loader, Names, Any, Dict[str, str], unicode]
47
+ """Validate a CWL document."""
41
48
jobobj = None
42
49
if "cwl:tool" in workflowobj :
43
50
jobobj = workflowobj
44
51
uri = urlparse .urljoin (uri , jobobj ["cwl:tool" ])
45
52
del jobobj ["cwl:tool" ]
46
- workflowobj = fetch_document (uri )
53
+ workflowobj = fetch_document (uri )[ 1 ]
47
54
48
55
if isinstance (workflowobj , list ):
49
56
workflowobj = {
50
57
"$graph" : workflowobj
51
58
}
52
59
53
- fileuri , urifrag = urlparse .urldefrag (uri )
60
+ fileuri = urlparse .urldefrag (uri )[ 0 ]
54
61
55
62
if "cwlVersion" in workflowobj :
56
- workflowobj ["cwlVersion" ] = re .sub (r"^(?:cwl:|https://w3id.org/cwl/cwl#)" , "" , workflowobj ["cwlVersion" ])
63
+ workflowobj ["cwlVersion" ] = re .sub (
64
+ r"^(?:cwl:|https://w3id.org/cwl/cwl#)" , "" ,
65
+ workflowobj ["cwlVersion" ])
57
66
else :
58
67
_logger .warn ("No cwlVersion found, treating this file as draft-2." )
59
68
workflowobj ["cwlVersion" ] = "draft-2"
60
69
61
70
if workflowobj ["cwlVersion" ] == "draft-2" :
62
- workflowobj = update ._draft2toDraft3dev1 (workflowobj , document_loader , uri , updateSteps = False )
71
+ workflowobj = update ._draft2toDraft3dev1 (
72
+ workflowobj , document_loader , uri , update_steps = False )
63
73
if "@graph" in workflowobj :
64
74
workflowobj ["$graph" ] = workflowobj ["@graph" ]
65
75
del workflowobj ["@graph" ]
66
76
67
- (document_loader , avsc_names , schema_metadata , schema_loader ) = process .get_schema (workflowobj ["cwlVersion" ])
77
+ (document_loader , avsc_names ) = \
78
+ process .get_schema (workflowobj ["cwlVersion" ])[:2 ]
68
79
69
80
if isinstance (avsc_names , Exception ):
70
81
raise avsc_names
@@ -83,26 +94,33 @@ def validate_document(document_loader, workflowobj, uri,
83
94
document_loader .validate_links (processobj )
84
95
schema .validate_doc (avsc_names , processobj , document_loader , strict )
85
96
86
- if metadata .get ("cwlVersion" ) != update .latest :
87
- processobj = update .update (processobj , document_loader , fileuri , enable_dev , metadata )
97
+ if metadata .get ("cwlVersion" ) != update .LATEST :
98
+ processobj = update .update (
99
+ processobj , document_loader , fileuri , enable_dev , metadata )
88
100
89
101
if jobobj :
90
102
metadata ["cwl:defaults" ] = jobobj
91
103
92
104
return document_loader , avsc_names , processobj , metadata , uri
93
105
94
106
95
- def make_tool (document_loader , avsc_names , processobj , metadata , uri , makeTool , kwargs ):
96
- processobj , _ = document_loader .resolve_ref (uri )
107
+ def make_tool (document_loader , avsc_names , processobj , metadata , uri , makeTool ,
108
+ kwargs ):
109
+ # type: (Loader, Names, Dict[str, Any], Dict[str, Any], unicode, Callable[..., Process], Dict[str, Any]) -> Process
110
+ """Make a Python CWL object."""
111
+ resolveduri = document_loader .resolve_ref (uri )[0 ]
97
112
98
- if isinstance (processobj , list ):
99
- if 1 == len ( processobj ) :
100
- processobj = processobj [0 ]
113
+ if isinstance (resolveduri , list ):
114
+ if len ( resolveduri ) == 1 :
115
+ processobj = resolveduri [0 ]
101
116
else :
102
- raise WorkflowException (u"Tool file contains graph of multiple objects, "
103
- "must specify one of #%s" %
104
- ", #" .join (urlparse .urldefrag (i ["id" ])[1 ]
105
- for i in processobj if "id" in i ))
117
+ raise WorkflowException (
118
+ u"Tool file contains graph of multiple objects, must specify "
119
+ "one of #%s" % ", #" .join (
120
+ urlparse .urldefrag (i ["id" ])[1 ] for i in resolveduri
121
+ if "id" in i ))
122
+ else :
123
+ processobj = cast (Dict [str , Any ], resolveduri )
106
124
107
125
kwargs = kwargs .copy ()
108
126
kwargs .update ({
@@ -111,25 +129,24 @@ def make_tool(document_loader, avsc_names, processobj, metadata, uri, makeTool,
111
129
"avsc_names" : avsc_names ,
112
130
"metadata" : metadata
113
131
})
114
- t = makeTool (processobj , ** kwargs )
132
+ tool = makeTool (processobj , ** kwargs )
115
133
116
134
if "cwl:defaults" in metadata :
117
135
jobobj = metadata ["cwl:defaults" ]
118
- for inp in t .tool ["inputs" ]:
136
+ for inp in tool .tool ["inputs" ]:
119
137
if shortname (inp ["id" ]) in jobobj :
120
138
inp ["default" ] = jobobj [shortname (inp ["id" ])]
121
139
122
- return t
140
+ return tool
123
141
124
142
125
143
def load_tool (argsworkflow , makeTool , kwargs = None ,
126
144
enable_dev = False ,
127
145
strict = True ):
128
-
146
+ # type: (Union[str,unicode,dict[unicode,Any]], Callable[...,Process], Dict[str, Any], bool, bool) -> Any
129
147
document_loader , workflowobj , uri = fetch_document (argsworkflow )
130
- document_loader , avsc_names , processobj , metadata , uri = validate_document (document_loader ,
131
- workflowobj ,
132
- uri ,
133
- enable_dev = enable_dev ,
134
- strict = strict )
135
- return make_tool (document_loader , avsc_names , processobj , metadata , uri , makeTool , kwargs if kwargs else {})
148
+ document_loader , avsc_names , processobj , metadata , uri = validate_document (
149
+ document_loader , workflowobj , uri , enable_dev = enable_dev ,
150
+ strict = strict )
151
+ return make_tool (document_loader , avsc_names , processobj , metadata , uri ,
152
+ makeTool , kwargs if kwargs else {})
0 commit comments