Skip to content

Commit e6ee348

Browse files
committed
- Add primary key attributes to mapper
1 parent 9c67310 commit e6ee348

3 files changed

Lines changed: 16 additions & 0 deletions

File tree

datafiles/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Meta:
1515
datafile_manual: bool = False
1616
datafile_defaults: bool = False
1717
datafile_infer: bool = False
18+
datafile_key_attrs: Optional[Dict[str, Converter]] = None
1819

1920

2021
def load(obj) -> Meta:
@@ -30,5 +31,7 @@ def load(obj) -> Meta:
3031
meta.datafile_defaults = obj.Meta.datafile_defaults
3132
with suppress(AttributeError):
3233
meta.datafile_infer = obj.Meta.datafile_infer
34+
with suppress(AttributeError):
35+
meta.datafile_key_attrs = obj.Meta.datafile_key_attrs
3336

3437
return meta

datafiles/mapper.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(
2828
manual: bool,
2929
defaults: bool,
3030
infer: bool,
31+
key_attrs: Dict,
3132
root: Optional[Mapper] = None,
3233
) -> None:
3334
assert manual is not None
@@ -38,6 +39,7 @@ def __init__(
3839
self._manual = manual
3940
self.defaults = defaults
4041
self._infer = infer
42+
self.key_attrs = key_attrs
4143
self._last_load = 0.0
4244
self._last_data: Dict = {}
4345
self._root = root
@@ -278,6 +280,7 @@ def create_mapper(obj, root=None) -> Mapper:
278280
meta = config.load(obj)
279281
attrs = meta.datafile_attrs
280282
pattern = meta.datafile_pattern
283+
key_attrs = meta.datafile_key_attrs
281284

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

293+
if key_attrs is None and dataclasses.is_dataclass(obj):
294+
key_attrs = {}
295+
log.debug(f"Mapping key attributes for {obj.__class__} object")
296+
for field in dataclasses.fields(obj):
297+
self_name = f"self.{field.name}"
298+
if pattern is not None and self_name in pattern:
299+
key_attrs[field.name] = map_type(resolve(field.type, obj), name=field.name) # type: ignore
300+
290301
return Mapper(
291302
obj,
292303
attrs=attrs or {},
293304
pattern=pattern,
294305
manual=meta.datafile_manual,
295306
defaults=meta.datafile_defaults,
296307
infer=meta.datafile_infer,
308+
key_attrs=key_attrs or {},
297309
root=root,
298310
)

datafiles/tests/test_mapper.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def mapper():
3131
manual=Meta.datafile_manual,
3232
defaults=Meta.datafile_defaults,
3333
infer=Meta.datafile_infer,
34+
key_attrs={},
3435
)
3536

3637
def describe_path():

0 commit comments

Comments
 (0)