Skip to content

Commit 749b8ce

Browse files
Merge pull request #6571 from wxtim/fix.underscores_in_integers
Assume task parameters with underscores to be strings.
2 parents b942907 + 17d7385 commit 749b8ce

File tree

4 files changed

+16
-4
lines changed

4 files changed

+16
-4
lines changed

changes.d/6571.fix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Disabled PEP-515-style integer coercion of task parameters containing underscores (e.g. `084_132` was becoming `84132`). This fix returns older behaviour seen in Cylc 7.

cylc/flow/config.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,6 @@ def __init__(
356356

357357
# parameter values and templates are normally needed together.
358358
self.parameters = (parameter_values, parameter_templates)
359-
360359
LOG.debug("Expanding [runtime] namespace lists and parameters")
361360

362361
# Set default parameter expansion templates if necessary.

cylc/flow/parsec/validate.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,22 +1007,30 @@ def coerce_parameter_list(cls, value, keys):
10071007
>>> CylcConfigValidator.coerce_parameter_list('a, b, c', None)
10081008
['a', 'b', 'c']
10091009
1010+
>>> CylcConfigValidator.coerce_parameter_list('084_132', None)
1011+
['084_132']
1012+
1013+
>>> CylcConfigValidator.coerce_parameter_list('072, a', None)
1014+
['072', 'a']
10101015
"""
10111016
items = []
10121017
can_only_be = None # A flag to prevent mixing str and int range
10131018
for item in cls.strip_and_unquote_list(keys, value):
10141019
values = cls.parse_int_range(item)
10151020
if values is not None:
1016-
if can_only_be == str:
1021+
if can_only_be is str:
10171022
raise IllegalValueError(
10181023
'parameter', keys, value, 'mixing int range and str')
10191024
can_only_be = int
10201025
items.extend(values)
10211026
elif cls._REC_NAME_SUFFIX.match(item): # noqa: SIM106
10221027
try:
1028+
if '_' in item:
1029+
# Disable PEP-515 int coercion; go to except block:
1030+
raise ValueError()
10231031
int(item)
10241032
except ValueError:
1025-
if can_only_be == int:
1033+
if can_only_be is int:
10261034
raise IllegalValueError(
10271035
'parameter',
10281036
keys,
@@ -1034,6 +1042,10 @@ def coerce_parameter_list(cls, value, keys):
10341042
else:
10351043
raise IllegalValueError(
10361044
'parameter', keys, value, '%s: bad value' % item)
1045+
1046+
if can_only_be is str:
1047+
return items
1048+
10371049
try:
10381050
return [int(item) for item in items]
10391051
except ValueError:

tests/unit/parsec/test_validate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ def test_coerce_parameter_list():
699699
('-15, -10, -5, -1..1', [-15, -10, -5, -1, 0, 1])]:
700700
assert validator.coerce_parameter_list(value, ['whatever']) == result
701701
# The bad
702-
for value in ['foo/bar', 'p1, 1..10', '2..3, 4, p']:
702+
for value in ['foo/bar', 'p1, 1..10', '2..3, 4, p', 'x:,']:
703703
with pytest.raises(IllegalValueError):
704704
validator.coerce_parameter_list(value, ['whatever'])
705705

0 commit comments

Comments
 (0)