def early_init(args: argparse.Namespace) -> None: """Initialize the part of the config which works without a QApplication.""" configdata.init() yaml_config = configfiles.YamlConfig() config.instance = config.Config(yaml_config=yaml_config) config.val = config.ConfigContainer(config.instance) configapi.val = config.ConfigContainer(config.instance) config.key_instance = config.KeyConfig(config.instance) config.cache = configcache.ConfigCache() yaml_config.setParent(config.instance) for cf in config.change_filters: cf.validate() config_commands = configcommands.ConfigCommands( config.instance, config.key_instance) objreg.register('config-commands', config_commands) config_file = standarddir.config_py() try: if os.path.exists(config_file): configfiles.read_config_py(config_file) else: configfiles.read_autoconfig() except configexc.ConfigFileErrors as e: log.config.exception("Error while loading {}".format(e.basename)) global _init_errors _init_errors = e configfiles.init() for opt, val in args.temp_settings: try: config.instance.set_str(opt, val) except configexc.Error as e: message.error("set: {} - {}".format(e.__class__.__name__, e)) objects.backend = get_backend(args) configtypes.Font.monospace_fonts = config.val.fonts.monospace config.instance.changed.connect(_update_monospace_fonts) _init_envvars()
def pattern(self, pattern: str) -> typing.Iterator[config.ConfigContainer]: """Get a ConfigContainer for the given pattern.""" # We need to propagate the exception so we don't need to return # something. urlpattern = urlmatch.UrlPattern(pattern) container = config.ConfigContainer(config=self._config, configapi=self, pattern=urlpattern) yield container
def config_stub(stubs, monkeypatch, configdata_init, yaml_config_stub): """Fixture which provides a fake config object.""" conf = config.Config(yaml_config=yaml_config_stub) monkeypatch.setattr(config, 'instance', conf) container = config.ConfigContainer(conf) monkeypatch.setattr(config, 'val', container) monkeypatch.setattr(configapi, 'val', container) cache = configcache.ConfigCache() monkeypatch.setattr(config, 'cache', cache) try: configtypes.Font.monospace_fonts = container.fonts.monospace except configexc.NoOptionError: # Completion tests patch configdata so fonts.monospace is unavailable. pass conf.val = container # For easier use in tests return conf
def read_config_py(filename: str, raising: bool = False) -> None: """Read a config.py file. Arguments; filename: The name of the file to read. raising: Raise exceptions happening in config.py. This is needed during tests to use pytest's inspection. """ assert config.instance is not None assert config.key_instance is not None api = ConfigAPI(config.instance, config.key_instance) container = config.ConfigContainer(config.instance, configapi=api) basename = os.path.basename(filename) module = types.ModuleType('config') module.config = api # type: ignore module.c = container # type: ignore module.__file__ = filename try: with open(filename, mode='rb') as f: source = f.read() except OSError as e: text = "Error while reading {}".format(basename) desc = configexc.ConfigErrorDesc(text, e) raise configexc.ConfigFileErrors(basename, [desc]) try: code = compile(source, filename, 'exec') except ValueError as e: # source contains NUL bytes desc = configexc.ConfigErrorDesc("Error while compiling", e) raise configexc.ConfigFileErrors(basename, [desc]) except SyntaxError as e: desc = configexc.ConfigErrorDesc("Unhandled exception", e, traceback=traceback.format_exc()) raise configexc.ConfigFileErrors(basename, [desc]) try: # Save and restore sys variables with saved_sys_properties(): # Add config directory to python path, so config.py can import # other files in logical places config_dir = os.path.dirname(filename) if config_dir not in sys.path: sys.path.insert(0, config_dir) exec(code, module.__dict__) except Exception as e: if raising: raise api.errors.append( configexc.ConfigErrorDesc("Unhandled exception", exception=e, traceback=traceback.format_exc())) api.finalize() config.instance.config_py_loaded = True if api.errors: raise configexc.ConfigFileErrors('config.py', api.errors)
def test_pattern_no_configapi(self, config_stub): pattern = urlmatch.UrlPattern('https://example.com/') with pytest.raises(TypeError, match="Can't use pattern without configapi!"): config.ConfigContainer(config_stub, pattern=pattern)
def container(self, config_stub): return config.ConfigContainer(config_stub)