diff options
-rw-r--r-- | alot/__main__.py | 12 | ||||
-rw-r--r-- | alot/settings/manager.py | 44 | ||||
-rw-r--r-- | tests/settings/manager_test.py | 52 |
3 files changed, 79 insertions, 29 deletions
diff --git a/alot/__main__.py b/alot/__main__.py index 48826f53..aba380ba 100644 --- a/alot/__main__.py +++ b/alot/__main__.py @@ -95,14 +95,16 @@ def main(): alotconfig = os.path.join( os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')), 'alot', 'config') - if not os.path.exists(alotconfig): - alotconfig = None + if os.path.exists(alotconfig): + settings.alot_rc_path = alotconfig else: - alotconfig = options.config + settings.alot_rc_path = options.config + + settings.notmuch_rc_path = options.notmuch_config try: - settings.read_config(alotconfig) - settings.read_notmuch_config(options.notmuch_config) + settings.read_config() + settings.read_notmuch_config() except (ConfigError, OSError, IOError) as e: sys.exit(e) diff --git a/alot/settings/manager.py b/alot/settings/manager.py index dcdd853a..5e86ecec 100644 --- a/alot/settings/manager.py +++ b/alot/settings/manager.py @@ -34,6 +34,8 @@ class SettingsManager(object): :param notmuch_rc: path to notmuch's config file :type notmuch_rc: str """ + assert alot_rc is None or (isinstance(alot_rc, basestring) and os.path.exists(alot_rc)) + assert notmuch_rc is None or (isinstance(notmuch_rc, basestring) and os.path.exists(notmuch_rc)) self.hooks = None self._mailcaps = mailcap.getcaps() self._config = ConfigObj() @@ -41,23 +43,41 @@ class SettingsManager(object): self._theme = None self._accounts = None self._accountmap = None - bindings_path = os.path.join(DEFAULTSPATH, 'default.bindings') - self._bindings = ConfigObj(bindings_path) - if alot_rc is not None: - self.read_config(alot_rc) - if notmuch_rc is not None: - self.read_notmuch_config(notmuch_rc) - - def read_notmuch_config(self, path): + self.alot_rc_path = alot_rc + self.notmuch_rc_path = notmuch_rc + self._notmuchconfig = None + self._config = ConfigObj() + self._bindings = None + self.reload() + + def reload(self): + """Reload All configurations. + + This first resets all configs to default (in case an overwritten + binding is removed from the user config), then reloads the notmuch + config, and finally reads the alot config. + + Implementation Detail: this is the same code called by the constructor + to set bindings at alot startup. + """ + self._bindings = ConfigObj(os.path.join(DEFAULTSPATH, 'default.bindings')) + self.read_notmuch_config() + self.read_config() + + def read_notmuch_config(self): """parse notmuch's config file from path""" - spec = os.path.join(DEFAULTSPATH, 'notmuch.rc.spec') - self._notmuchconfig = read_config(path, spec) + if self.notmuch_rc_path is not None: + spec = os.path.join(DEFAULTSPATH, 'notmuch.rc.spec') + self._notmuchconfig = read_config(self.notmuch_rc_path, spec) - def read_config(self, path): + def read_config(self): """parse alot's config file from path""" + if self.alot_rc_path is None: + return + spec = os.path.join(DEFAULTSPATH, 'alot.rc.spec') newconfig = read_config( - path, spec, checks={ + self.alot_rc_path, spec, checks={ 'mail_container': checks.mail_container, 'force_list': checks.force_list, 'align': checks.align_mode, diff --git a/tests/settings/manager_test.py b/tests/settings/manager_test.py index 937c24d7..17a228a2 100644 --- a/tests/settings/manager_test.py +++ b/tests/settings/manager_test.py @@ -6,6 +6,9 @@ from __future__ import absolute_import +import os +import tempfile +import textwrap import unittest from alot.settings.manager import SettingsManager @@ -15,20 +18,45 @@ from alot.settings.errors import ConfigError class TestSettingsManager(unittest.TestCase): def test_reading_synchronize_flags_from_notmuch_config(self): - config = [ - '[maildir]', - 'synchronize_flags = true', - ] - manager = SettingsManager() - manager.read_notmuch_config(config) + with tempfile.NamedTemporaryFile(delete=False) as f: + f.write(textwrap.dedent("""\ + [maildir] + synchronize_flags = true + """)) + self.addCleanup(os.unlink, f.name) + + manager = SettingsManager(notmuch_rc=f.name) actual = manager.get_notmuch_setting('maildir', 'synchronize_flags') self.assertTrue(actual) def test_parsing_notmuch_config_with_non_bool_synchronize_flag_fails(self): - config = [ - '[maildir]', - 'synchronize_flags = not bool' - ] - manager = SettingsManager() + with tempfile.NamedTemporaryFile(delete=False) as f: + f.write(textwrap.dedent("""\ + [maildir] + synchronize_flags = not bool + """)) + self.addCleanup(os.unlink, f.name) + with self.assertRaises(ConfigError): - manager.read_notmuch_config(config) + SettingsManager(notmuch_rc=f.name) + + def test_reload_notmuch_config(self): + with tempfile.NamedTemporaryFile(delete=False) as f: + f.write(textwrap.dedent("""\ + [maildir] + synchronize_flags = false + """)) + self.addCleanup(os.unlink, f.name) + manager = SettingsManager(notmuch_rc=f.name) + + with tempfile.NamedTemporaryFile(delete=False) as f: + f.write(textwrap.dedent("""\ + [maildir] + synchronize_flags = true + """)) + self.addCleanup(os.unlink, f.name) + + manager.notmuch_rc_path = f.name + manager.reload() + actual = manager.get_notmuch_setting('maildir', 'synchronize_flags') + self.assertTrue(actual) |