diff --git a/mopidy/utils/validation.py b/mopidy/utils/validation.py index 4897f513..7eedba20 100644 --- a/mopidy/utils/validation.py +++ b/mopidy/utils/validation.py @@ -22,11 +22,13 @@ DISTINCT_FIELDS = { # TODO: _check_iterable(check, msg, **kwargs) + [check(a) for a in arg]? def _check_iterable(arg, msg, **kwargs): - """Ensure we have an iterable which is not a string.""" + """Ensure we have an iterable which is not a string or an iterator""" if isinstance(arg, compat.string_types): raise exceptions.ValidationError(msg.format(arg=arg, **kwargs)) elif not isinstance(arg, collections.Iterable): raise exceptions.ValidationError(msg.format(arg=arg, **kwargs)) + elif iter(arg) is iter(arg): + raise exceptions.ValidationError(msg.format(arg=arg, **kwargs)) def check_choice(arg, choices, msg='Expected one of {choices}, not {arg!r}'): diff --git a/tests/utils/test_validation.py b/tests/utils/test_validation.py index 67b42a4c..f211c003 100644 --- a/tests/utils/test_validation.py +++ b/tests/utils/test_validation.py @@ -72,6 +72,8 @@ def test_check_instances_with_invalid_values(): validation.check_instances(None, compat.string_types) with raises(exceptions.ValidationError): validation.check_instances([None], compat.string_types) + with raises(exceptions.ValidationError): + validation.check_instances(iter(['abc']), compat.string_types) def test_check_instances_error_message(): @@ -110,7 +112,7 @@ def test_check_field_error_message(): def test_check_query_invalid_values(): - for value in '', None, 'foo', 123, [''], [None]: + for value in '', None, 'foo', 123, [''], [None], iter(['abc']): with raises(exceptions.ValidationError): validation.check_query({'any': value}) @@ -155,6 +157,8 @@ def test_check_uris_with_invalid_values(): validation.check_uris([None]) with raises(exceptions.ValidationError): validation.check_uris(['foobar:', 'foobar']) + with raises(exceptions.ValidationError): + validation.check_uris(iter(['http://example.com'])) def test_check_uris_error_message():