Predictable variables in chained config#6192
Merged
Merged
Conversation
pdelboca
reviewed
Jul 12, 2021
Member
|
This looks good @smotornyuk, can you add a changelog entry for the change in behaviour (it's unlikely people will get hit by it but better to be thorough) |
Member
Author
|
Done |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
At the moment chained config files evaluate variables in the order they are parsed. This means that the following case
will produce
output == B, becauseb.iniis parsed afterc.ini(as dependency) and thusvarfromb.inioverridesc.iniversion.As a result, one can't use inside
c.iniany variable that is defined ina.iniorb.ini(because these files are not parsed yet)I think that python-like behavior is more appropriate in that case. When
class C(B): ...is defined, we expectCto override values fromBand not vice versa. The only exception is theherevariable - it must never be overridden and must always refer to the file where it used.Keeping this special case in mind, I've updated the logic. Now configuration files are parsed starting from the last file in the chain (
a.iniin the example above), values that contain%(here)sare evaluated immediately and all other values are evaluated when parsing is finished.Note: that means that now
[DEFAULTS]from the top-level config (c.ini) has higher precedence. Previously[DEFAULTS]from the very last file (a.ini) were used. Thus it's a breaking change, but I think it still can be backported to v2.9.4