Exemple #1
0
def iter_project_py_files():
    root = os.path.dirname(get_module_dir(quodlibet))
    skip = setup_cfg.exclude
    for path in iter_py_files(root):
        if any((path.startswith(s + os.sep) or s == path)
               for s in skip):
            continue
        yield path
Exemple #2
0
def init_devices():
    global devices

    load_pyc = util.is_windows() or util.is_osx()
    modules = load_dir_modules(util.get_module_dir(),
                               package=__package__,
                               load_compiled=load_pyc)

    for mod in modules:
        try:
            devices.extend(mod.devices)
        except AttributeError:
            print_w("%r doesn't contain any devices." % mod.__name__)

    devices.sort(key=lambda d: repr(d))
Exemple #3
0
def init():
    """Load/Import all formats.

    Before this is called loading a file and unpickling will not work.
    """

    global mimes, loaders, types

    MinVersions.MUTAGEN.check(mutagen.version)

    base = util.get_module_dir()
    load_pyc = util.is_windows() or util.is_osx()
    formats = load_dir_modules(base,
                               package=__package__,
                               load_compiled=load_pyc)

    module_names = []
    for format in formats:
        name = format.__name__

        for ext in format.extensions:
            loaders[ext] = format.loader

        types.update(format.types)

        if format.extensions:
            for type_ in format.types:
                mimes.update(type_.mimes)
            module_names.append(name.split(".")[-1])

        # Migrate pre-0.16 library, which was using an undocumented "feature".
        sys.modules[name.replace(".", "/")] = format
        # Migrate old layout
        if name.startswith("quodlibet."):
            sys.modules[name.split(".", 1)[1]] = format

    # This can be used for the quodlibet.desktop file
    desktop_mime_types = "MimeType=" + \
        ";".join(sorted({m.split(";")[0] for m in mimes})) + ";"
    print_d(desktop_mime_types)

    s = ", ".join(sorted(module_names))
    print_d("Supported formats: %s" % s)

    if not loaders:
        raise SystemExit("No formats found!")
Exemple #4
0
def init():
    global mimes, _infos, modules, names, _extensions

    import mutagen

    MinVersions.MUTAGEN.check(mutagen.version)

    base = util.get_module_dir()
    load_pyc = util.is_windows() or util.is_osx()
    formats = load_dir_modules(base,
                               package=__package__,
                               load_compiled=load_pyc)

    for format in formats:
        name = format.__name__

        for ext in format.extensions:
            _infos[ext] = format.info

        types.extend(format.types)

        if format.extensions:
            for type_ in format.types:
                mimes.update(type_.mimes)
                names.append(type_.format)
            modules.append(name.split(".")[-1])

        # Migrate pre-0.16 library, which was using an undocumented "feature".
        sys.modules[name.replace(".", "/")] = format
        # Migrate old layout
        if name.startswith("quodlibet."):
            sys.modules[name.split(".", 1)[1]] = format

    modules.sort()
    names.sort()

    # This can be used for the quodlibet.desktop file
    desktop_mime_types = "MimeType=" + \
        ";".join(sorted({m.split(";")[0] for m in mimes})) + ";"
    print_d(desktop_mime_types)

    if not _infos:
        raise SystemExit("No formats found!")

    _extensions = tuple(_infos.keys())
Exemple #5
0
def iter_py_paths():
    """Iterates over all Python source files that are part of Quod Libet"""

    import quodlibet
    root = os.path.dirname(get_module_dir(quodlibet))

    skip = [
        os.path.join(root, "docs"),
        os.path.join(root, "quodlibet", "packages"),
    ]
    for dirpath, dirnames, filenames in os.walk(root):
        if any((dirpath.startswith(s + os.sep) or s == dirpath)
               for s in skip):
            continue

        for filename in filenames:
            if filename.endswith('.py'):
                yield os.path.join(dirpath, filename)
Exemple #6
0
def parse_setup_cfg():
    """Parses the flake8 config from the setup.cfg file in the root dir

    Returns:
        SetupConfig
    """

    base_dir = os.path.dirname(get_module_dir(quodlibet))

    cfg = os.path.join(base_dir, "setup.cfg")
    config = configparser.RawConfigParser()
    config.read(cfg)

    ignore = str(config.get("flake8", "ignore")).split(",")
    builtins = str(config.get("flake8", "builtins")).split(",")
    exclude = str(config.get("flake8", "exclude")).split(",")
    exclude = [
        os.path.join(base_dir, e.replace("/", os.sep)) for e in exclude]

    return SetupConfig(ignore, builtins, exclude)
Exemple #7
0
def init():
    """Import all browsers from this package and from the user directory.

    After this is called the global `browsers` list will contain all
    classes sorted by priority.

    Can be called multiple times.
    """

    global browsers, default

    # ignore double init (for the test suite)
    if browsers:
        return

    this_dir = util.get_module_dir()
    load_pyc = util.is_windows() or util.is_osx()
    modules = load_dir_modules(this_dir,
                               package=__package__,
                               load_compiled=load_pyc)

    for browser in modules:
        try:
            browsers.extend(browser.browsers)
        except AttributeError:
            util.print_w("%r doesn't contain any browsers." % browser.__name__)

    def is_browser(Kind):
        return isinstance(Kind, type) and issubclass(Kind, Browser)
    browsers = listfilter(is_browser, browsers)

    if not browsers:
        raise SystemExit("No browsers found!")

    browsers.sort(key=lambda Kind: Kind.priority)

    try:
        default = get("SearchBar")
    except ValueError:
        raise SystemExit("Default browser not found!")
Exemple #8
0
def unit(run=[], filter_func=None, main=False, subdirs=None,
               strict=False, stop_first=False, no_network=False):

    global _NO_NETWORK

    path = util.get_module_dir()
    if subdirs is None:
        subdirs = []

    _NO_NETWORK = no_network

    # make glib warnings fatal
    if strict:
        from gi.repository import GLib
        GLib.log_set_always_fatal(
            GLib.LogLevelFlags.LEVEL_CRITICAL |
            GLib.LogLevelFlags.LEVEL_ERROR |
            GLib.LogLevelFlags.LEVEL_WARNING)

    suites = []

    def discover_tests(mod):
        for k in vars(mod):
            value = getattr(mod, k)

            if value is not TestCase and \
                    inspect.isclass(value) and issubclass(value, TestCase):
                suites.append(value)

    if main:
        for name in os.listdir(path):
            if fnmatch.fnmatch(name, "test_*.py"):
                mod = __import__(".".join([__name__, name[:-3]]), {}, {}, [])
                discover_tests(getattr(mod, name[:-3]))

    if main:
        # include plugin tests by default
        subdirs = (subdirs or []) + ["plugin"]

    for subdir in subdirs:
        sub_path = os.path.join(path, subdir)
        for name in os.listdir(sub_path):
            if fnmatch.fnmatch(name, "test_*.py"):
                mod = __import__(
                    ".".join([__name__, subdir, name[:-3]]), {}, {}, [])
                discover_tests(getattr(getattr(mod, subdir), name[:-3]))

    runner = Runner()
    failures = errors = all_ = 0
    use_suites = filter(filter_func, suites)
    for test in sorted(use_suites, key=repr):
        if (not run
                or test.__name__ in run
                or test.__module__[11:] in run):
            df, de, num = runner.run(test, failfast=stop_first)
            failures += df
            errors += de
            all_ += num
            if stop_first and (df or de):
                break

    return failures, errors, all_
Exemple #9
0
def get_base_dir():
    """The path to the quodlibet package"""

    return util.get_module_dir()
Exemple #10
0
    failUnlessAlmostEqual = assertAlmostEqual
    failIfAlmostEqual = assertNotAlmostEqual


skip = unittest.skip
skipUnless = unittest.skipUnless
skipIf = unittest.skipIf


def is_ci():
    """Guesses if this is being run in (Travis, maybe other) CI.
       See https://docs.travis-ci.com/user/environment-variables
    """
    return os.environ.get('CI', "").lower() == 'true'

_DATA_DIR = os.path.join(util.get_module_dir(), "data")
assert isinstance(_DATA_DIR, fsnative)
_TEMP_DIR = None


def get_data_path(filename):
    return os.path.join(_DATA_DIR, path2fsn(filename))


def _wrap_tempfile(func):
    def wrap(*args, **kwargs):
        if kwargs.get("dir") is None and _TEMP_DIR is not None:
            assert isinstance(_TEMP_DIR, fsnative)
            kwargs["dir"] = _TEMP_DIR
        return func(*args, **kwargs)
    return wrap
Exemple #11
0
 def test_other(self):
     path = util.get_module_dir(util)
     self.assertTrue(isinstance(path, fsnative))
     self.assertTrue(os.path.exists(path))
Exemple #12
0
init_fake_app, destroy_fake_app

# Nasty hack to allow importing of plugins...
PLUGIN_DIRS = []

root = os.path.join(quodlibet.__path__[0], "ext")
for entry in os.listdir(root):
    if entry.startswith("_"):
        continue
    path = os.path.join(root, entry)
    if not os.path.isdir(path):
        continue
    PLUGIN_DIRS.append(path)

PLUGIN_DIRS.append(os.path.join(util.get_module_dir(), "test_plugins"))

ms = ModuleScanner(PLUGIN_DIRS)

ms.rescan()

# make sure plugins only raise expected errors
for name, err in ms.failures.items():
    exc = err.exception
    if PY3:
        # FIXME: PY3PORT
        continue
    assert issubclass(type(exc), (PluginImportException, ImportError)),\
        "%s shouldn't have raised a %s, but it did (%r)."\
        % (name, type(exc), exc)
Exemple #13
0
    failIfAlmostEqual = assertNotAlmostEqual


skip = unittest.skip
skipUnless = unittest.skipUnless
skipIf = unittest.skipIf


def is_ci():
    """Guesses if this is being run in (Travis, maybe other) CI.
       See https://docs.travis-ci.com/user/environment-variables
    """
    return os.environ.get('CI', "").lower() == 'true'


_DATA_DIR = os.path.join(util.get_module_dir(), "data")
assert isinstance(_DATA_DIR, fsnative)
_TEMP_DIR = None


def get_data_path(filename):
    return os.path.join(_DATA_DIR, path2fsn(filename))


def _wrap_tempfile(func):
    def wrap(*args, **kwargs):
        if kwargs.get("dir") is None and _TEMP_DIR is not None:
            assert isinstance(_TEMP_DIR, fsnative)
            kwargs["dir"] = _TEMP_DIR
        return func(*args, **kwargs)
Exemple #14
0
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

import os
import subprocess

from quodlibet.util.path import iscommand
from quodlibet import util

from tests import TestCase, mkstemp, skipUnless


QLDATA_DIR = os.path.join(os.path.dirname(util.get_module_dir()), "data")


class _TAppDataFileMixin(object):
    PATH = None

    def test_filename(self):
        self.assertTrue(self.PATH.endswith(".appdata.xml.in"))

    def test_validate(self):
        # strip translatable prefix from tags
        from xml.etree import ElementTree
        tree = ElementTree.parse(self.PATH)
        for x in tree.iter():
            if x.tag.startswith("_"):
                x.tag = x.tag[1:]
Exemple #15
0
import quodlibet
from quodlibet import util
from quodlibet.util import get_module_dir
from quodlibet.util.modulescanner import ModuleScanner
from quodlibet.plugins import list_plugins, Plugin, PluginImportException
from quodlibet.compat import iteritems

from tests import TestCase, init_fake_app, destroy_fake_app


init_fake_app, destroy_fake_app

# Nasty hack to allow importing of plugins...
PLUGIN_DIRS = []

root = os.path.join(get_module_dir(quodlibet), "ext")
for entry in os.listdir(root):
    if entry.startswith("_"):
        continue
    path = os.path.join(root, entry)
    if not os.path.isdir(path):
        continue
    PLUGIN_DIRS.append(path)

PLUGIN_DIRS.append(os.path.join(util.get_module_dir(), "test_plugins"))

ms = ModuleScanner(PLUGIN_DIRS)

ms.rescan()

# make sure plugins only raise expected errors
Exemple #16
0
import os
import re

