def test_re(self):
     for s in ["album = /i hate/", "artist = /pi*/", "title = /x.y/"]:
         self.failUnless(Query(s).search(self.s1))
         self.failIf(Query(s).search(self.s2))
     f = Query("artist = /mu|piman/").search
     self.failUnless(f(self.s1))
     self.failUnless(f(self.s2))
Example #2
0
    def GetSubsearchResultSet(self, previous_results, terms):
        query = Query("")
        for term in terms:
            query &= Query(term)

        songs = get_songs_for_ids(app.library, previous_results)
        ids = [get_song_id(s) for s in songs if query.search(s)]
        return ids
Example #3
0
    def GetInitialResultSet(self, terms):
        if terms:
            query = Query("")
            for term in terms:
                query &= Query(term)
            songs = filter(query.search, app.library)
        else:
            songs = app.library.values()

        ids = [get_song_id(s) for s in songs]
        return ids
    def test_dumb_search_value_negate(self):
        self.failUnless(Query("!xyz").search(self.s1))
        self.failUnless(Query("!!!xyz").search(self.s1))
        self.failUnless(Query(" !!!&(xyz, zyx)").search(self.s1))
        self.failIf(Query("!man").search(self.s1))

        self.failUnless(Query("&(tests,piman)").search(self.s1))
        self.failUnless(Query("&(tests,!nope)").search(self.s1))
        self.failIf(Query("&(tests,!!nope)").search(self.s1))
        self.failIf(Query("&(tests,!piman)").search(self.s1))
        self.failUnless(Query("&(tests,|(foo,&(pi,!nope)))").search(self.s1))
Example #5
0
 def query(self, key):
     if key not in self.__CACHE:
         text, filter_ = self.GENRES[key]
         if filter_ is None:
             filter_ = key
         self.__CACHE[key] = Query(filter_, star=self.STAR)
     return self.__CACHE[key]
Example #6
0
    def __filter_changed(self, bar, text, restore=False):
        self.__filter = None
        if not Query.match_all(text):
            self.__filter = Query(text, self.STAR)

        if not restore:
            self.activate()
Example #7
0
 def search(self, text):
     try:
         filt = Query(text).search
     except Query.error:
         return []
     else:
         return [Tag(self, track) for track in filter(filt, self._tracks)]
Example #8
0
def background_filter():
    bg = config.get("browsers", "background").decode('utf-8')
    if not bg:
        return
    try:
        return Query(bg, SongList.star).search
    except Query.error:
        pass
Example #9
0
    def __update_filter(self, entry, text):
        self.__filter = None
        if not Query.match_all(text):
            tags = self.__model.tags + ["album"]
            self.__filter = Query(text, star=tags).search
        self.__bg_filter = background_filter()

        self.view.get_model().refilter()
Example #10
0
    def query(self, text, sort=None, star=Query.STAR):
        """Query the library and return matching songs."""
        if isinstance(text, str):
            text = text.decode('utf-8')

        songs = self.values()
        if text != "":
            songs = filter(Query(text, star).search, songs)
        return songs
 def test_case(self):
     self.failUnless(Query("album = /i hate/").search(self.s1))
     self.failUnless(Query("album = /I Hate/").search(self.s1))
     self.failUnless(Query("album = /i Hate/").search(self.s1))
     self.failUnless(Query("album = /i Hate/i").search(self.s1))
     self.failUnless(Query(u"title = /ångström/").search(self.s4))
     self.failIf(Query("album = /i hate/c").search(self.s1))
     self.failIf(Query(u"title = /ångström/c").search(self.s4))
    def test_and_or_operator(self):
        union = Query("|(foo=bar,bar=foo)")
        inter = Query("&(foo=bar,bar=foo)")
        neg = Query("foo=!bar")
        numcmp = Query("#(bar = 0)")
        tag = Query("foo=bar")

        tests = [
            inter | tag, tag | tag, neg | neg, tag | inter, neg | union,
            union | union, inter | inter, numcmp | numcmp, numcmp | union
        ]

        self.failIf(filter(lambda x: not isinstance(x, type(union)), tests))

        tests = [
            inter & tag, tag & tag, neg & neg, tag & inter, neg & union,
            union & union, inter & inter, numcmp & numcmp, numcmp & inter
        ]

        self.failIf(filter(lambda x: not isinstance(x, type(inter)), tests))
Example #13
0
 def activate(self):
     text = self._get_text()
     if Query.is_parsable(text):
         star = dict.fromkeys(SongList.star)
         star.update(self.__star)
         self._filter = Query(text, star.keys()).search
         songs = filter(self._filter, self._library)
         bg = background_filter()
         if bg:
             songs = filter(bg, songs)
         self._panes[0].fill(songs)
Example #14
0
 def _get_songs(self):
     try:
         self._filter = Query(self._text, star=SongList.star).search
     except Query.error:
         pass
     else:
         if Query.match_all(self._text):
             songs = self._library.values()
             self._filter = None
         else:
             songs = filter(self._filter, self._library)
         return songs
 def test_trinary(self):
     self.failUnless(Query("#(11 < track < 13)").search(self.s2))
     self.failUnless(Query("#(11 < track <= 12)").search(self.s2))
     self.failUnless(Query("#(12 <= track <= 12)").search(self.s2))
     self.failUnless(Query("#(12 <= track < 13)").search(self.s2))
     self.failUnless(Query("#(13 > track > 11)").search(self.s2))
     self.failUnless(Query("#(20 > track < 20)").search(self.s2))
