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')
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)