From ee23c57d6a9de728d22b4518304d09a5d01f98c3 Mon Sep 17 00:00:00 2001 From: ZyX Date: Tue, 26 Mar 2013 18:37:29 +0400 Subject: [PATCH] Purge configs in another place Loading main configuration does not necessary imply loading other configurations --- powerline/__init__.py | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/powerline/__init__.py b/powerline/__init__.py index 6c5496d0..ab7bb88d 100644 --- a/powerline/__init__.py +++ b/powerline/__init__.py @@ -10,6 +10,7 @@ from powerline.colorscheme import Colorscheme from powerline.lib.file_watcher import create_file_watcher from threading import Lock, Thread, Event +from collections import defaultdict DEFAULT_SYSTEM_CONFIG_DIR = None @@ -123,7 +124,7 @@ class Powerline(object): self.renderer_lock = Lock() self.configs_lock = Lock() self.shutdown_event = Event() - self.configs = {} + self.configs = defaultdict(set) self.thread = None if not watcher: @@ -132,14 +133,14 @@ class Powerline(object): self.prev_common_config = None self.prev_ext_config = None - self.create_renderer(load_main_config=True, load_colors=True, load_colorscheme=True, load_theme=True) + self.create_renderer(load_main=True, load_colors=True, load_colorscheme=True, load_theme=True) - def create_renderer(self, load_main_config=False, load_colors=False, load_colorscheme=False, load_theme=False): + def create_renderer(self, load_main=False, load_colors=False, load_colorscheme=False, load_theme=False): '''(Re)create renderer object. Can be used after Powerline object was successfully initialized. If any of the below parameters except - ``load_main_config`` is True renderer object will be recreated. + ``load_main`` is True renderer object will be recreated. - :param bool load_main_config: + :param bool load_main: Determines whether main configuration file (:file:`config.json`) should be loaded. If appropriate configuration changes implies ``load_colorscheme`` and ``load_theme`` and recreation of renderer @@ -155,7 +156,8 @@ class Powerline(object): ''' common_config_differs = False ext_config_differs = False - if load_main_config: + if load_main: + self._purge_configs('main') config = self.load_main_config() self.common_config = config['common'] if self.common_config != self.prev_common_config: @@ -207,13 +209,16 @@ class Powerline(object): create_renderer = load_colors or load_colorscheme or load_theme or common_config_differs or ext_config_differs if load_colors: + self._purge_configs('colors') colors_config = self.load_colors_config() if load_colorscheme or load_colors: + self._purge_configs('colorscheme') colorscheme_config = self.load_colorscheme_config(self.ext_config['colorscheme']) self.colorscheme = Colorscheme(colorscheme_config, colors_config) if load_theme: + self._purge_configs('theme') self.theme_config = self.load_theme_config(self.ext_config.get('theme', 'default')) if create_renderer: @@ -284,10 +289,17 @@ class Powerline(object): global watcher path = find_config_file(self.config_paths, cfg_path) with self.configs_lock: - self.configs[path] = type + self.configs[type].add(path) watcher.watch(path) return load_json_config(path) + def _purge_configs(self, type): + try: + with self.configs_lock: + self.configs.pop(type) + except KeyError: + pass + def load_theme_config(self, name): '''Get theme configuration. @@ -303,14 +315,7 @@ class Powerline(object): :return: dictionary with :ref:`top-level configuration `. ''' - with self.configs_lock: - self.configs.clear() - # Watches for unused files will be cleared automatically after some - # time, no need to do this here, especially considering that - # a) most of them are used and thus will be recreated in other - # load_* calls; - # b) it is hard to tell which ones stopped being useful. - return self._load_config('config', 'main_config') + return self._load_config('config', 'main') def load_colorscheme_config(self, name): '''Get colorscheme. @@ -375,9 +380,10 @@ class Powerline(object): while not self.shutdown_event.is_set(): kwargs = {} with self.configs_lock: - for path, type in self.configs.items(): - if watcher(path): - kwargs['load_' + type] = True + for type, paths in self.configs.items(): + for path in paths: + if watcher(path): + kwargs['load_' + type] = True if kwargs: try: self.create_renderer(**kwargs)