Example #16
0
    def __update_filter(self, entry, text, scroll_up=True, restore=False):
        model = self.view.get_model()

        self.__filter = None
        if not Query.match_all(text):
            self.__filter = Query(text, star=["~people", "album"]).search
        self.__bg_filter = background_filter()

        self.__inhibit()

        # We could be smart and try to scroll to a selected album
        # but that introduces lots of wild scrolling. Feel free to change it.
        # Without scrolling the TV trys to stay at the same position (40% down)
        # which makes no sence so always go to the top.
        if scroll_up:
            self.view.scroll_to_point(0, 0)

        # don't filter on restore if there is nothing to filter
        if not restore or self.__filter or self.__bg_filter:
            model.refilter()

        self.__uninhibit()
 def test_newlines(self):
     self.failUnless(Query("a = /\n/").search(self.s3))
     self.failUnless(Query("a = /\\n/").search(self.s3))
     self.failIf(Query("a = /\n/").search(self.s2))
     self.failIf(Query("a = /\\n/").search(self.s2))
 def test_exp_or(self):
     self.failUnless(Query("|(album = ate, artist = man)").search(self.s1))
     self.failUnless(Query("|(album = ate, artist = nam)").search(self.s1))
     self.failIf(Query("&(album = tea, artist = nam)").search(self.s1))
 def test_filename_utf8_fallback(self):
     self.failUnless(Query(u"filename=foü.ogg").search(self.s3))
     self.failUnless(Query(u"filename=öä").search(self.s3))
 def test_dumb_search_value(self):
     self.failUnless(Query("|(ate, foobar)").search(self.s1))
     self.failUnless(Query("!!|(ate, foobar)").search(self.s1))
     self.failUnless(Query("&(ate, te)").search(self.s1))
     self.failIf(Query("|(foo, bar)").search(self.s1))
     self.failIf(Query("&(ate, foobar)").search(self.s1))
     self.failIf(Query("! !&(ate, foobar)").search(self.s1))
     self.failIf(Query("&blah").search(self.s1))
     self.failUnless(Query("&blah oh").search(self.s5))
     self.failUnless(Query("!oh no").search(self.s5))
     self.failIf(Query("|blah").search(self.s1))
     # http://code.google.com/p/quodlibet/issues/detail?id=1056
     self.failUnless(Query("&(ate, piman)").search(self.s1))
 def test_empty(self):
     self.failUnless(Query.is_valid(''))
     self.failUnless(Query.is_parsable(''))
     self.failUnless(Query(''))
 def test_re_or(self):
     self.failUnless(Query("album = |(/ate/,/est/)").search(self.s1))
     self.failUnless(Query("album = |(/ate/,/ets/)").search(self.s1))
     self.failIf(Query("album = |(/tate/, /ets/)").search(self.s1))
 def test_search_almostequal(self):
     a, b = self.AF({"~#rating": 0.771}), self.AF({"~#rating": 0.769})
     self.failUnless(Query("#(rating = 0.77)").search(a))
     self.failUnless(Query("#(rating = 0.77)").search(b))
 def test_synth_search(self):
     self.failUnless(Query("~dirname=/dir1/").search(self.s1))
     self.failUnless(Query("~dirname=/dir2/").search(self.s2))
     self.failIf(Query("~dirname=/dirty/").search(self.s1))
     self.failIf(Query("~dirname=/dirty/").search(self.s2))
 def test_unslashed_search(self):
     self.failUnless(Query("artist=piman").search(self.s1))
     self.failUnless(Query(u"title=ång").search(self.s4))
     self.failIf(Query("artist=mu").search(self.s1))
     self.failIf(Query(u"title=äng").search(self.s4))
 def test_not_2(self):
     for s in ["album = !/i hate/", "artist = !/pi*/", "title = !/x.y/"]:
         self.failUnless(Query(s).search(self.s2))
         self.failIf(Query(s).search(self.s1))
 def test_numcmp(self):
     self.failIf(Query("#(track = 0)").search(self.s1))
     self.failIf(Query("#(notatag = 0)").search(self.s1))
     self.failUnless(Query("#(track = 12)").search(self.s2))
 def test_fs_utf8(self):
     self.failUnless(Query(u"~filename=foü.ogg").search(self.s3))
     self.failUnless(Query(u"~filename=öä").search(self.s3))
     self.failUnless(Query(u"~dirname=öäü").search(self.s3))
     self.failUnless(Query(u"~basename=ü.ogg").search(self.s3))
 def test_dumb_search_regexp(self):
     self.failUnless(Query("/(x|H)ate/").search(self.s1))
     self.failUnless(Query("'PiMan'").search(self.s1))
     self.failIf(Query("'PiMan'c").search(self.s1))
     self.failUnless(Query("!'PiMan'c").search(self.s1))
     self.failIf(Query("!/(x|H)ate/").search(self.s1))
 def test_dumb_search(self):
     self.failUnless(Query("ate man").search(self.s1))
     self.failUnless(Query("Ate man").search(self.s1))
     self.failIf(Query("woo man").search(self.s1))
     self.failIf(Query("not crazy").search(self.s1))