Merge lp:~ricardokirkner/configglue/simplified-option-precedence into lp:configglue

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: 80
Merged at revision: 80
Proposed branch: lp:~ricardokirkner/configglue/simplified-option-precedence
Merge into: lp:configglue
Diff against target: 94 lines (+38/-21)
2 files modified
configglue/glue.py (+10/-21)
configglue/tests/test_schemaconfig.py (+28/-0)
To merge this branch: bzr merge lp:~ricardokirkner/configglue/simplified-option-precedence
Reviewer Review Type Date Requested Status
Ricardo Kirkner Approve
Review via email: mp+69379@code.launchpad.net

Commit message

simplified option precedence

Description of the change

Overview
=========

Simplified option precedence logic and fixed one bug triggered during testing of django_configglue related to it (option not fatal but null misbehaving).

To post a comment you must log in.
Revision history for this message
Ricardo Kirkner (ricardokirkner) wrote :

Make tarmac happy.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'configglue/glue.py'
--- configglue/glue.py 2011-07-22 15:44:24 +0000
+++ configglue/glue.py 2011-07-27 00:14:29 +0000
@@ -23,7 +23,7 @@
23from optparse import OptionParser23from optparse import OptionParser
24from collections import namedtuple24from collections import namedtuple
2525
26from configglue.parser import SchemaConfigParser26from .parser import SchemaConfigParser
2727
2828
29__all__ = [29__all__ = [
@@ -82,23 +82,6 @@
82 value = option.parse(value)82 value = option.parse(value)
83 parser.set(section.name, option.name, value)83 parser.set(section.name, option.name, value)
8484
85 def set_value_with_precedence(op_value, parser_value, env_value,
86 fatal=True):
87 # 1. op_value != None (only if option is not fatal)
88 # => use op or env value
89 # 2. op_value is None (only if option is fatal)
90 # => use parser or env value
91 if not option.fatal:
92 if op_value != parser_value:
93 # value was overridden via command line
94 set_value(section, option, op_value)
95 elif env_value is not None and env_value != parser_value:
96 # value was overridden via environment variable
97 set_value(section, option, env_value)
98 elif env_value is not None and env_value != parser_value:
99 # value was overridden via environment variable
100 set_value(section, option, env_value)
101
102 for section in schema.sections():85 for section in schema.sections():
103 for option in section.options():86 for option in section.options():
104 op_value = getattr(options, opt_name(option))87 op_value = getattr(options, opt_name(option))
@@ -109,9 +92,15 @@
109 env_value = os.environ.get("CONFIGGLUE_{0}".format(92 env_value = os.environ.get("CONFIGGLUE_{0}".format(
110 long_name(option).upper()))93 long_name(option).upper()))
11194
112 assert option.fatal == (op_value is None)95 # 1. op value != parser value
113 set_value_with_precedence(op_value, parser_value, env_value,96 # 2. op value == parser value != env value
114 fatal=option.fatal)97 # 3. op value == parser value == env value or not env value
98
99 # if option is fatal, op_value will be None, so skip this case too
100 if op_value != parser_value and not option.fatal:
101 set_value(section, option, op_value)
102 elif env_value is not None and env_value != parser_value:
103 set_value(section, option, env_value)
115104
116 return op, options, args105 return op, options, args
117106
118107
=== modified file 'configglue/tests/test_schemaconfig.py'
--- configglue/tests/test_schemaconfig.py 2011-07-23 20:26:42 +0000
+++ configglue/tests/test_schemaconfig.py 2011-07-27 00:14:29 +0000
@@ -234,6 +234,34 @@
234 finally:234 finally:
235 sys.argv = _argv235 sys.argv = _argv
236236
237 def test_glue_environ_precedence_null_option(self):
238 class MySchema(Schema):
239 foo = StringOption(null=True)
240
241 parser = SchemaConfigParser(MySchema())
242
243 with patch.object(os, 'environ', {'CONFIGGLUE_FOO': '42'}):
244 _argv, sys.argv = sys.argv, ['prognam']
245 try:
246 op, options, args = schemaconfigglue(parser)
247 self.assertEqual(parser.get('__main__', 'foo'), '42')
248 finally:
249 sys.argv = _argv
250
251 def test_glue_environ_precedence_null_and_fatal_option(self):
252 class MySchema(Schema):
253 foo = StringOption(null=True, fatal=True)
254
255 parser = SchemaConfigParser(MySchema())
256
257 with patch.object(os, 'environ', {'CONFIGGLUE_FOO': '42'}):
258 _argv, sys.argv = sys.argv, ['prognam']
259 try:
260 op, options, args = schemaconfigglue(parser)
261 self.assertEqual(parser.get('__main__', 'foo'), '42')
262 finally:
263 sys.argv = _argv
264
237 def test_ambiguous_option(self):265 def test_ambiguous_option(self):
238 """Test schemaconfigglue when an ambiguous option is specified."""266 """Test schemaconfigglue when an ambiguous option is specified."""
239 class MySchema(Schema):267 class MySchema(Schema):

Subscribers

People subscribed via source and target branches