configglue team mailing list archive
-
configglue team
-
Mailing list archive
-
Message #00230
[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