diff --git a/flopy4/block.py b/flopy4/block.py index 208d30f..17a7f6d 100644 --- a/flopy4/block.py +++ b/flopy4/block.py @@ -1,7 +1,7 @@ from collections.abc import MutableMapping from typing import Any, Dict -from flopy4.parameter import MFParameter +from flopy4.parameter import MFParameter, MFParameters from flopy4.utils import strip @@ -20,7 +20,7 @@ class MFBlock(MutableMapping): def __init__(self, name=None, index=None, *args, **kwargs): self.name = name self.index = index - self.params = dict() + self.params = MFParameters() self.update(dict(*args, **kwargs)) for key, param in self.items(): setattr(self, key, param) @@ -50,12 +50,13 @@ def __len__(self): return len(self.params) @classmethod - def load(cls, f): + def load(cls, f, strict=False): name = None index = None found = False params = dict() members = get_member_params(cls) + while True: pos = f.tell() line = strip(f.readline()).lower() @@ -69,7 +70,7 @@ def load(cls, f): elif key == "end": break elif found: - if key in members: + if not strict or key in members: f.seek(pos) param = members[key] param.block = name @@ -86,3 +87,7 @@ def write(self, f): for param in self.values(): param.write(f) f.write(end) + + +class MFBlocks: + pass diff --git a/flopy4/parameter.py b/flopy4/parameter.py index 524e1e1..f0cc827 100644 --- a/flopy4/parameter.py +++ b/flopy4/parameter.py @@ -1,4 +1,5 @@ from abc import abstractmethod +from collections.abc import MutableMapping from dataclasses import dataclass, fields from enum import Enum from typing import Any, Optional @@ -129,8 +130,37 @@ def __init__( default_value=default_value, ) + def __get__(self, instance, _): + if instance is None: + return self + else: + return self.value + @property @abstractmethod def value(self) -> Optional[Any]: """Get the parameter's value, if loaded.""" pass + + +class MFParameters(MutableMapping): + def __init__(self, *args, **kwargs): + self.params = dict() + self.update(dict(*args, **kwargs)) + for key, param in self.items(): + setattr(self, key, param) + + def __getitem__(self, key): + return self.params[key] + + def __setitem__(self, key, value): + self.params[key] = value + + def __delitem__(self, key): + del self.params[key] + + def __iter__(self): + return iter(self.params) + + def __len__(self): + return len(self.params) diff --git a/test/test_block.py b/test/test_block.py index 06be215..2f66ce5 100644 --- a/test/test_block.py +++ b/test/test_block.py @@ -13,7 +13,7 @@ class TestBlock(MFBlock): # a = MFArray(description="array") -def test_get_member_params(): +def test_params(): params = get_member_params(TestBlock) assert len(params) == 5 @@ -48,7 +48,7 @@ def test_get_member_params(): # assert not f.optional -def test_block_load_write_no_index(tmp_path): +def test_load_write(tmp_path): name = "options" fpth = tmp_path / f"{name}.txt" with open(fpth, "w") as f: