Merge pull request #715 from ZyX-I/no-run_once-watches

Reduce number of inotify watches
This commit is contained in:
ZyX-I 2014-01-10 09:23:36 -08:00
commit 47fdff946c
4 changed files with 51 additions and 6 deletions

View File

@ -121,7 +121,7 @@ class Powerline(object):
'load_theme': 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, run_once=run_once)
self.run_loader_update = False self.run_loader_update = False
self.renderer_options = {} self.renderer_options = {}

View File

@ -20,11 +20,22 @@ def load_json_config(config_file_path, load=json.load, open_file=open_file):
return load(config_file_fp) return load(config_file_fp)
class DummyWatcher(object):
def __call__(self, *args, **kwargs):
return False
def watch(self, *args, **kwargs):
pass
class ConfigLoader(MultiRunnedThread): 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__() super(ConfigLoader, self).__init__()
self.shutdown_event = shutdown_event or Event() 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._load = load
self.pl = None self.pl = None

View File

@ -4,6 +4,7 @@ from powerline.renderer import Renderer
from powerline.lib.config import ConfigLoader from powerline.lib.config import ConfigLoader
from powerline import Powerline from powerline import Powerline
from copy import deepcopy from copy import deepcopy
from functools import wraps
access_log = [] access_log = []
@ -34,13 +35,26 @@ def pop_events():
return r 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): class Watcher(object):
events = set() events = set()
lock = Lock() lock = Lock()
def __init__(self):
self._calls = []
@log_call
def watch(self, file): def watch(self, file):
pass pass
@log_call
def __call__(self, file): def __call__(self, file):
with self.lock: with self.lock:
if file in self.events: if file in self.events:
@ -53,6 +67,7 @@ class Watcher(object):
self.events.clear() self.events.clear()
self.events.update(files) self.events.update(files)
@log_call
def unsubscribe(self): def unsubscribe(self):
pass pass
@ -96,13 +111,16 @@ renderer = SimpleRenderer
def get_powerline(**kwargs): def get_powerline(**kwargs):
return TestPowerline( watcher = Watcher()
pl = TestPowerline(
ext='test', ext='test',
renderer_module='tests.lib.config_mock', renderer_module='tests.lib.config_mock',
logger=Logger(), 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 **kwargs
) )
pl._watcher = watcher
return pl
config_container = None config_container = None

View File

@ -97,7 +97,7 @@ def sleep(interval):
def add_watcher_events(p, *args, **kwargs): def add_watcher_events(p, *args, **kwargs):
p.config_loader.watcher._reset(args) p._watcher._reset(args)
while not p._will_create_renderer(): while not p._will_create_renderer():
sleep(kwargs.get('interval', 0.000001)) sleep(kwargs.get('interval', 0.000001))
if not kwargs.get('wait', True): 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.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.assertAccessEvents('themes/test/default')
self.assertEqual(p.logger._pop_msgs(), []) 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() pop_events()