Source code for ogstools.materiallib.core.property
# SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
# SPDX-License-Identifier: BSD-3-Clause
from dataclasses import dataclass
from typing import Any
from ogstools.materiallib.distributions import Distribution
[docs]
@dataclass(frozen=True)
class ParameterValue:
base_value: Any
distribution: Distribution | None = None
[docs]
class MaterialProperty:
[docs]
def __init__(
self,
name: str,
type_: str,
parameters: dict[str, ParameterValue],
**extra: Any,
):
self.name = name
self.type = type_
self.parameters = parameters
self.extra = extra # e.g. unit, slope, source, ...
[docs]
def to_dict(self) -> dict[str, Any]:
d: dict[str, Any] = {"name": self.name, "type": self.type}
d.update(self.parameters)
d.update(self.extra)
return d
def __repr__(self) -> str:
return f"{self.name} ({self.type})"
def __str__(self) -> str:
lines = [f"{self.name} ({self.type})"]
for k, v in self.parameters.items():
lines.append(f" {k}: {v}")
for k, v in self.extra.items():
lines.append(f" {k}: {v}")
return "\n".join(lines)
[docs]
def parameter(self, name: str) -> ParameterValue:
if name not in self.parameters:
msg = f"Property {self.name} has no parameter called '{name}'."
raise KeyError(msg)
return self.parameters[name]
[docs]
def get(self, key: str, default: str | None = None) -> Any:
if key in ["name", "type", "parameters"]:
return getattr(self, key)
if key in self.parameters:
return self.parameters[key]
if key not in self.extra:
if default is None:
msg = f"Property {self.name} has no attribute called '{key}'."
raise KeyError(msg)
return default
return self.extra[key]