def with_append_on_nested_dataclass(expect): sample = SampleWithNesting(1) logbreak("Appending to nested list: 2") sample.nested.items.append(2) expect(read("tmp/sample.yml")) == dedent( """ item: 1 nested: items: - 2 """ ) logbreak("Appending to nested list: 3") sample.nested.items.append(3) expect(read("tmp/sample.yml")) == dedent( """ item: 1 nested: items: - 2 - 3 """ )
def with_update(expect): sample = Sample() logbreak() sample.data.update({'b': 2}) expect(read('tmp/sample.yml')) == dedent( """ data: a: 1 b: 2 """ ) sample.datafile.load() logbreak() sample.data.update({'c': 3}) expect(read('tmp/sample.yml')) == dedent( """ data: a: 1 b: 2 c: 3 """ )
def with_update(expect): sample = Sample() logbreak() sample.data.update({"b": 2}) expect(read("tmp/sample.yml")) == dedent( """ data: a: 1 b: 2 """ ) sample.datafile.load() logbreak() sample.data.update({"c": 3}) expect(read("tmp/sample.yml")) == dedent( """ data: a: 1 b: 2 c: 3 """ )
def with_append(expect): sample = Sample() logbreak("Appending to list: 2") sample.items.append(2) expect(read("tmp/sample.yml")) == dedent( """ items: - 1 - 2 """ ) sample.datafile.load() logbreak("Appending to list: 3") sample.items.append(3) expect(read("tmp/sample.yml")) == dedent( """ items: - 1 - 2 - 3 """ )
def with_setattr(expect): sample = Sample() logbreak("Setting attribute") sample.item = 'b' expect(read('tmp/sample.yml')) == dedent(""" item: b """)
def with_dataclasses(expect): sample = SampleWithListOfDataclasses([_NestedSample1("foobar", 42)]) logbreak("Saving") sample.datafile.save() with open("tmp/sample.yml") as f: expect(f.read()) == dedent(""" items: - name: foobar score: 42.0 """)
def with_setattr_on_nested_dataclass(expect): sample = SampleWithNesting(2) logbreak("Setting nested attribute") sample.nested.name = 'd' logbreak("Reading file") expect(read('tmp/sample.yml')) == dedent(""" item: 2 nested: name: d """)
def with_getattribute(expect): sample = Sample() write( "tmp/sample.yml", """ item: b """, ) logbreak("Getting attribute") expect(sample.item) == "b"
def with_conversion(expect): sample = SampleWithList([1, 2.3, "4.5"]) logbreak("Saving") sample.datafile.save() with open("tmp/sample.yml") as f: expect(f.read()) == dedent(""" items: - 1.0 - 2.3 - 4.5 """)
def with_partial_list_value(expect): write( 'tmp/sample.yml', """ items: - name: abc """, ) logbreak() sample = SampleWithListOfDataclasses() logbreak() expect(sample.items) == [_NestedSample1(name='abc', score=0.0)]
def with_partial_set_value(expect): write( "tmp/sample.yml", """ items: - name: abc """, ) logbreak() sample = SampleWithSetOfDataclasses() logbreak() expect(sample.items) == {_FrozenNestedSample1(name="abc", score=0.0)}
def test_missing_optional_fields_are_loaded(expect): @datafile class Name: value: str @datafile("../tmp/samples/{self.key}.json") class Sample: key: int name: Optional[Name] value: float = 0.0 sample = Sample(42, None) logbreak("get key=42") sample2 = Sample.objects.get(42) expect(sample2.name) == sample.name
def when_dataclass(expect): @dataclass class Name: value: str @datafile("../tmp/samples/{self.key}.yml") @dataclass class Sample: key: int name: Name value: float = 0.0 sample = Sample(42, Name("Widget")) logbreak("Loading missing 'name' dataclass") sample2 = Sample(42, Missing) # type: ignore expect(sample2.name.value) == "Widget"
def with_floats(expect): write( "tmp/sample.yml", """ language: python python: - 3.7 - 3.8 """, ) logbreak("Inferring object") sample = auto("tmp/sample.yml") logbreak("Updating attribute") sample.python.append(4) logbreak("Reading file") expect(read("tmp/sample.yml")) == dedent(""" language: python python: - 3.7 - 3.8 - 4.0 """)
def test_float_inference(expect): write( 'tmp/sample.yml', """ language: python python: - 3.7 - 3.8 """, ) logbreak("Inferring object") sample = auto('tmp/sample.yml') logbreak("Updating attribute") sample.python.append(4) logbreak("Reading file") expect(read('tmp/sample.yml')) == dedent(""" language: python python: - 3.7 - 3.8 - 4.0 """)
def with_nested_mutables(expect): write( "tmp/sample.yml", """ name: Test roles: category1: - value1 - value2 category2: - something - else """, ) logbreak("Inferring object") sample = auto("tmp/sample.yml") logbreak("Updating attributes") sample.roles["category1"].append("value3") logbreak("Reading file") expect(read("tmp/sample.yml")) == dedent(""" name: Test roles: category1: - value1 - value2 - value3 category2: - something - else """)
def test_classes_can_share_a_nested_dataclass(expect): @dataclass class Nested: value: int @datafile('../tmp/sample.json') class Foo: nested: Nested logbreak("Initialize Foo") foo = Foo(Nested(1)) expect(foo.nested.value) == 1 @datafile('../tmp/sample.toml') class Bar: nested: Nested logbreak("Initialize Bar") bar = Bar(Nested(2)) expect(bar.nested.value) == 2
def with_dict(expect): sample = Sample('abc') sample.datafile.text = "data: {'a': 1}" logbreak("Getting attribute") expect(sample.data) == {'a': 1} logbreak("Setting attribute") sample.data['b'] = 2.3 logbreak("Getting attribute") expect(sample.data) == {'a': 1, 'b': 2.3}
def with_heterogeneous_list(expect): sample = Sample('abc') sample.datafile.text = "mixed_items: [1, 'abc']" logbreak("Getting attribute") expect(sample.mixed_items) == [1, "abc"] logbreak("Setting attribute") sample.mixed_items.append(3.2) logbreak("Getting attribute") expect(sample.mixed_items) == [1, "abc", 3.2]
def with_homogeneous_list(expect): sample = Sample('abc') sample.datafile.text = "same_items: [1, 2]" logbreak("Getting attribute") expect(sample.same_items) == [1, 2] logbreak("Setting attribute") sample.same_items.append(3.2) logbreak("Getting attribute") expect(sample.same_items) == [1, 2, 3]
def with_builtin(expect): sample = Sample('abc') sample.datafile.text = "count: 1" logbreak("Getting attribute") expect(sample.count) == 1 logbreak("Setting attribute") sample.count = 4.2 logbreak("Getting attribute") expect(sample.count) == 4
def with_dict(expect): sample = Sample("abc") sample.datafile.text = "data: {'a': 1}" logbreak("Getting attribute") expect(sample.data) == {"a": 1} logbreak("Setting attribute") sample.data["b"] = 2.3 logbreak("Getting attribute") expect(sample.data) == {"a": 1, "b": 2.3}
def with_empty_list(expect): sample = Sample('abc') sample.datafile.text = "empty_items: []" logbreak("Getting attribute") expect(sample.empty_items) == [] logbreak("Setting attribute") sample.empty_items.append(4.2) sample.empty_items.append("abc") logbreak("Getting attribute") expect(sample.empty_items) == [4.2, "abc"]
def test_auto_with_sample_file(expect): write( 'tmp/sample.yml', """ homogeneous_list: - 1 - 2 heterogeneous_list: - 1 - 'abc' empty_list: [] """, ) logbreak("Inferring object") sample = auto('tmp/sample.yml') logbreak("Reading attributes") expect(sample.homogeneous_list) == [1, 2] expect(sample.heterogeneous_list) == [1, 'abc'] expect(sample.empty_list) == [] logbreak("Updating attribute") sample.homogeneous_list.append(3.4) sample.heterogeneous_list.append(5.6) sample.empty_list.append(7.8) logbreak("Reading file") expect(read('tmp/sample.yml')) == dedent(""" homogeneous_list: - 1 - 2 - 3 heterogeneous_list: - 1 - 'abc' - 5.6 empty_list: - 7.8 """)
def with_comments_in_nested_objects(expect): sample = SampleWithNestingAndDefaults(None) write( 'tmp/sample.yml', """ # Heading name: a score: 1.0 # Line nested: # Nested heading name: n score: 2 """, ) logbreak("Loading") sample.datafile.load() logbreak("Modifying") sample.score = 3 sample.nested.score = 4 logbreak("Saving") sample.datafile.save() expect(read('tmp/sample.yml')) == dedent(""" # Heading name: a score: 3.0 # Line nested: # Nested heading name: n score: 4.0 """)
def test_save(): sample = get_sample() logbreak("Saving") sample.datafile.save() # pylint: disable=no-member
def test_load(): sample = get_sample() logbreak("Loading") sample.datafile.load() # pylint: disable=no-member
def with_real_file(expect, filename, count): logbreak("Inferring object") sample = auto(filename) logbreak("Reading attributes") expect(len(sample.datafile.data)) == count
def with_multiple_levels(expect): @dataclass class Bottom: level: int = 4 @dataclass class C: level: int = 3 d: Bottom = Bottom() @dataclass class B: level: int = 2 c: C = C() @dataclass class A: level: int = 1 b: B = B() @datafile('../tmp/sample.toml', defaults=True, auto_save=False) class Top: level: int = 0 a: A = A() sample = Top() expect(read('tmp/sample.toml')) == dedent(""" level = 0 [a] level = 1 [a.b] level = 2 [a.b.c] level = 3 [a.b.c.d] level = 4 """) logbreak("Modifying attribute") sample.a.b.c.d.level = 99 expect(read('tmp/sample.toml')) == dedent(""" level = 0 [a] level = 1 [a.b] level = 2 [a.b.c] level = 3 [a.b.c.d] level = 99 """) write( 'tmp/sample.toml', """ level = 0 [a] level = 10 [a.b] level = 20 [a.b.c] level = 30 [a.b.c.d] level = 40 """, ) logbreak("Reading attribute") expect(sample.a.level) == 10 expect(sample.a.b.level) == 20 expect(sample.a.b.c.level) == 30 expect(sample.a.b.c.d.level) == 40