Skip to content

Commit 0ab1d42

Browse files
authored
parsers: don't sort entries when processing ID Maps (#343)
regenerated with common-workflow-language/schema_salad#899
1 parent beccfa6 commit 0ab1d42

File tree

10 files changed

+159
-6
lines changed

10 files changed

+159
-6
lines changed

cwl_utils/parser/cwl_v1_0.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ def load(
950950
) -> Any:
951951
if isinstance(doc, MutableMapping):
952952
r: list[Any] = []
953-
for k in sorted(doc.keys()):
953+
for k in doc.keys():
954954
val = doc[k]
955955
if isinstance(val, CommentedMap):
956956
v = copy.copy(val)

cwl_utils/parser/cwl_v1_0_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from collections import namedtuple
66
from collections.abc import MutableMapping, MutableSequence
77
from io import StringIO
8-
from typing import Any, IO, Optional, Union, cast
8+
from typing import IO, Any, Optional, Union, cast
99
from urllib.parse import urldefrag
1010

1111
from schema_salad.exceptions import ValidationException

cwl_utils/parser/cwl_v1_1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ def load(
950950
) -> Any:
951951
if isinstance(doc, MutableMapping):
952952
r: list[Any] = []
953-
for k in sorted(doc.keys()):
953+
for k in doc.keys():
954954
val = doc[k]
955955
if isinstance(val, CommentedMap):
956956
v = copy.copy(val)

cwl_utils/parser/cwl_v1_1_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from collections import namedtuple
66
from collections.abc import MutableMapping, MutableSequence
77
from io import StringIO
8-
from typing import Any, IO, Optional, Union, cast
8+
from typing import IO, Any, Optional, Union, cast
99
from urllib.parse import urldefrag
1010

1111
from schema_salad.exceptions import ValidationException

cwl_utils/parser/cwl_v1_2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ def load(
950950
) -> Any:
951951
if isinstance(doc, MutableMapping):
952952
r: list[Any] = []
953-
for k in sorted(doc.keys()):
953+
for k in doc.keys():
954954
val = doc[k]
955955
if isinstance(val, CommentedMap):
956956
v = copy.copy(val)

cwl_utils/parser/cwl_v1_2_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from collections import namedtuple
66
from collections.abc import MutableMapping, MutableSequence
77
from io import StringIO
8-
from typing import Any, IO, Optional, Union, cast
8+
from typing import IO, Any, Optional, Union, cast
99
from urllib.parse import urldefrag
1010

1111
from schema_salad.exceptions import ValidationException

testdata/map-ordering-v1_0.cwl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
cwlVersion: v1.0
2+
class: Workflow
3+
inputs:
4+
09first_input: string
5+
05second_input: int
6+
01third_input: File
7+
steps:
8+
zz_step_one:
9+
run:
10+
class: ExpressionTool
11+
inputs: []
12+
outputs: []
13+
expression: ${return {}; }
14+
requirements:
15+
InlineJavascriptRequirement: {}
16+
in: []
17+
out: []
18+
00_step_two:
19+
out: []
20+
run:
21+
inputs: []
22+
requirements:
23+
InlineJavascriptRequirement: {}
24+
outputs: []
25+
expression: ${return {}; }
26+
class: ExpressionTool
27+
in: []
28+
outputs:
29+
zz_first_output:
30+
type: File
31+
outputSource: 01third_input
32+
ll_second_output:
33+
type: string
34+
outputSource: 09first_input
35+
aa_third_output:
36+
type: int
37+
outputSource: 05second_input

testdata/map-ordering-v1_1.cwl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
cwlVersion: v1.1
2+
class: Workflow
3+
inputs:
4+
09first_input: string
5+
05second_input: int
6+
01third_input: File
7+
steps:
8+
zz_step_one:
9+
run:
10+
class: ExpressionTool
11+
inputs: []
12+
outputs: []
13+
expression: ${return {}; }
14+
requirements:
15+
InlineJavascriptRequirement: {}
16+
in: []
17+
out: []
18+
00_step_two:
19+
out: []
20+
run:
21+
inputs: []
22+
requirements:
23+
InlineJavascriptRequirement: {}
24+
outputs: []
25+
expression: ${return {}; }
26+
class: ExpressionTool
27+
in: []
28+
outputs:
29+
zz_first_output:
30+
type: File
31+
outputSource: 01third_input
32+
ll_second_output:
33+
type: string
34+
outputSource: 09first_input
35+
aa_third_output:
36+
type: int
37+
outputSource: 05second_input

