Esempio n. 1
0
    def test_track_path(self, real_track, tmp_session):
        """We can query a track's path."""
        tmp_session.add(real_track)

        assert query.query(f"'path:{str(real_track.path.resolve())}'",
                           tmp_session)
        assert query.query("'path::.*'", tmp_session)
Esempio n. 2
0
    def test_extra_path(self, real_album, tmp_session):
        """We can query for Extra paths."""
        tmp_session.merge(real_album)

        extra_path_str = str(real_album.extras.pop().path.resolve())
        assert query.query(f"'extra_path:{extra_path_str}'", tmp_session)
        assert query.query("'extra_path::.*'", tmp_session)
Esempio n. 3
0
    def test_album_path(self, real_album, tmp_session):
        """We can query for Extra paths."""
        tmp_session.merge(real_album)

        assert query.query(f"'album_path:{str(real_album.path.resolve())}'",
                           tmp_session)
        assert query.query("'album_path::.*'", tmp_session)
Esempio n. 4
0
    def test_like_query(self, tmp_session, mock_track):
        """Test sql LIKE queries. '%' and '_' are wildcard characters."""
        tmp_session.add(mock_track)
        mock_track.track_num = 1

        assert query.query("track_num:_", tmp_session)
        assert query.query("track_num:%", tmp_session)
Esempio n. 5
0
    def test_multi_value_query(self, tmp_session, mock_track):
        """We should be able to query multi-value fields transparently.

        ``genre`` is a list of genres for a Track.
        """
        mock_track.genres = ["hip hop", "rock"]
        tmp_session.add(mock_track)

        assert query.query("'genre::.*'", tmp_session)
        assert query.query("'genre:hip hop'", tmp_session)
        assert query.query("genre:rock", tmp_session)
        assert query.query("genre:rock 'genre:hip hop'", tmp_session)
Esempio n. 6
0
    def test_track_album_field(self, real_track, tmp_session):
        """We should be able to query tracks that match album-related fields.

        These fields belong to the Album table and thus aren't normally exposed
        through a track.
        """
        tmp_session.add(real_track)

        assert query.query(f"'album:{real_track.album}'", tmp_session)
        assert query.query(f"'albumartist:{real_track.albumartist}'",
                           tmp_session)
        assert query.query(f"year:{real_track.year}", tmp_session)
Esempio n. 7
0
    def test_case_insensitive_field(self, tmp_session, mock_track):
        """Fields should be able to be specified case-insensitive."""
        mock_track.title = "tmp"
        mock_track.album = "tmp"
        tmp_session.add(mock_track)

        assert query.query("Title:tmp", tmp_session)
Esempio n. 8
0
    def test_case_insensitive_value(self, tmp_session, mock_track):
        """Query values should be case-insensitive."""
        mock_track.title = "TMP"
        mock_track.album = "TMP"
        tmp_session.add(mock_track)

        assert query.query("title:tmp", tmp_session)
Esempio n. 9
0
    def test_regex_case_insensitive(self, tmp_session, mock_track):
        """Regex queries should be case-insensitive."""
        mock_track.title = "TMP"
        mock_track.album = "TMP"
        tmp_session.add(mock_track)

        assert query.query("title::tmp", tmp_session)
Esempio n. 10
0
def _parse_args(
    config: Config, session: sqlalchemy.orm.session.Session, args: argparse.Namespace
):
    """Parses the given commandline arguments.

    Args:
        config: Configuration in use.
        session: Current db session.
        args: Commandline arguments to parse.

    Raises:
        SystemExit: Query returned no tracks.
    """
    if args.album:
        query_type = "album"
    elif args.extra:
        query_type = "extra"
    else:
        query_type = "track"
    items = query.query(args.query, session, query_type=query_type)

    if not items:
        raise SystemExit(1)

    for item in items:
        log.info(f"Removing '{item}' from the library.")
        session.delete(item)
Esempio n. 11
0
def _parse_args(config: Config, session: sqlalchemy.orm.session.Session,
                args: argparse.Namespace):
    """Parses the given commandline arguments.

    Args:
        config: Configuration in use.
        session: Current db session.
        args: Commandline arguments to parse.

    Raises:
        SystemExit: Query returned no tracks.
    """
    if args.album:
        query_type = "album"
    elif args.extra:
        query_type = "extra"
    else:
        query_type = "track"
    items = query.query(args.query, session, query_type=query_type)

    if not items:
        raise SystemExit(1)

    for item in items:
        if args.paths:
            print(item.path)  # noqa: WPS421
        else:
            print(item)  # noqa: WPS421
