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

View File

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

View File

@ -128,8 +128,8 @@ class TestConfigReload(TestCase):
def test_reload_main(self):
with get_powerline(run_once=False) as p:
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.assertAccessEvents('config', 'colors', 'colorschemes/test/default', 'themes/test/default')
config['config']['common']['spaces'] = 1
add_watcher_events(p, 'config')