testdata/map-ordering-v1_2.cwl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
cwlVersion: v1.2
2+
class: Workflow
3+
inputs:
4+
09first_input: string
5+
05second_input: int
6+
01third_input: File
7+
steps:
8+
zz_step_one:
9+
run:
10+
class: ExpressionTool
11+
inputs: []
12+
outputs: []
13+
expression: ${return {}; }
14+
requirements:
15+
InlineJavascriptRequirement: {}
16+
in: []
17+
out: []
18+
00_step_two:
19+
out: []
20+
run:
21+
inputs: []
22+
requirements:
23+
InlineJavascriptRequirement: {}
24+
outputs: []
25+
expression: ${return {}; }
26+
class: ExpressionTool
27+
in: []
28+
outputs:
29+
zz_first_output:
30+
type: File
31+
outputSource: 01third_input
32+
ll_second_output:
33+
type: string
34+
outputSource: 09first_input
35+
aa_third_output:
36+
type: int
37+
outputSource: 05second_input

tests/test_parser.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,45 @@ def test_graph_load_all() -> None:
121121
uri = Path(get_data("testdata/js-expr-req-wf.cwl")).resolve().as_uri()
122122
cwl_objs = load_document_by_uri(uri, load_all=True)
123123
assert len(cwl_objs) == 2
124+
125+
126+
def test_map_ordering_v1_0() -> None:
127+
"""Confirm that ID map entries are not sorted during parsing, CWL v1.0."""
128+
uri = Path(get_data("testdata/map-ordering-v1_0.cwl")).resolve().as_uri()
129+
cwl_obj = load_document_by_uri(uri)
130+
assert cwl_obj.inputs[0].id == f"{uri}#09first_input"
131+
assert cwl_obj.inputs[1].id == f"{uri}#05second_input"
132+
assert cwl_obj.inputs[2].id == f"{uri}#01third_input"
133+
assert cwl_obj.steps[0].id == f"{uri}#zz_step_one"
134+
assert cwl_obj.steps[1].id == f"{uri}#00_step_two"
135+
assert cwl_obj.outputs[0].id == f"{uri}#zz_first_output"
136+
assert cwl_obj.outputs[1].id == f"{uri}#ll_second_output"
137+
assert cwl_obj.outputs[2].id == f"{uri}#aa_third_output"
138+
139+
140+
def test_map_ordering_v1_1() -> None:
141+
"""Confirm that ID map entries are not sorted during parsing, CWL v1.1."""
142+
uri = Path(get_data("testdata/map-ordering-v1_1.cwl")).resolve().as_uri()
143+
cwl_obj = load_document_by_uri(uri)
144+
assert cwl_obj.inputs[0].id == f"{uri}#09first_input"
145+
assert cwl_obj.inputs[1].id == f"{uri}#05second_input"
146+
assert cwl_obj.inputs[2].id == f"{uri}#01third_input"
147+
assert cwl_obj.steps[0].id == f"{uri}#zz_step_one"
148+
assert cwl_obj.steps[1].id == f"{uri}#00_step_two"
149+
assert cwl_obj.outputs[0].id == f"{uri}#zz_first_output"
150+
assert cwl_obj.outputs[1].id == f"{uri}#ll_second_output"
151+
assert cwl_obj.outputs[2].id == f"{uri}#aa_third_output"
152+
153+
154+
def test_map_ordering_v1_2() -> None:
155+
"""Confirm that ID map entries are not sorted during parsing, CWL v1.2."""
156+
uri = Path(get_data("testdata/map-ordering-v1_2.cwl")).resolve().as_uri()
157+
cwl_obj = load_document_by_uri(uri)
158+
assert cwl_obj.inputs[0].id == f"{uri}#09first_input"
159+
assert cwl_obj.inputs[1].id == f"{uri}#05second_input"
160+
assert cwl_obj.inputs[2].id == f"{uri}#01third_input"
161+
assert cwl_obj.steps[0].id == f"{uri}#zz_step_one"
162+
assert cwl_obj.steps[1].id == f"{uri}#00_step_two"
163+
assert cwl_obj.outputs[0].id == f"{uri}#zz_first_output"
164+
assert cwl_obj.outputs[1].id == f"{uri}#ll_second_output"
165+
assert cwl_obj.outputs[2].id == f"{uri}#aa_third_output"

0 commit comments

Comments
 (0)