Case Studies
Config Overlay
Configuration overlays start with defaults and then apply environment-specific values.
dictionary overlay
Copying defaults before update keeps the base configuration unchanged.
Config Overlay
config_overlay.py
Replay: real traced execution (multi-file project)
base = {
"debug": "false",
"region": "us",
"workers": "2",
}
dev = {
"debug": "true",
"workers": "1",
}
prod = {
"region": "eu",
"workers": "4",
}
environment = "dev"
config = base.copy()
if environment == "dev":
config.update(dev)
else:
config.update(prod)
parts = []
for key in sorted(config):
parts.append(key + "=" + config[key])
print("config=" + ";".join(parts))
base = {
"debug": "false",
"region": "us",
"workers": "2",
}
dev = {
"debug": "true",
"workers": "1",
}
prod = {
"region": "eu",
"workers": "4",
}
environment = "prod"
config = base.copy()
if environment == "dev":
config.update(dev)
else:
config.update(prod)
parts = []
for key in sorted(config):
parts.append(key + "=" + config[key])
print("config=" + ";".join(parts))
base ← {'debug': 'false', 'region': 'us', 'workers': '2'}, dev ← {'debug': 'true', 'workers': '1'}
1base→ {'debug': 'false', 'region': 'us', 'workers': '2'} = {2 "debug": "false",3 "region": "us",4 "workers": "2",5}67dev→ {'debug': 'true', 'workers': '1'} = {8 "debug": "true",9 "workers": "1",10}1112prod→ {'region': 'eu', 'workers': '4'} = {13 "region": "eu",14 "workers": "4",15}1617environment→ dev = "dev" #@environment="prod"1819config→ {'debug': 'false', 'region': 'us', 'workers': '2'} = base{'debug': 'false', 'region': 'us', 'workers': '2'}.copy()20if environment == "dev":config ← {'debug': 'true', 'region': 'us', 'workers': '1'}
19config = base.copy()20if environmentdev == "dev":21 config→ {'debug': 'true', 'region': 'us', 'workers': '1'}.update(dev{'debug': 'true', 'workers': '1'})22else:parts ← []
25parts→ [] = []26for key in sorted(config):parts ← ['debug=true']
pass 1 of 325parts = []26for keydebug in sorted(config{'debug': 'true', 'region': 'us', 'workers': '1'}):27 parts→ ['debug=true'].append(keydebug + "=" + config[key]true)All 3 passes — pass 1 is the card above pass keyconfig[key]parts1 debug true [] → ['debug=true'] 2 region us ['debug=true'] → ['debug=true', 'region=us'] 3 workers 1 ['debug=true', 'region=us'] → ['debug=true', 'region=us', 'workers=1'] print("config=" + ";".join(parts))
29print("config=" + ";".join(parts['debug=true', 'region=us', 'workers=1']))outputconfig=debug=true;region=us;workers=1
base ← {'debug': 'false', 'region': 'us', 'workers': '2'}, dev ← {'debug': 'true', 'workers': '1'}
1base→ {'debug': 'false', 'region': 'us', 'workers': '2'} = {2 "debug": "false",3 "region": "us",4 "workers": "2",5}67dev→ {'debug': 'true', 'workers': '1'} = {8 "debug": "true",9 "workers": "1",10}1112prod→ {'region': 'eu', 'workers': '4'} = {13 "region": "eu",14 "workers": "4",15}1617environment→ prod = "prod"1819config→ {'debug': 'false', 'region': 'us', 'workers': '2'} = base{'debug': 'false', 'region': 'us', 'workers': '2'}.copy()20if environment == "dev":config ← {'debug': 'false', 'region': 'eu', 'workers': '4'}
20if environment == "dev":21 config.update(dev)22else:23 config→ {'debug': 'false', 'region': 'eu', 'workers': '4'}.update(prod{'region': 'eu', 'workers': '4'})parts ← []
25parts→ [] = []26for key in sorted(config):parts ← ['debug=false']
pass 1 of 325parts = []26for keydebug in sorted(config{'debug': 'false', 'region': 'eu', 'workers': '4'}):27 parts→ ['debug=false'].append(keydebug + "=" + config[key]false)All 3 passes — pass 1 is the card above pass keyconfig[key]parts1 debug false [] → ['debug=false'] 2 region eu ['debug=false'] → ['debug=false', 'region=eu'] 3 workers 4 ['debug=false', 'region=eu'] → ['debug=false', 'region=eu', 'workers=4'] print("config=" + ";".join(parts))
29print("config=" + ";".join(parts['debug=false', 'region=eu', 'workers=4']))outputconfig=debug=false;region=eu;workers=4