Skip to content

Commit 576204e

Browse files
authored
Merge branch 'main' into mlin/hints-grammar
2 parents 972b96b + beaa9a9 commit 576204e

File tree

5 files changed

+108
-12
lines changed

5 files changed

+108
-12
lines changed

WDL/Tree.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,30 @@ class StructTypeDef(SourceNode):
5959
there. The referenced definition might itself be imported from yet another document.
6060
"""
6161

62+
parameter_meta: Dict[str, Any]
63+
""":type: Dict[str,Any]
64+
65+
``parameter_meta{}`` section as a JSON-like dict"""
66+
67+
meta: Dict[str, Any]
68+
""":type: Dict[str,Any]
69+
70+
``meta{}`` section as a JSON-like dict"""
71+
6272
def __init__(
6373
self,
6474
pos: SourcePosition,
6575
name: str,
6676
members: Dict[str, Type.Base],
77+
parameter_meta: Dict[str, Any],
78+
meta: Dict[str, Any],
6779
imported: "Optional[Tuple[Document,StructTypeDef]]" = None,
6880
) -> None:
6981
super().__init__(pos)
7082
self.name = name
7183
self.members = members
84+
self.parameter_meta = parameter_meta
85+
self.meta = meta
7286
self.imported = imported
7387

7488
@property
@@ -1963,7 +1977,9 @@ def _import_structs(doc: Document):
19631977
except KeyError:
19641978
pass
19651979
if not existing:
1966-
st2 = StructTypeDef(imp.pos, name, st.members, imported=(imp.doc, st))
1980+
st2 = StructTypeDef(
1981+
imp.pos, name, st.members, st.parameter_meta, st.meta, imported=(imp.doc, st)
1982+
)
19671983
doc.struct_typedefs = doc.struct_typedefs.bind(name, st2)
19681984

19691985

WDL/_grammar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
bound_decl: type CNAME "=" expr -> decl
108108
?any_decl: unbound_decl | bound_decl
109109
110-
struct: "struct" CNAME "{" unbound_decl* "}"
110+
struct: "struct" CNAME "{" (unbound_decl | meta_section)* "}"
111111
112112
///////////////////////////////////////////////////////////////////////////////////////////////////
113113
// type

WDL/_parser.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -598,14 +598,32 @@ def struct(self, meta, items):
598598
name = items[0]
599599
self._check_keyword(self._sp(meta), name)
600600
members = {}
601-
for d in items[1:]:
602-
assert not d.expr
603-
if d.name in members:
604-
raise Error.MultipleDefinitions(
605-
self._sp(meta), f"duplicate struct member '{d.name}'"
606-
)
607-
members[d.name] = d.type
608-
return Tree.StructTypeDef(self._sp(meta), name, members)
601+
parameter_meta = None
602+
meta_section = None
603+
for item in items[1:]:
604+
if isinstance(item, dict):
605+
if "meta" in item:
606+
if meta_section is not None:
607+
raise Error.MultipleDefinitions(
608+
self._sp(meta), "redundant struct meta sections"
609+
)
610+
meta_section = item["meta"]
611+
elif "parameter_meta" in item:
612+
if parameter_meta is not None:
613+
raise Error.MultipleDefinitions(
614+
self._sp(meta), "redundant struct parameter_meta sections"
615+
)
616+
parameter_meta = item["parameter_meta"]
617+
else:
618+
assert False
619+
elif isinstance(item, Tree.Decl):
620+
assert not item.expr
621+
if item.name in members:
622+
raise Error.MultipleDefinitions(
623+
self._sp(meta), f"duplicate struct member '{item.name}'"
624+
)
625+
members[item.name] = item.type
626+
return Tree.StructTypeDef(self._sp(meta), name, members, parameter_meta, meta_section)
609627

610628
def import_alias(self, meta, items):
611629
assert len(items) == 2

tests/spec_tests/config.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ wdl-1.2:
3737
- chunk_array.wdl
3838
- file_sizes_task.wdl
3939
- multi_nested_inputs.wdl
40-
- import_structs.wdl
4140
- join_paths_task.wdl
4241
- one_mount_point_task.wdl
43-
- person_struct_task.wdl
4442
- string_to_file.wdl
4543
- test_contains.wdl
4644
- test_find_task.wdl
@@ -54,6 +52,7 @@ wdl-1.2:
5452
- map_to_struct.wdl # issue #712
5553
- multiline_string_placeholders.wdl # wrong namespace in expected output
5654
- nested_scatter.wdl # expected output is wrong
55+
- person_struct_task.wdl # erroneous use of bash -gt to compare Float and Int
5756
- placeholders.wdl # wrong namespace in expected output
5857
- placeholder_none.wdl # questionable claim that interpolations should swallow errors
5958
- primitive_literals.wdl # expected output is wrong

tests/test_1doc.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1930,6 +1930,69 @@ def test_parser(self):
19301930
with self.assertRaises(WDL.Error.MultipleDefinitions):
19311931
doc = WDL.parse_document(doc)
19321932

1933+
def test_meta(self):
1934+
doc = r"""
1935+
version 1.2
1936+
1937+
struct Person {
1938+
meta {
1939+
description: "Something"
1940+
more_stuff: "Also here"
1941+
coolness: 7
1942+
}
1943+
String name
1944+
parameter_meta {
1945+
name: "A name"
1946+
age: "An age"
1947+
}
1948+
Int age
1949+
}
1950+
"""
1951+
doc = WDL.parse_document(doc)
1952+
doc.typecheck()
1953+
struct = doc.struct_typedefs.resolve("Person")
1954+
self.assertEqual(struct.meta["description"], "Something")
1955+
self.assertEqual(struct.meta["more_stuff"], "Also here")
1956+
self.assertEqual(struct.meta["coolness"].value, 7)
1957+
self.assertEqual(struct.parameter_meta["name"], "A name")
1958+
self.assertEqual(struct.parameter_meta["age"], "An age")
1959+
1960+
doc = r"""
1961+
version 1.2
1962+
1963+
struct Person {
1964+
meta {
1965+
description: "Something"
1966+
}
1967+
String name
1968+
meta {
1969+
description2: "Something else"
1970+
}
1971+
Int age
1972+
}
1973+
"""
1974+
with self.assertRaises(WDL.Error.MultipleDefinitions):
1975+
doc = WDL.parse_document(doc)
1976+
1977+
doc = r"""
1978+
version 1.2
1979+
1980+
struct Person {
1981+
parameter_meta {
1982+
name: "A name"
1983+
age: "An age"
1984+
}
1985+
String name
1986+
Int age
1987+
parameter_meta {
1988+
name: "A name"
1989+
age: "An age"
1990+
}
1991+
}
1992+
"""
1993+
with self.assertRaises(WDL.Error.MultipleDefinitions):
1994+
doc = WDL.parse_document(doc)
1995+
19331996
def test_decl(self):
19341997
doc = r"""
19351998
version 1.0

0 commit comments

Comments
 (0)