def load_config_and_cmd_line(self, argv=sys.argv[1:]): # we scan the command line first in case the user wants to # override the default config file location args, left_over = self.cmd_parser.parse_known_args(args=argv, namespace=SeqalConfig.Args()) # load the config for this program, if the file exists config = SealConfigFile() # was a config file different from the default specified on the command line? try: if args.seal_config != self.cmd_parser.get_default("seal_config"): # in this case, make sure it exists and is readable if not os.path.exists(args.seal_config): raise SeqalConfigError("The specified Seal config file %s doens't exist" % args.seal_config) if not os.access(args.seal_config, os.R_OK): raise SeqalConfigError("The specified Seal config file %s isn't readable" % args.seal_config) config.read(args.seal_config) # no problems. Load the file. else: # check the default path. If the file exists and is readable we'll load it if os.path.exists(args.seal_config): if os.access(args.seal_config, os.R_OK): config.read(args.seal_config) else: print >>sys.stderr, "WARNING: Seal config file %s exists but isn't readable" % args.seal_config except FormatError as e: # catch errors from parsing the config file raise SeqalConfigError("Error in Seal configuration file %s\n%s" % (args.seal_config, str(e))) # override configuration properties from file with the ones # provided on the command line. for name, value in config.items(SeqalConfig.ConfigSection): if not args.properties.has_key(name): args.properties[name] = value return args, left_over
def setUp(self): self.emptyConfig = SealConfigFile() self.config = SealConfigFile()
class TestSealConfigFile(unittest.TestCase): CfgDefaultWithTitle = \ """[DEFAULT] key1:value1 key2:value2 """ CfgSection1 = \ """[DEFAULT] key1:value1 key2:value2 [ Section1 ] keyS1: valueS1 """ CfgSection2 = \ """[DEFAULT] key1:value1 key2:value2 [ Section1 ] keyS1: valueS1 [ Section2 ] keyS2: valueS2 """ def setUp(self): self.emptyConfig = SealConfigFile() self.config = SealConfigFile() def test_empty(self): self.assertFalse( self.emptyConfig.has_section("bla") ) self.assertTrue( self.emptyConfig.has_section("DEFAULT") ) self.assertEqual(0, len(self.emptyConfig.sections()) ) self.assertEqual(0, len(self.emptyConfig.items("non existent"))) def test_default(self): self.config.readfp(io.BytesIO(self.__class__.CfgDefaultWithTitle)) self.assertTrue( self.config.has_section("DEFAULT") ) self.assertTrue( self.config.has_section("default") ) self.assertTrue( self.config.has_section("deFAult") ) items = self.config.items("anything") self.assertEqual(2, len(items)) kv = dict(items) self.assertEqual(2, len(kv)) self.assertEqual("value1", kv.get("key1")) self.assertEqual("value2", kv.get("key2")) def test_equals(self): self.config.readfp( io.BytesIO("key1=value1\n") ) self.assertEqual("value1", self.config.get("default", "key1")) def test_colon(self): self.config.readfp( io.BytesIO("key1:value1\n") ) self.assertEqual("value1", self.config.get("default", "key1")) def test_trim_key(self): self.config.readfp( io.BytesIO(" key1 :value1\n") ) self.assertEqual("value1", self.config.get("default", "key1")) def test_trim_value(self): self.config.readfp( io.BytesIO("key1: value1 \n") ) self.assertEqual("value1", self.config.get("default", "key1")) def test_section1(self): self.config.readfp( io.BytesIO(self.__class__.CfgSection1) ) self.assertEqual("value1", self.config.get("Section1", "key1")) self.assertEqual("valueS1", self.config.get("Section1", "keyS1")) kv = dict(self.config.items("Section1")) # make sure the iterator goes through all k-v pairs, even the ones inherited from DEFAULT self.assertEqual(3, len(kv)) self.assertEqual("value1", kv.get("key1")) self.assertEqual("value2", kv.get("key2")) self.assertEqual("valueS1", kv.get("keyS1")) def test_section2(self): self.config.readfp( io.BytesIO(self.__class__.CfgSection2) ) self.assertEqual("value1", self.config.get("Section1", "key1")) self.assertEqual("valueS1", self.config.get("Section1", "keyS1")) self.assertTrue( self.config.get("Section2", "keyS1") is None) self.assertEqual("valueS2", self.config.get("Section2", "keyS2")) def test_section_that_doesnt_exist(self): self.config.readfp( io.BytesIO(self.__class__.CfgSection1) ) self.assertFalse( self.config.has_section("MySection") ) self.assertTrue( self.config.get("MySection", "option") is None ) def test_space_in_section_name(self): self.assertRaises(FormatError, self.config.readfp, io.BytesIO("[ Section 1 ]") ) def test_hash_comment(self): self.config.readfp( io.BytesIO(" #key1=value1\nkey2=value2;\n") ) self.assertTrue( self.config.get("default", "key1") is None) self.assertEqual("value2;", self.config.get("default", "key2")) def test_semi_colon_comment(self): self.config.readfp( io.BytesIO(" ;key1=value1\nkey2=value2;\n") ) self.assertTrue( self.config.get("default", "key1") is None) self.assertEqual("value2;", self.config.get("default", "key2"))
class TestSealConfigFile(unittest.TestCase): CfgDefaultWithTitle = \ """[DEFAULT] key1:value1 key2:value2 """ CfgSection1 = \ """[DEFAULT] key1:value1 key2:value2 [ Section1 ] keyS1: valueS1 """ CfgSection2 = \ """[DEFAULT] key1:value1 key2:value2 [ Section1 ] keyS1: valueS1 [ Section2 ] keyS2: valueS2 """ def setUp(self): self.emptyConfig = SealConfigFile() self.config = SealConfigFile() def test_empty(self): self.assertFalse(self.emptyConfig.has_section("bla")) self.assertTrue(self.emptyConfig.has_section("DEFAULT")) self.assertEqual(0, len(self.emptyConfig.sections())) self.assertEqual(0, len(self.emptyConfig.items("non existent"))) def test_default(self): self.config.readfp(io.BytesIO(self.__class__.CfgDefaultWithTitle)) self.assertTrue(self.config.has_section("DEFAULT")) self.assertTrue(self.config.has_section("default")) self.assertTrue(self.config.has_section("deFAult")) items = self.config.items("anything") self.assertEqual(2, len(items)) kv = dict(items) self.assertEqual(2, len(kv)) self.assertEqual("value1", kv.get("key1")) self.assertEqual("value2", kv.get("key2")) def test_equals(self): self.config.readfp(io.BytesIO("key1=value1\n")) self.assertEqual("value1", self.config.get("default", "key1")) def test_colon(self): self.config.readfp(io.BytesIO("key1:value1\n")) self.assertEqual("value1", self.config.get("default", "key1")) def test_trim_key(self): self.config.readfp(io.BytesIO(" key1 :value1\n")) self.assertEqual("value1", self.config.get("default", "key1")) def test_trim_value(self): self.config.readfp(io.BytesIO("key1: value1 \n")) self.assertEqual("value1", self.config.get("default", "key1")) def test_section1(self): self.config.readfp(io.BytesIO(self.__class__.CfgSection1)) self.assertEqual("value1", self.config.get("Section1", "key1")) self.assertEqual("valueS1", self.config.get("Section1", "keyS1")) kv = dict(self.config.items("Section1")) # make sure the iterator goes through all k-v pairs, even the ones inherited from DEFAULT self.assertEqual(3, len(kv)) self.assertEqual("value1", kv.get("key1")) self.assertEqual("value2", kv.get("key2")) self.assertEqual("valueS1", kv.get("keyS1")) def test_section2(self): self.config.readfp(io.BytesIO(self.__class__.CfgSection2)) self.assertEqual("value1", self.config.get("Section1", "key1")) self.assertEqual("valueS1", self.config.get("Section1", "keyS1")) self.assertTrue(self.config.get("Section2", "keyS1") is None) self.assertEqual("valueS2", self.config.get("Section2", "keyS2")) def test_section_that_doesnt_exist(self): self.config.readfp(io.BytesIO(self.__class__.CfgSection1)) self.assertFalse(self.config.has_section("MySection")) self.assertTrue(self.config.get("MySection", "option") is None) def test_space_in_section_name(self): self.assertRaises(FormatError, self.config.readfp, io.BytesIO("[ Section 1 ]")) def test_hash_comment(self): self.config.readfp(io.BytesIO(" #key1=value1\nkey2=value2;\n")) self.assertTrue(self.config.get("default", "key1") is None) self.assertEqual("value2;", self.config.get("default", "key2")) def test_semi_colon_comment(self): self.config.readfp(io.BytesIO(" ;key1=value1\nkey2=value2;\n")) self.assertTrue(self.config.get("default", "key1") is None) self.assertEqual("value2;", self.config.get("default", "key2"))