import pytest
try:
    import polib
except ImportError:
    polib = None

import quodlibet
from quodlibet.util import get_module_dir
from quodlibet.util.string.titlecase import human_title
from gdist import gettextutil

QL_BASE_DIR = os.path.dirname(get_module_dir(quodlibet))
PODIR = os.path.join(QL_BASE_DIR, "po")


def has_gettext_util():
    try:
        gettextutil.check_version()
    except gettextutil.GettextError:
        return False
    return True


class MissingTranslationsException(Exception):
    def __init__(self, missing):
        msg = ("No reference in POTFILES.in to: " + ", ".join(missing))
        super(MissingTranslationsException, self).__init__(msg)
Exemple #17
0
import os
import re

try:
    import polib
except ImportError:
    polib = None

import quodlibet
from quodlibet.util import get_module_dir
from quodlibet.util.path import iscommand
from quodlibet.util.string.titlecase import human_title
from gdist import gettextutil

PODIR = os.path.join(os.path.dirname(get_module_dir(quodlibet)), "po")
PODIR_WRITEABLE = os.access(PODIR, os.W_OK)


class MissingTranslationsException(Exception):
    def __init__(self, missing):
        msg = ("No reference in POTFILES.in to: " + ", ".join(missing))
        super(MissingTranslationsException, self).__init__(msg)


class TPOTFILESIN(TestCase):
    def test_missing(self):
        try:
            gettextutil.check_version()
        except gettextutil.GettextError:
            return
Exemple #18
0
def get_base_dir():
    """The path to the quodlibet package"""

    return util.get_module_dir()
Exemple #19
0
import os
import re

try:
    import polib
except ImportError:
    polib = None

import quodlibet
from quodlibet.util import get_module_dir
from quodlibet.util.path import iscommand
from quodlibet.util.string.titlecase import human_title
from gdist import gettextutil


PODIR = os.path.join(os.path.dirname(get_module_dir(quodlibet)), "po")


class MissingTranslationsException(Exception):
    def __init__(self, missing):
        msg = ("No reference in POTFILES.in to: " +
               ", ".join(missing))
        super(MissingTranslationsException, self).__init__(msg)


class TPOTFILESIN(TestCase):

    def test_missing(self):
        try:
            gettextutil.check_version()
        except gettextutil.GettextError:
Exemple #20
0
 def test_self(self):
     path = util.get_module_dir()
     self.assertTrue(is_fsnative(path))
     self.assertTrue(os.path.exists(path))
Exemple #21
0
import os
import re

import pytest
try:
    import polib
except ImportError:
    polib = None

import quodlibet
from quodlibet.util import get_module_dir
from quodlibet.util.string.titlecase import human_title
from gdist import gettextutil


QL_BASE_DIR = os.path.dirname(get_module_dir(quodlibet))
PODIR = os.path.join(QL_BASE_DIR, "po")


def has_gettext_util():
    try:
        gettextutil.check_version()
    except gettextutil.GettextError:
        return False
    return True


class MissingTranslationsException(Exception):
    def __init__(self, missing):
        msg = ("No reference in POTFILES.in to: " +
               ", ".join(missing))
Exemple #22
0
 def test_other(self):
     path = util.get_module_dir(util)
     self.assertTrue(isinstance(path, fsnative))
     self.assertTrue(os.path.exists(path))
Exemple #23
0
# -*- coding: utf-8 -*-
# Copyright 2014 Christoph Reiter
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation

import os
import subprocess

from quodlibet.util.path import iscommand
from quodlibet import util

from tests import TestCase, mkstemp, skipUnless

QLDATA_DIR = os.path.join(os.path.dirname(util.get_module_dir()), "data")


class _TAppDataFileMixin(object):
    PATH = None

    def test_filename(self):
        self.assertTrue(self.PATH.endswith(".appdata.xml.in"))

    def test_validate(self):
        # strip translatable prefix from tags
        from xml.etree import ElementTree
        tree = ElementTree.parse(self.PATH)
        for x in tree.iter():
            if x.tag.startswith("_"):
                x.tag = x.tag[1:]