summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alot/__main__.py12
-rw-r--r--alot/settings/manager.py44
-rw-r--r--tests/settings/manager_test.py52
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)