Source code for mocks

'''
    Provided so that we can build docs without needing to have any
    dependencies installed (such as for RTFD).

    Derived from https://read-the-docs.readthedocs.org/en/latest/faq.html
'''

import sys


class Mock(object):

    __all__ = []

    def __init__(self, *args, **kwargs):
        pass

    def __call__(self, *args, **kwargs):
        return Mock()

    @classmethod
    def __getattr__(cls, name):
        if name in ('__file__', '__path__'):
            return '/dev/null'
        else:
            return Mock()

    # glib mocks

    @classmethod
    def get_user_data_dir(cls):
        return '/tmp'

    @classmethod
    def get_user_config_dir(cls):
        return '/tmp'

    @classmethod
    def get_user_cache_dir(cls):
        return '/tmp'

    # gtk/gdk mocks

    class ModifierType:
        SHIFT_MASK = 0

    @classmethod
    def accelerator_parse(cls, *args):
        return [0, 0]


MOCK_MODULES = [
    'bsddb',
    'cairo',

    'dbus',
    'dbus.service',

    'gi',
    'gi.repository',
    'gi.repository.Gio',
    'gi.repository.GLib',
    'gi.repository.GObject',
    'gi.repository.Gst',
    'gi.repository.Gtk',

    'mutagen',
    'mutagen.apev2',
    'mutagen.ogg',
    'mutagen.flac',
]


def import_fake_modules():
    for mod_name in MOCK_MODULES:
        sys.modules[mod_name] = Mock()


def fake_xl_settings():
    # player hack
    import xl.settings

    def option_hack(name, default):
        if name == 'player/engine':
            return 'rtfd_hack'
        else:
            return orig_get_option(name, default)

    orig_get_option = xl.settings.get_option
    xl.settings.get_option = option_hack