Source code for betty.extension.gramps.config
"""
Provide configuration for the :py:class:`betty.extension.Gramps` extension.
"""
from __future__ import annotations
from pathlib import Path
from typing import Iterable, Any, Self
from betty.config import Configuration, ConfigurationSequence
from betty.serde.dump import minimize, Dump, VoidableDump
from betty.serde.load import Asserter, Fields, RequiredField, Assertions, OptionalField
[docs]
class FamilyTreeConfiguration(Configuration):
def __init__(
self,
*,
file_path: Path | None = None,
):
super().__init__()
self.file_path = file_path
def __eq__(self, other: Any) -> bool:
if not isinstance(other, FamilyTreeConfiguration):
return False
return self._file_path == other.file_path
@property
def file_path(self) -> Path | None:
return self._file_path
@file_path.setter
def file_path(self, file_path: Path | None) -> None:
self._file_path = file_path
[docs]
@classmethod
def load(
cls,
dump: Dump,
configuration: Self | None = None,
) -> Self:
if configuration is None:
configuration = cls()
asserter = Asserter()
asserter.assert_record(
Fields(
RequiredField(
"file",
Assertions(asserter.assert_path())
| asserter.assert_setattr(configuration, "file_path"),
),
)
)(dump)
return configuration
[docs]
def dump(self) -> VoidableDump:
return {
"file": str(self.file_path),
}
[docs]
class FamilyTreeConfigurationSequence(ConfigurationSequence[FamilyTreeConfiguration]):
[docs]
def update(self, other: Self) -> None:
self._clear_without_dispatch()
self.append(*other)
@classmethod
def _create_default_item(cls, configuration_key: int) -> FamilyTreeConfiguration:
return FamilyTreeConfiguration()
@classmethod
def _item_type(cls) -> type[FamilyTreeConfiguration]:
return FamilyTreeConfiguration
[docs]
class GrampsConfiguration(Configuration):
def __init__(
self,
*,
family_trees: Iterable[FamilyTreeConfiguration] | None = None,
):
super().__init__()
self._family_trees = FamilyTreeConfigurationSequence(family_trees)
self._family_trees.on_change(self)
@property
def family_trees(self) -> FamilyTreeConfigurationSequence:
return self._family_trees
[docs]
def update(self, other: Self) -> None:
self._family_trees.update(other._family_trees)
[docs]
@classmethod
def load(
cls,
dump: Dump,
configuration: Self | None = None,
) -> Self:
if configuration is None:
configuration = cls()
asserter = Asserter()
asserter.assert_record(
Fields(
OptionalField(
"family_trees",
Assertions(
configuration._family_trees.assert_load(
configuration.family_trees
)
),
),
)
)(dump)
return configuration
[docs]
def dump(self) -> VoidableDump:
return minimize(
{
"family_trees": self.family_trees.dump(),
},
True,
)