Skip to content

Commit 0971ac9

Browse files
authored
Merge pull request #168 from jacebrowning/fix-loading-of-missing-optionals
Fix loading of missing optional dataclass fields
2 parents 342e4c5 + bfae958 commit 0971ac9

File tree

4 files changed

+32
-10
lines changed

4 files changed

+32
-10
lines changed

datafiles/converters/containers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ def to_python_value(cls, deserialized_data, *, target_object):
138138
else:
139139
data = {}
140140

141+
if deserialized_data is None and cls.DEFAULT is None:
142+
return None
143+
141144
for name, value in list(data.items()):
142145
if name not in cls.CONVERTERS:
143146
log.debug(f'Removed unmapped nested file attribute: {name}')

poetry.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tool.poetry]
22

33
name = "datafiles"
4-
version = "0.9b1"
4+
version = "0.9b2"
55
description = "File-based ORM for dataclasses."
66

77
license = "MIT"

tests/test_orm_usage.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Tests that represent usage as an ORM."""
22

3-
from dataclasses import dataclass
3+
from typing import Optional
44

55
import pytest
66

@@ -48,7 +48,7 @@ def test_multiple_instances_are_distinct(expect):
4848

4949

5050
def test_classes_can_share_a_nested_dataclass(expect):
51-
@dataclass
51+
@datafile
5252
class Nested:
5353
value: int
5454

@@ -78,3 +78,22 @@ def test_values_are_filled_from_disk(expect):
7878
items = list(InventoryItem.objects.all())
7979

8080
expect(items[0]) == InventoryItem(42, "Things", 0.99)
81+
82+
83+
def test_missing_optional_fields_are_loaded(expect):
84+
@datafile
85+
class Name:
86+
value: str
87+
88+
@datafile("../tmp/samples/{self.key}.json")
89+
class Sample:
90+
91+
key: int
92+
name: Optional[Name]
93+
value: float = 0.0
94+
95+
sample = Sample(42, None)
96+
97+
logbreak("get key=42")
98+
sample2 = Sample.objects.get(42)
99+
expect(sample2.name) == sample.name

0 commit comments

Comments
 (0)