URI: 
       tMerge pull request #1244 from kyuupichan/simple_config - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit d287152942752b27d9c4c47eb2920919b7c6a7d5
   DIR parent 2928dfeb34ffcc97b5fcbb6bec6f3fabdbfe9dfe
  HTML Author: ThomasV <electrumdev@gmail.com>
       Date:   Mon, 25 May 2015 08:36:46 +0200
       
       Merge pull request #1244 from kyuupichan/simple_config
       
       Fix SimpleConfig
       Diffstat:
         M lib/simple_config.py                |      75 +++++++++++++-------------------
         M lib/tests/test_simple_config.py     |      16 +++++++---------
       
       2 files changed, 37 insertions(+), 54 deletions(-)
       ---
   DIR diff --git a/lib/simple_config.py b/lib/simple_config.py
       t@@ -3,6 +3,7 @@ import json
        import threading
        import os
        
       +from copy import deepcopy
        from util import user_dir, print_error, print_msg
        
        SYSTEM_CONFIG_PATH = "/etc/electrum.conf"
       t@@ -32,19 +33,12 @@ class SimpleConfig(object):
            They are taken in order (1. overrides config options set in 2., that
            override config set in 3.)
            """
       -    def __init__(self, options=None, read_system_config_function=None,
       +    def __init__(self, options={}, read_system_config_function=None,
                         read_user_config_function=None, read_user_dir_function=None):
        
       -        # This is the holder of actual options for the current user.
       -        self.read_only_options = {}
                # This lock needs to be acquired for updating and reading the config in
                # a thread-safe way.
                self.lock = threading.RLock()
       -        # The path for the config directory. This is set later by init_path()
       -        self.path = None
       -
       -        if options is None:
       -            options = {}  # Having a mutable as a default value is a bad idea.
        
                # The following two functions are there for dependency injection when
                # testing.
       t@@ -57,45 +51,39 @@ class SimpleConfig(object):
                else:
                    self.user_dir = read_user_dir_function
        
       -        # Save the command-line keys to make sure we don't override them.
       -        self.command_line_keys = options.keys()
       -        # Save the system config keys to make sure we don't override them.
       -        self.system_config_keys = []
       -
       -        if options.get('portable') is not True:
       -            # system conf
       -            system_config = read_system_config_function()
       -            self.system_config_keys = system_config.keys()
       -            self.read_only_options.update(system_config)
       -
       -        # update the current options with the command line options last (to
       -        # override both others).
       -        self.read_only_options.update(options)
       -        # init path
       -        self.init_path()
       -        # user config.
       +        # The command line options
       +        self.cmdline_options = deepcopy(options)
       +
       +        # Portable wallets don't use a system config
       +        if self.cmdline_options.get('portable', False):
       +            self.system_config = read_system_config_function()
       +        else:
       +            self.system_config = {}
       +
       +        # Set self.path and read the user config
       +        self.user_config = {}  # for self.get in electrum_path()
       +        self.path = self.electrum_path()
                self.user_config = read_user_config_function(self.path)
                # Make a singleton instance of 'self'
                set_config(self)
        
       -    def init_path(self):
       -        # Read electrum path in the command line configuration
       -        self.path = self.read_only_options.get('electrum_path')
       -
       -        # If not set, use the user's default data directory.
       -        if self.path is None:
       -            self.path = self.user_dir()
       +    def electrum_path(self):
       +        # Read electrum_path from command line / system configuration
       +        # Otherwise use the user's default data directory.
       +        path = self.get('electrum_path')
       +        if path is None:
       +            path = self.user_dir()
        
                # Make directory if it does not yet exist.
       -        if not os.path.exists(self.path):
       -            os.mkdir(self.path)
       +        if not os.path.exists(path):
       +            os.mkdir(path)
        
       -        print_error( "electrum directory", self.path)
       +        print_error("electrum directory", path)
       +        return path
        
            def set_key(self, key, value, save = True):
                if not self.is_modifiable(key):
       -            print "Warning: not changing key '%s' because it is not modifiable" \
       -                  " (passed as command line option or defined in /etc/electrum.conf)"%key
       +            print_error("Warning: not changing config key '%s' set on the command line" % key)
                    return
        
                with self.lock:
       t@@ -105,19 +93,16 @@ class SimpleConfig(object):
                return
        
            def get(self, key, default=None):
       -        out = None
                with self.lock:
       -            out = self.read_only_options.get(key)
       +            out = self.cmdline_options.get(key)
                    if out is None:
       -                out = self.user_config.get(key, default)
       +                out = self.user_config.get(key)
       +                if out is None:
       +                    out = self.system_config.get(key, default)
                return out
        
            def is_modifiable(self, key):
       -        if key in self.command_line_keys:
       -            return False
       -        if key in self.system_config_keys:
       -            return False
       -        return True
       +        return not key in self.cmdline_options
        
            def save_user_config(self):
                if not self.path:
   DIR diff --git a/lib/tests/test_simple_config.py b/lib/tests/test_simple_config.py
       t@@ -48,17 +48,16 @@ class Test_SimpleConfig(unittest.TestCase):
                self.assertEqual(self.options.get("electrum_path"),
                                 config.get("electrum_path"))
        
       -    def test_simple_config_system_config_overrides_user_config(self):
       -        """Options passed in system config override user config."""
       +    def test_simple_config_user_config_overrides_system_config(self):
       +        """Options passed in user config override system config."""
                fake_read_system = lambda : {"electrum_path": self.electrum_dir}
                fake_read_user = lambda _: {"electrum_path": "b"}
                read_user_dir = lambda : self.user_dir
       -        config = SimpleConfig(options=None,
       +        config = SimpleConfig(options={},
                                      read_system_config_function=fake_read_system,
                                      read_user_config_function=fake_read_user,
                                      read_user_dir_function=read_user_dir)
       -        self.assertEqual(self.options.get("electrum_path"),
       -                         config.get("electrum_path"))
       +        self.assertEqual("b", config.get("electrum_path"))
        
            def test_simple_config_system_config_ignored_if_portable(self):
                """If electrum is started with the "portable" flag, system
       t@@ -79,7 +78,7 @@ class Test_SimpleConfig(unittest.TestCase):
                fake_read_system = lambda : {}
                fake_read_user = lambda _: {"electrum_path": self.electrum_dir}
                read_user_dir = lambda : self.user_dir
       -        config = SimpleConfig(options=None,
       +        config = SimpleConfig(options={},
                                      read_system_config_function=fake_read_system,
                                      read_user_config_function=fake_read_user,
                                      read_user_dir_function=read_user_dir)
       t@@ -98,7 +97,7 @@ class Test_SimpleConfig(unittest.TestCase):
                self.assertEqual(self.options.get("electrum_path"),
                                 config.get("electrum_path"))
        
       -    def test_cannot_set_options_from_system_config(self):
       +    def test_can_set_options_from_system_config(self):
                fake_read_system = lambda : {"electrum_path": self.electrum_dir}
                fake_read_user = lambda _: {}
                read_user_dir = lambda : self.user_dir
       t@@ -107,8 +106,7 @@ class Test_SimpleConfig(unittest.TestCase):
                                      read_user_config_function=fake_read_user,
                                      read_user_dir_function=read_user_dir)
                config.set_key("electrum_path", "c")
       -        self.assertEqual(self.options.get("electrum_path"),
       -                         config.get("electrum_path"))
       +        self.assertEqual("c", config.get("electrum_path"))
        
            def test_can_set_options_set_in_user_config(self):
                another_path = tempfile.mkdtemp()