Module: deluge Branch: master Commit: 01773e433f6c03c1372b48ed08fda1e3d6fd637f
Author: Andrew Resch <[email protected]> Date: Wed Aug 18 12:32:11 2010 -0700 Fix #1341 issue where Config would try to cancel the save_timer when it is None. --- deluge/config.py | 40 +++++++++++++++++++--------------------- tests/test_config.py | 48 +++++++++++++++++++++++++++--------------------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/deluge/config.py b/deluge/config.py index 5a6202d..f7ad405 100644 --- a/deluge/config.py +++ b/deluge/config.py @@ -45,9 +45,9 @@ The format of the config file is two json encoded dicts: <version dict> <content dict> -The version dict contains two keys: file and format. The format version is -controlled by the Config class. It should only be changed when anything below -it is changed directly by the Config class. An example of this would be if we +The version dict contains two keys: file and format. The format version is +controlled by the Config class. It should only be changed when anything below +it is changed directly by the Config class. An example of this would be if we changed the serializer for the content to something different. The config file version is changed by the 'owner' of the config file. This is @@ -93,13 +93,13 @@ def prop(func): def find_json_objects(s): """ Find json objects in a string. - + :param s: the string to find json objects in :type s: string - + :returns: a list of tuples containing start and end locations of json objects in the string `s` :rtype: [(start, end), ...] - + """ objects = [] opens = 0 @@ -119,8 +119,8 @@ def find_json_objects(s): start = index + offset + 1 return objects - - + + class Config(object): """ This class is used to access/create/modify config files @@ -348,21 +348,21 @@ what is currently in the config and it could not convert the value return objects = find_json_objects(data) - + if not len(objects): # No json objects found, try depickling it try: self.__config.update(pickle.loads(data)) except Exception, e: log.exception(e) - log.warning("Unable to load config file: %s", filename) + log.warning("Unable to load config file: %s", filename) elif len(objects) == 1: start, end = objects[0] try: self.__config.update(json.loads(data[start:end])) except Exception, e: log.exception(e) - log.warning("Unable to load config file: %s", filename) + log.warning("Unable to load config file: %s", filename) elif len(objects) == 2: try: start, end = objects[0] @@ -371,8 +371,8 @@ what is currently in the config and it could not convert the value self.__config.update(json.loads(data[start:end])) except Exception, e: log.exception(e) - log.warning("Unable to load config file: %s", filename) - + log.warning("Unable to load config file: %s", filename) + log.debug("Config %s version: %s.%s loaded: %s", filename, self.__version["format"], self.__version["file"], self.__config) @@ -396,26 +396,24 @@ what is currently in the config and it could not convert the value version = json.loads(data[start:end]) start, end = objects[1] loaded_data = json.loads(data[start:end]) - if self.__config == loaded_data and self.__version == version: # The config has not changed so lets just return - self._save_timer.cancel() + if self._save_timer: + self._save_timer.cancel() return - except Exception, e: - log.warning("Unable to open config file: %s", filename) - - + except IOError, e: + log.warning("Unable to open config file: %s because: %s", filename, e) # Save the new config and make sure it's written to disk try: log.debug("Saving new config file %s", filename + ".new") f = open(filename + ".new", "wb") - json.dump(self.__version, f, indent=2) + json.dump(self.__version, f, indent=2) json.dump(self.__config, f, indent=2) f.flush() os.fsync(f.fileno()) f.close() - except Exception, e: + except IOError, e: log.error("Error writing new config file: %s", e) return False diff --git a/tests/test_config.py b/tests/test_config.py index f29ceae..d61920e 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,7 +6,7 @@ import os from deluge.config import Config -DEFAULTS = {"string": "foobar", "int": 1, "float": 0.435, "bool": True, "tuple": (1, 2)} +DEFAULTS = {"string": "foobar", "int": 1, "float": 0.435, "bool": True} class ConfigTestCase(unittest.TestCase): def setUp(self): @@ -15,10 +15,10 @@ class ConfigTestCase(unittest.TestCase): def test_init(self): config = Config("test.conf", defaults=DEFAULTS, config_dir=self.config_dir) self.assertEquals(DEFAULTS, config.config) - + config = Config("test.conf", config_dir=self.config_dir) self.assertEquals({}, config.config) - + def test_set_get_item(self): config = Config("test.conf", config_dir=self.config_dir) config["foo"] = 1 @@ -26,28 +26,28 @@ class ConfigTestCase(unittest.TestCase): self.assertRaises(ValueError, config.set_item, "foo", "bar") config["foo"] = 2 self.assertEquals(config.get_item("foo"), 2) - + config._save_timer.cancel() def test_load(self): def check_config(): config = Config("test.conf", config_dir=self.config_dir) - + self.assertEquals(config["string"], "foobar") self.assertEquals(config["float"], 0.435) - + # Test loading an old config from 1.1.x import pickle pickle.dump(DEFAULTS, open(os.path.join(self.config_dir, "test.conf"), "wb")) - + check_config() - + # Test opening a previous 1.2 config file of just a json object import json json.dump(DEFAULTS, open(os.path.join(self.config_dir, "test.conf"), "wb"), indent=2) check_config() - + # Test opening a previous 1.2 config file of having the format versions # as ints f = open(os.path.join(self.config_dir, "test.conf"), "wb") @@ -55,26 +55,33 @@ class ConfigTestCase(unittest.TestCase): f.write(str(1) + "\n") json.dump(DEFAULTS, f, indent=2) f.close() - + check_config() - + # Test the 1.2 config format v = {"format": 1, "file": 1} f = open(os.path.join(self.config_dir, "test.conf"), "wb") json.dump(v, f, indent=2) json.dump(DEFAULTS, f, indent=2) f.close() - + check_config() def test_save(self): config = Config("test.conf", defaults=DEFAULTS, config_dir=self.config_dir) + # We do this twice because the first time we need to save the file to disk + # and the second time we do a compare and we should not write + ret = config.save() + self.assertTrue(ret) + ret = config.save() + self.assertTrue(ret) + config["string"] = "baz" config["int"] = 2 ret = config.save() self.assertTrue(ret) del config - + config = Config("test.conf", defaults=DEFAULTS, config_dir=self.config_dir) self.assertEquals(config["string"], "baz") self.assertEquals(config["int"], 2) @@ -84,14 +91,14 @@ class ConfigTestCase(unittest.TestCase): config["string"] = "baz" config["int"] = 2 self.assertTrue(config._save_timer.active()) - + def check_config(config): self.assertTrue(not config._save_timer.active()) del config config = Config("test.conf", defaults=DEFAULTS, config_dir=self.config_dir) self.assertEquals(config["string"], "baz") self.assertEquals(config["int"], 2) - + from twisted.internet.task import deferLater from twisted.internet import reactor d = deferLater(reactor, 7, check_config, config) @@ -99,16 +106,15 @@ class ConfigTestCase(unittest.TestCase): def test_find_json_objects(self): s = """{ - "file": 1, + "file": 1, "format": 1 }{ - "ssl": true, - "enabled": false, + "ssl": true, + "enabled": false, "port": 8115 }\n""" - + from deluge.config import find_json_objects - + objects = find_json_objects(s) self.assertEquals(len(objects), 2) - -- You received this message because you are subscribed to the Google Groups "deluge-commit" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/deluge-commit?hl=en.
