more logical behavior
explicit keywords are more important than existing one
This commit is contained in:
parent
7334772f74
commit
8895e7a36f
|
@ -2,6 +2,7 @@ import copy
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
import abc
|
import abc
|
||||||
|
import platform
|
||||||
from typing import Optional, Union, Dict, Any, Type, TypeVar
|
from typing import Optional, Union, Dict, Any, Type, TypeVar
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -69,13 +70,30 @@ class Config(dict):
|
||||||
**kwargs: arbitray keyword-value pairs, optional
|
**kwargs: arbitray keyword-value pairs, optional
|
||||||
Top level entries of the configuration.
|
Top level entries of the configuration.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
-----
|
||||||
|
Values given as keyword-value pairs take precedence
|
||||||
|
over entries with the same keyword in 'config'.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
if int(platform.python_version_tuple()[1]) >= 9:
|
||||||
if isinstance(config,str):
|
if isinstance(config,str):
|
||||||
kwargs.update(yaml.load(config, Loader=SafeLoader))
|
kwargs = yaml.load(config, Loader=SafeLoader) | kwargs
|
||||||
elif isinstance(config,dict):
|
elif isinstance(config,dict):
|
||||||
kwargs.update(config)
|
kwargs = config | kwargs # type: ignore
|
||||||
|
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
else:
|
||||||
|
if isinstance(config,str):
|
||||||
|
c = yaml.load(config, Loader=SafeLoader)
|
||||||
|
elif isinstance(config,dict):
|
||||||
|
c = config.copy()
|
||||||
|
else:
|
||||||
|
c = {}
|
||||||
|
c.update(kwargs)
|
||||||
|
|
||||||
|
super().__init__(**c)
|
||||||
|
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -7,6 +7,17 @@ from damask import Orientation
|
||||||
|
|
||||||
class TestConfig:
|
class TestConfig:
|
||||||
|
|
||||||
|
def test_init_keyword(self):
|
||||||
|
assert Config(p=4)['p'] == 4
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('config',[{'p':1},'{p: 1}'])
|
||||||
|
def test_init_config(self,config):
|
||||||
|
assert Config(config)['p'] == 1
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('config',[{'p':1},'{p: 1}'])
|
||||||
|
def test_init_both(self,config):
|
||||||
|
assert Config(config,p=2)['p'] == 2
|
||||||
|
|
||||||
@pytest.mark.parametrize('flow_style',[None,True,False])
|
@pytest.mark.parametrize('flow_style',[None,True,False])
|
||||||
def test_load_save_str(self,tmp_path,flow_style):
|
def test_load_save_str(self,tmp_path,flow_style):
|
||||||
config = Config()
|
config = Config()
|
||||||
|
@ -36,7 +47,6 @@ class TestConfig:
|
||||||
assert (config | Config(dummy)).delete({ 'hello':1,'foo':2 }) == config
|
assert (config | Config(dummy)).delete({ 'hello':1,'foo':2 }) == config
|
||||||
assert (config | Config(dummy)).delete(Config({'hello':1 })) == config | {'foo':'bar'}
|
assert (config | Config(dummy)).delete(Config({'hello':1 })) == config | {'foo':'bar'}
|
||||||
|
|
||||||
|
|
||||||
def test_repr(self,tmp_path):
|
def test_repr(self,tmp_path):
|
||||||
config = Config()
|
config = Config()
|
||||||
config['A'] = 1
|
config['A'] = 1
|
||||||
|
|
Loading…
Reference in New Issue