Esempio n. 12
0
def _parse_args(config: Config, session: sqlalchemy.orm.session.Session,
                args: argparse.Namespace):
    """Parses the given commandline arguments.

    Args:
        config: Configuration in use.
        session: Current db session.
        args: Commandline arguments to parse.

    Raises:
        SystemExit: Invalid field or field_value term format.
    """
    if args.album:
        query_type = "album"
    elif args.extra:
        query_type = "extra"
    else:
        query_type = "track"
    items = query.query(args.query, session, query_type=query_type)

    error_count = 0
    for term in args.fv_terms:
        for item in items:
            try:
                _edit_item(item, term)
            except EditError as exc:
                log.error(exc)
                error_count += 1

    if error_count:
        raise SystemExit(1)
Esempio n. 13
0
    def test_multiple_terms(self, tmp_session, mock_track):
        """We should be able to query for multiple terms at once."""
        mock_track.title = "C.R.E.A.M."
        tmp_session.add(mock_track)

        assert query.query(
            f"track_num:{mock_track.track_num} title:{mock_track.title}",
            tmp_session)
Esempio n. 14
0
    def test_wildcard_query(self, tmp_session, mock_track_factory):
        """'*' as a query should return all items."""
        track1 = mock_track_factory(year=2)
        track2 = mock_track_factory(year=1)

        tmp_session.merge(track1)
        tmp_session.merge(track2)

        assert len(query.query("*", tmp_session)) == 2
Esempio n. 15
0
    def test_album_query_track_fields(self, tmp_session, mock_track):
        """Album queries should still be filtered based off Track fields."""
        mock_track.album = "ATLiens"
        tmp_session.add(mock_track)

        albums = query.query("album:ATLiens", tmp_session, query_type="album")

        assert albums
        for album in albums:
            assert isinstance(album, Album)
Esempio n. 16
0
    def test_extra_query(self, mock_album, tmp_session):
        """An extra query should return Extra objects."""
        tmp_session.merge(mock_album)

        extras = query.query(f"album:'{mock_album.title}'",
                             tmp_session,
                             query_type="extra")

        assert extras
        for extra in extras:
            assert isinstance(extra, Extra)
Esempio n. 17
0
    def test_track_query(self, tmp_session, mock_track):
        """A track query should return Track objects."""
        tmp_session.add(mock_track)

        tracks = query.query(f"title:'{mock_track.title}'",
                             tmp_session,
                             query_type="track")

        assert tracks
        for track in tracks:
            assert isinstance(track, Track)
Esempio n. 18
0
    def test_album_query(self, tmp_session, mock_track):
        """An album query should return Album objects."""
        tmp_session.add(mock_track)

        albums = query.query(f"title:'{mock_track.title}'",
                             tmp_session,
                             query_type="album")

        assert albums
        for album in albums:
            assert isinstance(album, Album)
Esempio n. 19
0
    def test_like_escape_query(self, tmp_session, mock_track_factory):
        r"""We should be able to escape the LIKE wildcard characters with '/'.

        Note, I think '\' would be the preferred backslash character, but for
        some reason it doesn't work.
        """
        track1 = mock_track_factory(year=1)
        track2 = mock_track_factory(year=2)
        track1.title = "_"
        track2.title = "b"
        tmp_session.merge(track1)
        tmp_session.merge(track2)

        assert len(query.query("title:/_", tmp_session)) == 1
Esempio n. 20
0
 def test_invalid_query_str(self):
     """Invalid queries should return an empty list."""
     assert not query.query("invalid", Mock())  # invalid pattern
Esempio n. 21
0
    def test_date(self, real_track, tmp_session):
        """We can query an album's date."""
        tmp_session.add(real_track)

        assert query.query(f"'date:{str(real_track.date)}'", tmp_session)
        assert query.query("'date::.*'", tmp_session)
Esempio n. 22
0
    def test_regex_non_str(self, tmp_session, mock_track):
        """Non string fields should be converted to strings for matching."""
        tmp_session.add(mock_track)

        assert query.query("track_num::.*", tmp_session)
Esempio n. 23
0
    def test_regex(self, tmp_session, mock_track):
        """Queries can use regular expression matching."""
        tmp_session.add(mock_track)

        assert query.query("title::.*", tmp_session)
Esempio n. 24
0
    def test_space_value(self, tmp_session, mock_track):
        """If a value has whitespace, it must be encolsed by quotes."""
        mock_track.title = "Holy cow"
        tmp_session.add(mock_track)

        assert query.query("'title:Holy cow'", tmp_session)
Esempio n. 25
0
    def test_valid_query(self, mock_track, tmp_session):
        """Simplest query."""
        tmp_session.add(mock_track)

        assert query.query(f"title:'{mock_track.title}'", tmp_session)
Esempio n. 26
0
 def test_invalid_query_field(self):
     """Invalid queries should return an empty list."""
     assert not query.query("invalid:a", Mock())  # invalid field
Esempio n. 27
0
 def test_empty_query_str(self, tmp_session):
     """Empty queries should return an empty list."""
     assert not query.query("title:nope", tmp_session)
Esempio n. 28
0
    def test_invalid_regex(self, tmp_session, mock_track):
        """Invalid regex queries should return an empty list."""
        tmp_session.add(mock_track)

        assert not query.query("title::[", tmp_session)