Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions datafiles/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class Meta:
datafile_manual: bool = False
datafile_defaults: bool = False
datafile_infer: bool = False
datafile_key_attrs: Optional[Dict[str, Converter]] = None


def load(obj) -> Meta:
Expand All @@ -30,5 +31,7 @@ def load(obj) -> Meta:
meta.datafile_defaults = obj.Meta.datafile_defaults
with suppress(AttributeError):
meta.datafile_infer = obj.Meta.datafile_infer
with suppress(AttributeError):
meta.datafile_key_attrs = obj.Meta.datafile_key_attrs

return meta
12 changes: 12 additions & 0 deletions datafiles/mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ def __init__(
manual: bool,
defaults: bool,
infer: bool,
key_attrs: Dict,
root: Optional[Mapper] = None,
) -> None:
assert manual is not None
Expand All @@ -38,6 +39,7 @@ def __init__(
self._manual = manual
self.defaults = defaults
self._infer = infer
self.key_attrs = key_attrs
self._last_load = 0.0
self._last_data: Dict = {}
self._root = root
Expand Down Expand Up @@ -278,6 +280,7 @@ def create_mapper(obj, root=None) -> Mapper:
meta = config.load(obj)
attrs = meta.datafile_attrs
pattern = meta.datafile_pattern
key_attrs = meta.datafile_key_attrs

if attrs is None and dataclasses.is_dataclass(obj):
attrs = {}
Expand All @@ -287,12 +290,21 @@ def create_mapper(obj, root=None) -> Mapper:
if pattern is None or self_name not in pattern:
attrs[field.name] = map_type(resolve(field.type, obj), name=field.name) # type: ignore

if key_attrs is None and dataclasses.is_dataclass(obj):
key_attrs = {}
log.debug(f"Mapping key attributes for {obj.__class__} object")
for field in dataclasses.fields(obj):
self_name = f"self.{field.name}"
if pattern is not None and self_name in pattern:
key_attrs[field.name] = map_type(resolve(field.type, obj), name=field.name) # type: ignore

return Mapper(
obj,
attrs=attrs or {},
pattern=pattern,
manual=meta.datafile_manual,
defaults=meta.datafile_defaults,
infer=meta.datafile_infer,
key_attrs=key_attrs or {},
root=root,
)
1 change: 1 addition & 0 deletions datafiles/tests/test_mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def mapper():
manual=Meta.datafile_manual,
defaults=Meta.datafile_defaults,
infer=Meta.datafile_infer,
key_attrs={},
)

def describe_path():
Expand Down