More general 'delete' (accepts iterables) and backports of '|' and '|=' for union/add.

'|=' would work for python 3.9 without extra code, but '|' unfortunately casts 'damask.Config' (subclass of 'dict') to a 'dict'.
This commit is contained in:
Philip Eisenlohr 2021-03-09 19:15:15 +00:00 committed by Martin Diehl
parent 97dbf7c5b0
commit a26e586b14
2 changed files with 47 additions and 25 deletions

View File

@ -1,5 +1,6 @@
import copy import copy
from io import StringIO from io import StringIO
from collections.abc import Iterable
import abc import abc
import numpy as np import numpy as np
@ -44,6 +45,42 @@ class Config(dict):
copy = __copy__ copy = __copy__
def __or__(self,other):
"""
Update configuration with contents of other.
Parameters
----------
other : damask.Config or dict
Key-value pairs that update self.
"""
duplicate = self.copy()
duplicate.update(other)
return duplicate
def __ior__(self,other):
"""Update configuration with contents of other."""
return self.__or__(other)
def delete(self,keys):
"""
Remove configuration keys.
Parameters
----------
keys : iterable or scalar
Label of the key(s) to remove.
"""
duplicate = self.copy()
for k in keys if isinstance(keys, Iterable) and not isinstance(keys, str) else [keys]:
del duplicate[k]
return duplicate
@classmethod @classmethod
def load(cls,fname): def load(cls,fname):
""" """
@ -99,30 +136,6 @@ class Config(dict):
fhandle.write(yaml.dump(self,Dumper=NiceDumper,**kwargs)) fhandle.write(yaml.dump(self,Dumper=NiceDumper,**kwargs))
def add(self,d):
"""
Add dictionary.
d : dict
Dictionary to append.
"""
duplicate = self.copy()
duplicate.update(d)
return duplicate
def delete(self,key):
"""
Delete item.
key : str or scalar
Label of the key to remove.
"""
duplicate = self.copy()
del duplicate[key]
return duplicate
@property @property
@abc.abstractmethod @abc.abstractmethod
def is_complete(self): def is_complete(self):

View File

@ -23,8 +23,17 @@ class TestConfig:
assert Config.load(f) == config assert Config.load(f) == config
def test_add_remove(self): def test_add_remove(self):
dummy = {'hello':'world','foo':'bar'}
config = Config() config = Config()
assert config.add({'hello':'world'}).delete('hello') == config config |= dummy
assert config == Config() | dummy
config = config.delete(dummy)
assert config == Config()
assert (config | dummy ).delete( 'hello' ) == config | {'foo':'bar'}
assert (config | dummy ).delete([ 'hello', 'foo' ]) == config
assert (config | Config(dummy)).delete({ 'hello':1,'foo':2 }) == config
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()