diff --git a/beets/mediafile.py b/beets/mediafile.py index 1bd7b8a47..d7a4a4e2a 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -158,7 +158,8 @@ def _safe_cast(out_type, val): else: if not isinstance(val, basestring): val = unicode(val) - match = re.match(r'[\+-]?[0-9\.]+', val.strip()) + match = re.match(r'[\+-]?([0-9]+\.?[0-9]*|[0-9]*\.[0-9]+)', + val.strip()) if match: val = match.group(0) if val: diff --git a/docs/changelog.rst b/docs/changelog.rst index 465d25e71..a5cd54bad 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -59,6 +59,7 @@ Fixes: * :doc:`/plugins/web`: A proper 404 error, instead of an internal exception, is returned when missing album art is requested. Thanks to :user:`sumpfralle`. :bug:`2011` +* Handle more float edge cases in ``safe_cast``. :bug:`2014` Other changes: diff --git a/test/test_mediafile_edge.py b/test/test_mediafile_edge.py index 17121565b..180c6ca2d 100644 --- a/test/test_mediafile_edge.py +++ b/test/test_mediafile_edge.py @@ -132,6 +132,14 @@ class InvalidValueToleranceTest(unittest.TestCase): v = _sc(float, u'+') self.assertEqual(v, 0.0) + def test_safe_cast_float_with_dot_only(self): + v = _sc(float, u'.') + self.assertEqual(v, 0.0) + + def test_safe_cast_float_with_multiple_dots(self): + v = _sc(float, u'1.0.0') + self.assertEqual(v, 1.0) + class SafetyTest(unittest.TestCase, TestHelper): def setUp(self):