8000 Improve parsing arrays · illusional/python-cwlgen@050e05f · GitHub
[go: up one dir, main page]

Skip to content

Commit 050e05f

Browse files
committed
Improve parsing arrays
1 parent 3d2755d commit 050e05f

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

cwlgen/utils.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ def get_required_input_params_for_cls(cls, valuesdict):
161161
def try_parse(value, types):
162162
if not types: return value
163163

164+
# If it's an array, we should call try_parse (recursively)
165+
166+
if isinstance(value, list):
167+
retval = [Serializable.try_parse(t, types) for t in value]
168+
invalid_values = get_indices_of_element_in_list([False if v is None else True for v in retval], False)
169+
if invalid_values:
170+
invalid_valuesstr = ','.join(str(i) for i in invalid_values)
171+
raise Exception(f"Couldn't parse items: {invalid_valuesstr}, corresponding to: "
172+
+ ", ".join(str(value[i] for i in invalid_values)))
173+
return retval
174+
164175
for T in types:
165176
retval = Serializable.try_parse_type(value, T)
166177
if retval:
@@ -185,7 +196,14 @@ def try_parse_type(value, T):
185196
elif isinstance(T, list):
186197
T = T[0]
187198

188-
if isinstance(value, list):
199+
if T in _unparseable_types:
200+
try:
201+
if isinstance(value, list):
202+
return [T(v) for v in value]
203+
return T(value)
204+
except:
205+
return None
206+
elif isinstance(value, list):
189207
return [T.parse_dict(vv) for vv in value]
190208
elif isinstance(value, dict):
191209
# We'll need to map the 'id' back in
@@ -198,6 +216,12 @@ def try_parse_type(value, T):
198216
raise Exception("Don't recognise type '%s', expected dictionary or list" % type(value))
199217

200218
# T is the retval, or an array of the values (because some params are allowed to be both
201-
return T.parse_dict(value) if not isinstance(value, list) else [T.parse_dict(vv) for vv in value]
219+
return T.parse_dict_generic(T, value) if not isinstance(value, list) else [T.parse_dict_generic(T, vv) for vv in value]
202220

203221

222+
def get_indices_of_element_in_list(searchable, element):
223+
indices = []
224+
for i in range(len(searchable)):
225+
if element == searchable[i]:
226+
indices.append(i)
227+
return indices

0 commit comments

Comments
 (0)
0