@@ -97,7 +97,7 @@ def match_types(sinktype, src, iid, inputobj, linkMerge, valueFrom):
97
97
98
98
99
99
def check_types (srctype , sinktype , linkMerge , valueFrom ):
100
- # type: (Union[List[Text],Text], Union[List[Text],Text] , Text, Text) -> Text
100
+ # type: (Any, Any , Text, Text) -> Text
101
101
"""Check if the source and sink types are "pass", "warning", or "exception".
102
102
"""
103
103
@@ -110,18 +110,25 @@ def check_types(srctype, sinktype, linkMerge, valueFrom):
110
110
return "warning"
111
111
else :
112
112
return "exception"
113
+ elif linkMerge == "merge_nested" :
114
+ return check_types ({"items" : srctype , "type" : "array" }, sinktype , None , None )
115
+ elif linkMerge == "merge_flattened" :
116
+ return check_types (merge_flatten_type (srctype ), sinktype , None , None )
113
117
else :
114
- if not isinstance (sinktype , dict ):
115
- return "exception"
116
- elif linkMerge == "merge_nested" :
117
- return check_types (srctype , sinktype ["items" ], None , None )
118
- elif linkMerge == "merge_flattened" :
119
- if not isinstance (srctype , dict ):
120
- return check_types (srctype , sinktype ["items" ], None , None )
121
- else :
122
- return check_types (srctype , sinktype , None , None )
123
- else :
124
- raise WorkflowException (u"Unrecognized linkMerge enum '%s'" % linkMerge )
118
+ raise WorkflowException (u"Unrecognized linkMerge enu_m '%s'" % linkMerge )
119
+
120
+
121
+ def merge_flatten_type (src ):
122
+ # type: (Any) -> Any
123
+ """Return the merge flattened type of the source type
124
+ """
125
+
126
+ if isinstance (src , list ):
127
+ return [merge_flatten_type (t ) for t in src ]
128
+ elif isinstance (src , dict ) and src .get ("type" ) == "array" :
129
+ return src
130
+ else :
131
+ return {"items" : src , "type" : "array" }
125
132
126
133
127
134
def can_assign_src_to_sink (src , sink , strict = False ): # type: (Any, Any, bool) -> bool
@@ -581,7 +588,7 @@ def static_checker(workflow_inputs, workflow_outputs, step_inputs, step_outputs)
581
588
" with sink '%s' of type %s"
582
589
% (shortname (sink ["id" ]), json .dumps (sink ["type" ])))
583
590
if linkMerge :
584
- msg += "\n " + SourceLine (sink ).makeError (" sink has linkMerge method %s" % linkMerge )
591
+ msg += "\n " + SourceLine (sink ).makeError (" source has linkMerge method %s" % linkMerge )
585
592
warning_msgs .append (msg )
586
593
for exception in exceptions :
587
594
src = exception .src
@@ -594,7 +601,7 @@ def static_checker(workflow_inputs, workflow_outputs, step_inputs, step_outputs)
594
601
" with sink '%s' of type %s"
595
602
% (shortname (sink ["id" ]), json .dumps (sink ["type" ])))
596
603
if linkMerge :
597
- msg += "\n " + SourceLine (sink ).makeError (" sink has linkMerge method %s" % linkMerge )
604
+ msg += "\n " + SourceLine (sink ).makeError (" source has linkMerge method %s" % linkMerge )
598
605
exception_msgs .append (msg )
599
606
600
607
for sink in step_inputs :
0 commit comments