diff --git a/beets/library.py b/beets/library.py index 40265231e..6450af9c7 100644 --- a/beets/library.py +++ b/beets/library.py @@ -452,6 +452,10 @@ class RegexpQuery(FieldQuery): def match(self, item): value = getattr(item, self.field) or '' + if value is None: + value = u'' + elif not isinstance(value, basestring): + value = unicode(value) return self.regexp.search(value) is not None class BooleanQuery(MatchQuery): diff --git a/docs/changelog.rst b/docs/changelog.rst index eecd3df77..bc4815dcf 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -12,6 +12,7 @@ Changelog * Fix album queries for ``artpath`` and other non-item fields. * Null values in the database can now be matched with the empty-string regular expression, ``^$``. +* Regular expressions more reliably match non-string values. * :doc:`/plugins/fetchart`: Fix a bug where cover art filenames could lack a ``.jpg`` extension. * :doc:`/plugins/lyrics`: Fix an exception with non-ASCII lyrics. diff --git a/test/test_query.py b/test/test_query.py index 5a4debefc..6dc212a8a 100644 --- a/test/test_query.py +++ b/test/test_query.py @@ -302,6 +302,22 @@ class MemoryGetTest(unittest.TestCase, AssertsMixin): self.assert_matched(results, u'caf\xe9') self.assert_done(results) +class MatchTest(unittest.TestCase): + def setUp(self): + self.item = _common.item() + + def test_regex_match_positive(self): + q = beets.library.RegexpQuery('album', '^the album$') + self.assertTrue(q.match(self.item)) + + def test_regex_match_negative(self): + q = beets.library.RegexpQuery('album', '^album$') + self.assertFalse(q.match(self.item)) + + def test_regex_match_non_string_value(self): + q = beets.library.RegexpQuery('disc', '^6$') + self.assertTrue(q.match(self.item)) + class PathQueryTest(unittest.TestCase, AssertsMixin): def setUp(self): self.lib = beets.library.Library(':memory:')