diff --git a/changes.d/6571.fix.md b/changes.d/6571.fix.md new file mode 100644 index 0000000000..308013afb3 --- /dev/null +++ b/changes.d/6571.fix.md @@ -0,0 +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. diff --git a/cylc/flow/config.py b/cylc/flow/config.py index c438cd9105..dbf9316218 100644 --- a/cylc/flow/config.py +++ b/cylc/flow/config.py @@ -356,7 +356,6 @@ def __init__( # parameter values and templates are normally needed together. self.parameters = (parameter_values, parameter_templates) - LOG.debug("Expanding [runtime] namespace lists and parameters") # Set default parameter expansion templates if necessary. diff --git a/cylc/flow/parsec/validate.py b/cylc/flow/parsec/validate.py index 12e2163a89..f060695b4a 100644 --- a/cylc/flow/parsec/validate.py +++ b/cylc/flow/parsec/validate.py @@ -1007,22 +1007,30 @@ def coerce_parameter_list(cls, value, keys): >>> CylcConfigValidator.coerce_parameter_list('a, b, c', None) ['a', 'b', 'c'] + >>> CylcConfigValidator.coerce_parameter_list('084_132', None) + ['084_132'] + + >>> CylcConfigValidator.coerce_parameter_list('072, a', None) + ['072', 'a'] """ items = [] can_only_be = None # A flag to prevent mixing str and int range for item in cls.strip_and_unquote_list(keys, value): values = cls.parse_int_range(item) if values is not None: - if can_only_be == str: + if can_only_be is str: raise IllegalValueError( 'parameter', keys, value, 'mixing int range and str') can_only_be = int items.extend(values) elif cls._REC_NAME_SUFFIX.match(item): # noqa: SIM106 try: + if '_' in item: + # Disable PEP-515 int coercion; go to except block: + raise ValueError() int(item) except ValueError: - if can_only_be == int: + if can_only_be is int: raise IllegalValueError( 'parameter', keys, @@ -1034,6 +1042,10 @@ def coerce_parameter_list(cls, value, keys): else: raise IllegalValueError( 'parameter', keys, value, '%s: bad value' % item) + + if can_only_be is str: + return items + try: return [int(item) for item in items] except ValueError: diff --git a/tests/unit/parsec/test_validate.py b/tests/unit/parsec/test_validate.py index 3e24bcf636..7a3b25cd2c 100644 --- a/tests/unit/parsec/test_validate.py +++ b/tests/unit/parsec/test_validate.py @@ -699,7 +699,7 @@ def test_coerce_parameter_list(): ('-15, -10, -5, -1..1', [-15, -10, -5, -1, 0, 1])]: assert validator.coerce_parameter_list(value, ['whatever']) == result # The bad - for value in ['foo/bar', 'p1, 1..10', '2..3, 4, p']: + for value in ['foo/bar', 'p1, 1..10', '2..3, 4, p', 'x:,']: with pytest.raises(IllegalValueError): validator.coerce_parameter_list(value, ['whatever'])