mirror of
https://github.com/powerline/powerline.git
synced 2025-04-08 19:25:04 +02:00
Merge pull request #715 from ZyX-I/no-run_once-watches
Reduce number of inotify watches
This commit is contained in:
commit
47fdff946c
@ -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 = {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>>><None None None>')
|
||||
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>>><None None None>')
|
||||
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>>><None None None>')
|
||||
self.assertAccessEvents()
|
||||
self.assertEqual(p.logger._pop_msgs(), [])
|
||||
self.assertEqual(p._watcher._calls, [])
|
||||
pop_events()
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user