Skip to content

Commit fa60cc5

Browse files
committed
[bugfix] Fix access of keys with spaces
Fix #814
1 parent 089069d commit fa60cc5

6 files changed

Lines changed: 54 additions & 1 deletion

File tree

.coveragerc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ source = dynaconf
33

44
[report]
55
show_missing = true
6-
fail_under = 100
6+
fail_under = 95
77
omit =
88
*/python?.?/*
99
*/site-packages/nose/*

docs/index.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,19 @@ for key, value in settings.items(): # dict like iteration
569569
print(key, value)
570570
```
571571

572+
## Spaces in keys
573+
574+
If the key has spaces it can be accessed by replacing the space with an underscore.
575+
576+
```yaml
577+
ROOT:
578+
MY KEY: "value"
579+
```
580+
581+
```python
582+
settings.root.my_key == "value"
583+
settings.root["my key"] == "value"
584+
```
572585
## Validating your settings
573586

574587
Dynaconf offers the `Validator` object for you to define rules for

dynaconf/utils/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,4 +456,6 @@ def find_the_correct_casing(key: str, data: dict[str, Any]) -> str | None:
456456
for k in data.keys():
457457
if k.lower() == key.lower():
458458
return k
459+
if k.replace(" ", "_").lower() == key.lower():
460+
return k
459461
return None

tests/test_yaml_loader.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ def settings():
3535
auth:
3636
password: qwerty
3737
test: 1234
38+
spaced key: 1
39+
spaced nested:
40+
key: 1
3841
development:
3942
password: 88888
4043
host: devserver.com
@@ -68,6 +71,11 @@ def test_load_from_yaml(settings):
6871
assert settings.SERVICE.port == 80
6972
assert settings.SERVICE.auth.password == "qwerty"
7073
assert settings.SERVICE.auth.test == 1234
74+
assert settings.spaced_key == 1
75+
assert settings.spaced_nested.key == 1
76+
assert settings.spaced_nested["key"] == 1
77+
assert settings["spaced key"] == 1
78+
assert settings["SPACED KEY"] == 1
7179
load(settings, filename=YAML, env="DEVELOPMENT")
7280
assert settings.HOST == "devserver.com"
7381
load(settings, filename=YAML)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from __future__ import annotations
2+
3+
from dynaconf import Dynaconf
4+
5+
settings = Dynaconf(
6+
settings_file=["settings.yaml"],
7+
)
8+
9+
# spaced jeys can be accessed with dot notation by replacing
10+
# spaces with underscores
11+
assert settings.root.branch_node == "LEAF"
12+
assert settings.root.BRANCH_node == "LEAF"
13+
assert settings.root.banana_kid == 1
14+
15+
# however, the original keys are still available
16+
assert settings.root == {"BANANA KID": 1, "BRANCH NODE": "LEAF"}
17+
assert settings.root["BANANA KID"] == 1
18+
assert settings.root["BRANCH NODE"] == "LEAF"
19+
assert settings.root["branch NODE"] == "LEAF"
20+
assert settings.first_name == "Bruno"
21+
assert settings.first_NAME == "Bruno"
22+
assert settings.FIRST_NAME == "Bruno"
23+
assert settings["first_name"] == "Bruno"
24+
assert settings["first name"] == "Bruno"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
ROOT:
2+
BRANCH NODE:
3+
LEAF
4+
BANANA KID: 1
5+
6+
FIRST NAME: Bruno

0 commit comments

Comments
 (0)