Skip to content

Commit cdbf47f

Browse files
committed
Implement series serialization
1 parent 0504813 commit cdbf47f

3 files changed

Lines changed: 114 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
## 0.11.0 (unreleased)
55

6+
- Implemented serialization of series.
7+
68
- Renamed model `Links` to `PartyLinks`.
79

810
- Updated pytest to v9.0.2 (from v8.3.5).

src/lanpartydb/writing.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,40 @@
1111
import dataclasses
1212
from typing import Any
1313

14-
from lanpartydb.models import Party
14+
from lanpartydb.models import Party, Series
1515
import tomlkit
1616

1717

18+
# series
19+
20+
21+
def serialize_series_list(series_list: list[Series]) -> str:
22+
"""Serialize list of series to TOML document."""
23+
aot = tomlkit.aot()
24+
25+
for series in series_list:
26+
series_dict = _series_to_sparse_dict(series)
27+
aot.append(tomlkit.item(series_dict))
28+
29+
doc = tomlkit.document()
30+
doc.append('series', aot)
31+
32+
return _write_toml(doc)
33+
34+
35+
def serialize_series(series: Series) -> str:
36+
"""Serialize series to TOML document."""
37+
series_dict = _series_to_sparse_dict(series)
38+
39+
return _write_toml(series_dict)
40+
41+
42+
def _series_to_sparse_dict(series: Series) -> dict[str, Any]:
43+
data = dataclasses.asdict(series)
44+
_remove_default_values(data)
45+
return data
46+
47+
1848
# party
1949

2050

@@ -50,9 +80,11 @@ def _write_toml(d: dict[str, Any]) -> str:
5080

5181

5282
def _remove_default_values(d: dict[str, Any]) -> dict[str, Any]:
53-
"""Remove `None` and `False`, values from first level of dictionary."""
83+
"""Remove `None`, `False`, and `[]` values from first level of
84+
dictionary.
85+
"""
5486
for k, v in list(d.items()):
55-
if (v is None) or (v is False):
87+
if (v is None) or (v is False) or (v == []):
5688
del d[k]
5789
elif isinstance(v, dict):
5890
_remove_default_values(v)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
"""
2+
:Copyright: 2024-2025 Jochen Kupperschmidt
3+
:License: MIT
4+
"""
5+
6+
from textwrap import dedent
7+
8+
import pytest
9+
10+
from lanpartydb.models import Series
11+
from lanpartydb.writing import serialize_series, serialize_series_list
12+
13+
14+
def test_serialize_series_list():
15+
series_list = [
16+
Series(
17+
slug='gammalan',
18+
name='GammaLAN',
19+
alternative_names=[],
20+
country_codes=['ca', 'us'],
21+
),
22+
Series(
23+
slug='deltalan',
24+
name='DeltaLAN',
25+
alternative_names=['Δ LAN', 'Δέλτα LAN'],
26+
country_codes=['au'],
27+
),
28+
]
29+
30+
assert serialize_series_list(series_list) == dedent("""\
31+
[[series]]
32+
slug = "gammalan"
33+
name = "GammaLAN"
34+
country_codes = ["ca", "us"]
35+
36+
[[series]]
37+
slug = "deltalan"
38+
name = "DeltaLAN"
39+
alternative_names = ["Δ LAN", "Δέλτα LAN"]
40+
country_codes = ["au"]
41+
""")
42+
43+
44+
@pytest.mark.parametrize(
45+
('series', 'expected'),
46+
[
47+
(
48+
Series(
49+
slug='gammalan',
50+
name='GammaLAN',
51+
alternative_names=[],
52+
country_codes=['ca', 'us'],
53+
),
54+
dedent("""\
55+
slug = "gammalan"
56+
name = "GammaLAN"
57+
country_codes = ["ca", "us"]
58+
"""),
59+
),
60+
(
61+
Series(
62+
slug='deltalan',
63+
name='DeltaLAN',
64+
alternative_names=['Δ LAN', 'Δέλτα LAN'],
65+
country_codes=['au'],
66+
),
67+
dedent("""\
68+
slug = "deltalan"
69+
name = "DeltaLAN"
70+
alternative_names = ["Δ LAN", "Δέλτα LAN"]
71+
country_codes = ["au"]
72+
"""),
73+
),
74+
],
75+
)
76+
def test_serialize_series(series: Series, expected: str):
77+
assert serialize_series(series) == expected

0 commit comments

Comments
 (0)