Defer create_renderer (and thus thread creation) until .render call

May fix problem discussed in #397

Also fix documentation for Powerline.render().
This commit is contained in:
ZyX 2013-04-06 16:32:38 +04:00
parent af2f8f588b
commit 88865b1145
3 changed files with 25 additions and 14 deletions

View File

@ -113,7 +113,12 @@ class Powerline(object):
self.find_config_file = lambda cfg_path: find_config_file(config_paths, cfg_path) self.find_config_file = lambda cfg_path: find_config_file(config_paths, cfg_path)
self.cr_kwargs_lock = Lock() self.cr_kwargs_lock = Lock()
self.create_renderer_kwargs = {} self.create_renderer_kwargs = {
'load_main': True,
'load_colors': True,
'load_colorscheme': True,
'load_theme': True,
}
self.shutdown_event = shutdown_event or Event() self.shutdown_event = shutdown_event or Event()
self.config_loader = config_loader or ConfigLoader(shutdown_event=self.shutdown_event) self.config_loader = config_loader or ConfigLoader(shutdown_event=self.shutdown_event)
@ -123,8 +128,6 @@ class Powerline(object):
self.prev_ext_config = None self.prev_ext_config = None
self.pl = None self.pl = None
self.create_renderer(load_main=True, load_colors=True, load_colorscheme=True, load_theme=True)
def create_renderer(self, load_main=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 '''(Re)create renderer object. Can be used after Powerline object was
successfully initialized. If any of the below parameters except successfully initialized. If any of the below parameters except
@ -342,18 +345,25 @@ class Powerline(object):
''' '''
return None return None
def render(self, *args, **kwargs): def update_renderer(self):
'''Lock renderer from modifications and pass all arguments further to '''Updates/creates a renderer if needed.'''
``self.renderer.render()``. create_renderer_kwargs = None
'''
with self.cr_kwargs_lock: with self.cr_kwargs_lock:
if self.create_renderer_kwargs: if self.create_renderer_kwargs:
try: create_renderer_kwargs = self.create_renderer_kwargs.copy()
self.create_renderer(**self.create_renderer_kwargs) if create_renderer_kwargs:
except Exception as e: try:
self.pl.exception('Failed to create renderer: {0}', str(e)) self.create_renderer(**create_renderer_kwargs)
finally: except Exception as e:
self.create_renderer_kwargs.clear() self.pl.exception('Failed to create renderer: {0}', str(e))
finally:
self.create_renderer_kwargs.clear()
def render(self, *args, **kwargs):
'''Update/create renderer if needed and pass all arguments further to
``self.renderer.render()``.
'''
self.update_renderer()
return self.renderer.render(*args, **kwargs) return self.renderer.render(*args, **kwargs)
def shutdown(self): def shutdown(self):

View File

@ -46,6 +46,7 @@ class VimPowerline(Powerline):
``True`` if theme was added successfully and ``False`` if theme with ``True`` if theme was added successfully and ``False`` if theme with
the same matcher already exists. the same matcher already exists.
''' '''
self.update_renderer()
key = self.get_matcher(key) key = self.get_matcher(key)
try: try:
self.renderer.add_local_theme(key, {'config': config}) self.renderer.add_local_theme(key, {'config': config})

View File

@ -128,8 +128,8 @@ class TestConfigReload(TestCase):
def test_reload_main(self): def test_reload_main(self):
with get_powerline(run_once=False) as p: with get_powerline(run_once=False) as p:
with replace_item(globals(), 'config', deepcopy(config)): with replace_item(globals(), 'config', deepcopy(config)):
self.assertAccessEvents('config', 'colors', 'colorschemes/test/default', 'themes/test/default')
self.assertEqual(p.render(), '<1 2 1> s<2 4 False>>><3 4 4>g<4 False False>>><None None None>') self.assertEqual(p.render(), '<1 2 1> s<2 4 False>>><3 4 4>g<4 False False>>><None None None>')
self.assertAccessEvents('config', 'colors', 'colorschemes/test/default', 'themes/test/default')
config['config']['common']['spaces'] = 1 config['config']['common']['spaces'] = 1
add_watcher_events(p, 'config') add_watcher_events(p, 'config')