← Back to team overview

configglue team mailing list archive

[Merge] lp:~ricardokirkner/configglue/812325-fatal-typeerror into lp:configglue

 

Ricardo Kirkner has proposed merging lp:~ricardokirkner/configglue/812325-fatal-typeerror into lp:configglue with lp:~ricardokirkner/configglue/release-1.0 as a prerequisite.

Requested reviews:
  Guillermo Gonzalez (verterok)
  Configglue developers (configglue)

For more details, see:
https://code.launchpad.net/~ricardokirkner/configglue/812325-fatal-typeerror/+merge/68317

fixed bug due to incorrect handling of option override precedence when an
option is marked as fatal.
-- 
https://code.launchpad.net/~ricardokirkner/configglue/812325-fatal-typeerror/+merge/68317
Your team Configglue developers is requested to review the proposed merge of lp:~ricardokirkner/configglue/812325-fatal-typeerror into lp:configglue.
=== modified file 'configglue/glue.py'
--- configglue/glue.py	2011-07-19 03:18:34 +0000
+++ configglue/glue.py	2011-07-19 03:18:34 +0000
@@ -82,12 +82,25 @@
             value = option.parse(value)
         parser.set(section.name, option.name, value)
 
+    def set_value_with_precedence(op_value, parser_value, env_value,
+            fatal=True):
+        # 1. op_value != None (only if option is not fatal)
+        # => use op or env value
+        # 2. op_value is None (only if option is fatal)
+        # => use parser or env value
+        if not option.fatal:
+            if op_value != parser_value:
+                # value was overridden via command line
+                set_value(section, option, op_value)
+            elif env_value is not None and env_value != parser_value:
+                # value was overridden via environment variable
+                set_value(section, option, env_value)
+        elif env_value is not None and env_value != parser_value:
+            # value was overridden via environment variable
+            set_value(section, option, env_value)
+
     for section in schema.sections():
         for option in section.options():
-            # 1. op value != parser value
-            # 2. op value == parser value != env value
-            # 3. op value == parser value == env value or not env value
-
             op_value = getattr(options, opt_name(option))
             try:
                 parser_value = parser.get(section.name, option.name)
@@ -96,10 +109,9 @@
             env_value = os.environ.get("CONFIGGLUE_{0}".format(
                 long_name(option).upper()))
 
-            if op_value != parser_value:
-                set_value(section, option, op_value)
-            elif env_value is not None and env_value != parser_value:
-                set_value(section, option, env_value)
+            assert option.fatal == (op_value is None)
+            set_value_with_precedence(op_value, parser_value, env_value,
+                fatal=option.fatal)
 
     return op, options, args
 

=== modified file 'configglue/tests/test_schemaconfig.py'
--- configglue/tests/test_schemaconfig.py	2011-07-19 03:18:34 +0000
+++ configglue/tests/test_schemaconfig.py	2011-07-19 03:18:34 +0000
@@ -320,6 +320,17 @@
             parser, argv=['-f', '24', '--foo', '42'])
         self.assertEqual(parser.get('__main__', 'foo'), 42)
 
+    def test_fatal_option_with_config(self):
+        class MySchema(Schema):
+            foo = IntOption(fatal=True)
+
+        config = StringIO("[__main__]\nfoo=1")
+        parser = SchemaConfigParser(MySchema())
+        parser.readfp(config)
+
+        op, options, args = schemaconfigglue(parser)
+        self.assertEqual(parser.values(), {'__main__': {'foo': 1}})
+
 
 class ConfigglueTestCase(unittest.TestCase):
     @patch('configglue.glue.SchemaConfigParser')


Follow ups