Skip to content

Commit 39d658e

Browse files
authored
Merge pull request #78 from RadarJam/Recursive-assignment-of-fields-in-settings.py-to-the-app.settings-object
Recursive assignment of fields in settings.py to the app.settings object
2 parents 32aa663 + 3056976 commit 39d658e

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

pyttman/core/internals.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
from dataclasses import dataclass, field
66
from datetime import datetime
77
from typing import Any
8+
import json
9+
from collections import UserDict
10+
811

912
import pyttman
1013
from pyttman.core.containers import MessageMixin, Reply
@@ -32,7 +35,6 @@ def depr_graceful(message: str, version: str):
3235
out = f"{message} - This was deprecated in version {version}."
3336
warnings.warn(out, DeprecationWarning)
3437

35-
3638
class Settings:
3739
"""
3840
Dataclass holding settings configured in the settings.py
@@ -48,7 +50,10 @@ class Settings:
4850
aren't valid settings.
4951
"""
5052

51-
def __init__(self, **kwargs):
53+
def __init__(self, dictionary=None, **kwargs):
54+
if dictionary is None:
55+
dictionary = {}
56+
self.__dict__.update(dictionary)
5257
self.APPEND_LOG_FILES: bool = True
5358
self.MIDDLEWARE: dict | None = None
5459
self.ABILITIES: list | None = None
@@ -60,14 +65,27 @@ def __init__(self, **kwargs):
6065
self.LOG_FORMAT: str | None = None
6166
self.LOG_TO_STDOUT: bool = False
6267

63-
[setattr(self, k, v) for k, v in kwargs.items()
68+
[self._set_attr(k, v) for k, v in kwargs.items()
6469
if not inspect.ismodule(v)
6570
and not inspect.isfunction(v)]
6671

72+
def __getitem__(self, item):
73+
return self.__dict__[item]
74+
75+
def _set_attr(self, k, v):
76+
tmp = v
77+
if isinstance(v, dict):
78+
tmp = Settings._dict_to_object(v)
79+
80+
setattr(self, k, tmp)
81+
6782
def __repr__(self):
6883
_attrs = {name: value for name, value in self.__dict__.items()}
6984
return f"Settings({_attrs})"
7085

86+
@staticmethod
87+
def _dict_to_object(dictionary):
88+
return json.loads(json.dumps(dictionary), object_hook=Settings)
7189

7290
def _generate_name(name):
7391
"""

tests/core/test_settings.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from tests.module_helper import PyttmanInternalBaseTestCase
2+
from pyttman.core.internals import Settings
3+
4+
from importlib import import_module
5+
import pytest
6+
7+
@pytest.fixture
8+
def mockSettings():
9+
10+
mock_settings = {
11+
"d":{
12+
"k1":"v1",
13+
"k2":{
14+
"a":"a",
15+
"b":"b"
16+
}
17+
},
18+
"foo":"bar"
19+
}
20+
21+
return Settings(**mock_settings)
22+
23+
def test_read_settings_with_dictionary(mockSettings):
24+
assert mockSettings.d.k2.a == "a"
25+
assert mockSettings.d["k2"].a == "a"
26+
assert mockSettings.d["k2"]["a"] == "a"
27+
28+
assert mockSettings.d.k1 == "v1"
29+
assert mockSettings.d["k1"] == "v1"
30+
31+
assert mockSettings.foo == "bar"
32+

0 commit comments

Comments
 (0)