diff --git a/src/ytdl_sub/validators/string_formatter_validators.py b/src/ytdl_sub/validators/string_formatter_validators.py index 53fbc0dc..b3a83cc1 100644 --- a/src/ytdl_sub/validators/string_formatter_validators.py +++ b/src/ytdl_sub/validators/string_formatter_validators.py @@ -12,7 +12,7 @@ from ytdl_sub.utils.exceptions import StringFormattingException from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException from ytdl_sub.validators.validators import ListValidator from ytdl_sub.validators.validators import LiteralDictValidator -from ytdl_sub.validators.validators import Validator +from ytdl_sub.validators.validators import StringValidator _fields_validator = re.compile(r"{([a-z][a-z0-9_]+?)}") @@ -47,7 +47,7 @@ def is_valid_source_variable_name(input_str: str, raise_exception: bool = False) return is_source_variable_name -class StringFormatterValidator(Validator): +class StringFormatterValidator(StringValidator): """ String that can use :class:`source variables ` @@ -73,7 +73,6 @@ class StringFormatterValidator(Validator): and would resolve to something like ``sweet_tv_show.s2022.e502.mp4``. """ - _expected_value_type = str _expected_value_type_name = "format string" _variable_not_found_error_msg_formatter = ( "Format variable '{variable_name}' does not exist. Available variables: {available_fields}" diff --git a/src/ytdl_sub/validators/validators.py b/src/ytdl_sub/validators/validators.py index 1220cfca..5bd4dbaa 100644 --- a/src/ytdl_sub/validators/validators.py +++ b/src/ytdl_sub/validators/validators.py @@ -138,6 +138,12 @@ class StringValidator(ValueValidator[str]): _expected_value_type = str _expected_value_type_name = "string" + def __init__(self, name: str, value: Any): + if isinstance(value, (int, float, bool)): + value = str(value) + + super().__init__(name, value) + class FloatValidator(ValueValidator[float]): _expected_value_type = (int, float) diff --git a/tests/unit/validators/test_dict_validator.py b/tests/unit/validators/test_dict_validator.py index 544c67eb..e1eb2aeb 100644 --- a/tests/unit/validators/test_dict_validator.py +++ b/tests/unit/validators/test_dict_validator.py @@ -42,7 +42,7 @@ class TestDictValidator: ): _ = dict_validator._validate_key(key="key_name", validator=StringValidator) - @pytest.mark.parametrize("bad_value", [True, None, {}]) + @pytest.mark.parametrize("bad_value", [None, {}, []]) def test_dict_validator_validate_key_errors_bad_validation(self, bad_value): dict_validator = DictValidator(name="parent", value={"child": bad_value}) with pytest.raises( @@ -87,7 +87,7 @@ class TestDictValidator: assert out is None - @pytest.mark.parametrize("bad_value", [True, None, {}]) + @pytest.mark.parametrize("bad_value", [None, {}, []]) def test_dict_validator_validate_key_errors_none_bad_validation(self, bad_value): dict_validator = DictValidator(name="parent", value={"child": bad_value}) with pytest.raises( diff --git a/tests/unit/validators/test_string_validator.py b/tests/unit/validators/test_string_validator.py index b495bdef..ea336b4a 100644 --- a/tests/unit/validators/test_string_validator.py +++ b/tests/unit/validators/test_string_validator.py @@ -4,16 +4,16 @@ from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.validators.validators import StringValidator -@pytest.mark.parametrize("value", ["a", "unicode 💩", ""]) +@pytest.mark.parametrize("value", ["a", "unicode 💩", "", 1, 3.14, True, False]) def test_string_validator(value): string_validator = StringValidator(name="good_str_validator", value=value) assert string_validator._name == "good_str_validator" - assert string_validator._value == value - assert string_validator.value == value + assert string_validator._value == str(value) + assert string_validator.value == str(value) -@pytest.mark.parametrize("value", [None, {}, True, 0]) -def test_bool_validator_fails_bad_value(value): +@pytest.mark.parametrize("value", [None, dict(), [], set()]) +def test_string_validator_fails_bad_value(value): with pytest.raises( ValidationException, match="Validation error in fail: should be of type string" ):