Implement section overriding in baseparser
@@ -145,6 +145,26 @@ class ConfigOptionParser(CustomOptionParser):
print("An error occurred during configuration: %s" % exc)
sys.exit(3)
+ def _get_ordered_configuration_items(self):
+ # Configuration gives keys in an unordered manner. Order them.
+ override_order = ["global", self.name, ":env:"]
+
+ # Pool the options into different groups
+ section_items = {name: [] for name in override_order}
+ for key, val in self.config.items():
+ # ignore empty values
+ if not val:
+ continue
+
+ section, key = key.split(".", 1)
+ if section in override_order:
+ section_items[section].append((key, val))
+
+ # Yield each group in their override order
+ for section in override_order:
+ for key, val in section_items[section]:
+ yield key, val
+
def _update_defaults(self, defaults):
"""Updates the given defaults with values from the config files and
the environ. Does a little special handling for certain types of
@@ -157,14 +177,7 @@ class ConfigOptionParser(CustomOptionParser):
self.values = optparse.Values(self.defaults)
late_eval = set()
# Then set the options with those values
- for key, val in self.config.items():
- # ignore empty values
- if not val:
- continue
- section, key = key.split(".", 1)
- if section not in {self.name, "global", ":env:"}:
- continue
-
+ for key, val in self._get_ordered_configuration_items():
# '--' because configuration supports only long names
option = self.get_option('--' + key)
