diff --git a/powerline/__init__.py b/powerline/__init__.py index 1689f1da..4e148f05 100644 --- a/powerline/__init__.py +++ b/powerline/__init__.py @@ -121,7 +121,7 @@ class Powerline(object): 'load_theme': True, } 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, run_once=run_once) self.run_loader_update = False self.renderer_options = {} diff --git a/powerline/lib/config.py b/powerline/lib/config.py index 9cf6ee4a..e826e3bf 100644 --- a/powerline/lib/config.py +++ b/powerline/lib/config.py @@ -20,11 +20,22 @@ def load_json_config(config_file_path, load=json.load, open_file=open_file): return load(config_file_fp) +class DummyWatcher(object): + def __call__(self, *args, **kwargs): + return False + + def watch(self, *args, **kwargs): + pass + + class ConfigLoader(MultiRunnedThread): - def __init__(self, shutdown_event=None, watcher=None, load=load_json_config): + def __init__(self, shutdown_event=None, watcher=None, load=load_json_config, run_once=False): super(ConfigLoader, self).__init__() self.shutdown_event = shutdown_event or Event() - self.watcher = watcher or create_file_watcher() + if run_once: + self.watcher = DummyWatcher() + else: + self.watcher = watcher or create_file_watcher() self._load = load self.pl = None diff --git a/tests/lib/config_mock.py b/tests/lib/config_mock.py index 7243fcb3..a0c083df 100644 --- a/tests/lib/config_mock.py +++ b/tests/lib/config_mock.py @@ -4,6 +4,7 @@ from powerline.renderer import Renderer from powerline.lib.config import ConfigLoader from powerline import Powerline from copy import deepcopy +from functools import wraps access_log = [] @@ -34,13 +35,26 @@ def pop_events(): return r +def log_call(func): + @wraps(func) + def ret(self, *args, **kwargs): + self._calls.append((func.__name__, args, kwargs)) + return func(self, *args, **kwargs) + return ret + + class Watcher(object): events = set() lock = Lock() + def __init__(self): + self._calls = [] + + @log_call def watch(self, file): pass + @log_call def __call__(self, file): with self.lock: if file in self.events: @@ -53,6 +67,7 @@ class Watcher(object): self.events.clear() self.events.update(files) + @log_call def unsubscribe(self): pass @@ -96,13 +111,16 @@ renderer = SimpleRenderer def get_powerline(**kwargs): - return TestPowerline( + watcher = Watcher() + pl = TestPowerline( ext='test', renderer_module='tests.lib.config_mock', logger=Logger(), - config_loader=ConfigLoader(load=load_json_config, watcher=Watcher()), + config_loader=ConfigLoader(load=load_json_config, watcher=watcher, run_once=kwargs.get('run_once')), **kwargs ) + pl._watcher = watcher + return pl config_container = None diff --git a/tests/test_config_reload.py b/tests/test_config_reload.py index b58eaff8..f74aa411 100644 --- a/tests/test_config_reload.py +++ b/tests/test_config_reload.py @@ -97,7 +97,7 @@ def sleep(interval): def add_watcher_events(p, *args, **kwargs): - p.config_loader.watcher._reset(args) + p._watcher._reset(args) while not p._will_create_renderer(): sleep(kwargs.get('interval', 0.000001)) if not kwargs.get('wait', True): @@ -253,6 +253,22 @@ class TestConfigReload(TestCase): self.assertEqual(p.render(), '<1 2 1> col3<2 4 False>>><3 4 4>g<4 False False>>>') self.assertAccessEvents('themes/test/default') self.assertEqual(p.logger._pop_msgs(), []) + self.assertTrue(p._watcher._calls) + pop_events() + + def test_run_once_no_theme_reload(self): + with replace_item(globals(), 'config', deepcopy(config)): + config['config']['common']['interval'] = None + with get_powerline(run_once=True) as p: + self.assertEqual(p.render(), '<1 2 1> s<2 4 False>>><3 4 4>g<4 False False>>>') + self.assertAccessEvents('config', 'colors', 'colorschemes/test/default', 'themes/test/default') + + config['themes/test/default']['segments']['left'][0]['contents'] = 'col3' + add_watcher_events(p, 'themes/test/default', wait=False) + self.assertEqual(p.render(), '<1 2 1> s<2 4 False>>><3 4 4>g<4 False False>>>') + self.assertAccessEvents() + self.assertEqual(p.logger._pop_msgs(), []) + self.assertEqual(p._watcher._calls, []) pop_events()