def test_monospace_fonts_init(self, init_patch, args, config_tmpdir,
                                  method, settings, size, family):
        """Ensure setting fonts.monospace at init works properly.

        See https://github.com/glimpsebrowser/glimpsebrowser/issues/2973
        """
        if method == 'temp':
            args.temp_settings = settings
        elif method == 'auto':
            autoconfig_file = config_tmpdir / 'autoconfig.yml'
            lines = (["config_version: 2", "settings:"] + [
                "  {}:\n    global:\n      '{}'".format(k, v)
                for k, v in settings
            ])
            autoconfig_file.write_text('\n'.join(lines), 'utf-8', ensure=True)
        elif method == 'py':
            config_py_file = config_tmpdir / 'config.py'
            lines = ["c.{} = '{}'".format(k, v) for k, v in settings]
            config_py_file.write_text('\n'.join(lines), 'utf-8', ensure=True)

        configinit.early_init(args)

        # Font
        expected = '{}pt "{}"'.format(size, family)
        assert config.instance.get('fonts.keyhint') == expected
        # QtFont
        font = config.instance.get('fonts.tabs')
        assert font.pointSize() == size
        assert font.family() == family
def test_late_init(init_patch, monkeypatch, fake_save_manager, args, mocker,
                   errors):
    configinit.early_init(args)
    if errors:
        err = configexc.ConfigErrorDesc("Error text", Exception("Exception"))
        errs = configexc.ConfigFileErrors("config.py", [err])
        monkeypatch.setattr(configinit, '_init_errors', errs)
    msgbox_mock = mocker.patch(
        'glimpsebrowser.config.configinit.msgbox.msgbox', autospec=True)

    configinit.late_init(fake_save_manager)

    fake_save_manager.add_saveable.assert_any_call('state-config',
                                                   unittest.mock.ANY)
    fake_save_manager.add_saveable.assert_any_call('yaml-config',
                                                   unittest.mock.ANY,
                                                   unittest.mock.ANY)
    if errors:
        assert len(msgbox_mock.call_args_list) == 1
        _call_posargs, call_kwargs = msgbox_mock.call_args_list[0]
        text = call_kwargs['text'].strip()
        assert text.startswith('Errors occurred while reading config.py:')
        assert '<b>Error text</b>: Exception' in text
    else:
        assert not msgbox_mock.called
    def test_setting_monospace_fonts_family(self, init_patch, args):
        """Make sure setting fonts.monospace after a family works.

        See https://github.com/glimpsebrowser/glimpsebrowser/issues/3130
        """
        configinit.early_init(args)
        config.instance.set_str('fonts.web.family.standard', '')
        config.instance.set_str('fonts.monospace', 'Terminus')
