diff --git a/tests/test_traitlets.py b/tests/test_traitlets.py index 3fbb676a..b6f94bfc 100644 --- a/tests/test_traitlets.py +++ b/tests/test_traitlets.py @@ -1902,9 +1902,32 @@ def coerce(self, value): obj = CRegExpTrait() _default_value = re.compile(r"") - _good_values = [r"\d+", re.compile(r"\d+")] + _good_values = [r"\d+", re.compile(r"\d+"), rb"\d+"] _bad_values = ["(", None, ()] + def test_invalid_pattern_error_message(self): + pattern = "[" + with pytest.raises(re.error) as regex_error: + re.compile(pattern) + + with pytest.raises(TraitError) as trait_error: + self.assign(pattern) + + assert str(regex_error.value) in str(trait_error.value) + + def test_invalid_pattern_error_message_in_list(self): + pattern = "[" + with pytest.raises(re.error) as regex_error: + re.compile(pattern) + + class CRegExpListTrait(HasTraits): + values = List(CRegExp()) + + with pytest.raises(TraitError) as trait_error: + CRegExpListTrait(values=[pattern]) + + assert str(regex_error.value) in str(trait_error.value) + class DictTrait(HasTraits): value = Dict() diff --git a/traitlets/traitlets.py b/traitlets/traitlets.py index 2cc239c1..ad04cf0c 100644 --- a/traitlets/traitlets.py +++ b/traitlets/traitlets.py @@ -4225,6 +4225,8 @@ class CRegExp(TraitType[re.Pattern[t.Any], re.Pattern[t.Any] | str]): def validate(self, obj: t.Any, value: t.Any) -> re.Pattern[t.Any] | None: try: return re.compile(value) + except re.error as e: + self.error(obj, value, info=f"{self.info()}: {e}") except Exception: self.error(obj, value)