示例#4
0
def run(args):
    """Initialize everything and run the application."""
    if args.temp_basedir:
        args.basedir = tempfile.mkdtemp(prefix='glimpsebrowser-basedir-')

    quitter = Quitter(args)
    objreg.register('quitter', quitter)

    log.init.debug("Initializing directories...")
    standarddir.init(args)
    utils.preload_resources()

    log.init.debug("Initializing config...")
    configinit.early_init(args)

    global q_app
    q_app = Application(args)
    q_app.setOrganizationName("glimpsebrowser")
    q_app.setApplicationName("glimpsebrowser")
    q_app.setDesktopFileName("org.glimpsebrowser.glimpsebrowser")
    q_app.setApplicationVersion(glimpsebrowser.__version__)
    q_app.lastWindowClosed.connect(quitter.on_last_window_closed)

    if args.version:
        print(version.version())
        sys.exit(usertypes.Exit.ok)

    crash_handler = crashsignal.CrashHandler(app=q_app,
                                             quitter=quitter,
                                             args=args,
                                             parent=q_app)
    crash_handler.activate()
    objreg.register('crash-handler', crash_handler)

    signal_handler = crashsignal.SignalHandler(app=q_app,
                                               quitter=quitter,
                                               parent=q_app)
    signal_handler.activate()
    objreg.register('signal-handler', signal_handler)

    try:
        server = ipc.send_or_listen(args)
    except ipc.Error:
        # ipc.send_or_listen already displays the error message for us.
        # We didn't really initialize much so far, so we just quit hard.
        sys.exit(usertypes.Exit.err_ipc)

    if server is None:
        if args.backend is not None:
            log.init.warning("Backend from the running instance will be used")
        sys.exit(usertypes.Exit.ok)
    else:
        server.got_args.connect(lambda args, target_arg, cwd: process_pos_args(
            args, cwd=cwd, via_ipc=True, target_arg=target_arg))

    init(args, crash_handler)
    ret = qt_mainloop()
    return ret
    def test_temp_settings_invalid(self, caplog, init_patch, message_mock,
                                   args):
        """Invalid temp settings should show an error."""
        args.temp_settings = [('foo', 'bar')]

        with caplog.at_level(logging.ERROR):
            configinit.early_init(args)

        msg = message_mock.getmsg()
        assert msg.level == usertypes.MessageLevel.error
        assert msg.text == "set: NoOptionError - No option 'foo'"
    def test_monospace_fonts_later(self, init_patch, args):
        """Ensure setting fonts.monospace after init works properly.

        See https://github.com/glimpsebrowser/glimpsebrowser/issues/2973
        """
        configinit.early_init(args)
        changed_options = []
        config.instance.changed.connect(changed_options.append)

        config.instance.set_obj('fonts.monospace', '"Comic Sans MS"')

        assert 'fonts.keyhint' in changed_options  # Font
        assert config.instance.get('fonts.keyhint') == '10pt "Comic Sans MS"'
        assert 'fonts.tabs' in changed_options  # QtFont
        assert config.instance.get('fonts.tabs').family() == 'Comic Sans MS'

        # Font subclass, but doesn't end with "monospace"
        assert 'fonts.web.family.standard' not in changed_options
    def test_config_py(self, init_patch, config_tmpdir, caplog, args,
                       config_py):
        """Test loading with only a config.py."""
        config_py_file = config_tmpdir / 'config.py'

        if config_py:
            config_py_lines = ['c.colors.hints.bg = "red"']
            if config_py == 'error':
                config_py_lines.append('c.foo = 42')
            config_py_file.write_text('\n'.join(config_py_lines),
                                      'utf-8',
                                      ensure=True)

        with caplog.at_level(logging.ERROR):
            configinit.early_init(args)

        # Check error messages
        expected_errors = []
        if config_py == 'error':
            expected_errors.append("While setting 'foo': No option 'foo'")

        if configinit._init_errors is None:
            actual_errors = []
        else:
            actual_errors = [
                str(err) for err in configinit._init_errors.errors
            ]

        assert actual_errors == expected_errors

        # Make sure things have been init'ed
        objreg.get('config-commands')
        assert isinstance(config.instance, config.Config)
        assert isinstance(config.key_instance, config.KeyConfig)

        # Check config values
        if config_py:
            expected = 'colors.hints.bg = red'
        else:
            expected = '<Default configuration>'
        assert config.instance.dump_userconfig() == expected
 def test_config_py_path(self, args, init_patch, config_py_arg):
     config_py_arg.write('c.colors.hints.bg = "red"\n')
     configinit.early_init(args)
     expected = 'colors.hints.bg = red'
     assert config.instance.dump_userconfig() == expected
 def test_temp_settings_valid(self, init_patch, args):
     args.temp_settings = [('colors.completion.fg', 'magenta')]
     configinit.early_init(args)
     assert config.instance.get_obj('colors.completion.fg') == 'magenta'
 def test_invalid_change_filter(self, init_patch, args):
     config.change_filter('foobar')
     with pytest.raises(configexc.NoOptionError):
         configinit.early_init(args)
    def test_autoconfig_yml(self, init_patch, config_tmpdir, caplog, args,
                            load_autoconfig, config_py, invalid_yaml):
        """Test interaction between config.py and autoconfig.yml."""
        # Prepare files
        autoconfig_file = config_tmpdir / 'autoconfig.yml'
        config_py_file = config_tmpdir / 'config.py'

        yaml_lines = {
            '42':
            '42',
            'list':
            '[1, 2]',
            'unknown': [
                'settings:',
                '  colors.foobar:',
                '    global: magenta',
                'config_version: 2',
            ],
            'wrong-type': [
                'settings:',
                '  tabs.position:',
                '    global: true',
                'config_version: 2',
            ],
            False: [
                'settings:',
                '  colors.hints.fg:',
                '    global: magenta',
                'config_version: 2',
            ],
        }
        text = '\n'.join(yaml_lines[invalid_yaml])
        autoconfig_file.write_text(text, 'utf-8', ensure=True)

        if config_py:
            config_py_lines = ['c.colors.hints.bg = "red"']
            if load_autoconfig:
                config_py_lines.append('config.load_autoconfig()')
            if config_py == 'error':
                config_py_lines.append('c.foo = 42')
            config_py_file.write_text('\n'.join(config_py_lines),
                                      'utf-8',
                                      ensure=True)

        with caplog.at_level(logging.ERROR):
            configinit.early_init(args)

        # Check error messages
        expected_errors = []

        if load_autoconfig or not config_py:
            suffix = ' (autoconfig.yml)' if config_py else ''
            if invalid_yaml in ['42', 'list']:
                error = ("While loading data{}: Toplevel object is not a dict".
                         format(suffix))
                expected_errors.append(error)
            elif invalid_yaml == 'wrong-type':
                error = ("Error{}: Invalid value 'True' - expected a value of "
                         "type str but got bool.".format(suffix))
                expected_errors.append(error)
            elif invalid_yaml == 'unknown':
                error = ("While loading options{}: Unknown option "
                         "colors.foobar".format(suffix))
                expected_errors.append(error)
        if config_py == 'error':
            expected_errors.append("While setting 'foo': No option 'foo'")

        if configinit._init_errors is None:
            actual_errors = []
        else:
            actual_errors = [
                str(err) for err in configinit._init_errors.errors
            ]

        assert actual_errors == expected_errors

        # Check config values
        dump = config.instance.dump_userconfig()

        if config_py and load_autoconfig and not invalid_yaml:
            expected = [
                'colors.hints.bg = red',
                'colors.hints.fg = magenta',
            ]
        elif config_py:
            expected = ['colors.hints.bg = red']
        elif invalid_yaml:
            expected = ['<Default configuration>']
        else:
            expected = ['colors.hints.fg = magenta']

        assert dump == '\n'.join(expected)