Skip to content
Open
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
22 changes: 16 additions & 6 deletions kloppy/infra/serializers/code/sportscode.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,21 +121,31 @@ def serialize(self, dataset: CodeDataset) -> bytes:
code_.text = code.code

for group, text in code.labels.items():
# Labels can be in two formats:
# {"name": "value"} or {"name": True}
label = etree.SubElement(instance, "label")
if isinstance(text, bool):
# Labels can be in three formats:
# {"name": "value"} or {"name": True} or {"name": ["value1", "value2"]}

# Handle lists of values (multiple labels for same group)
if isinstance(text, list):
for text_item in text:
# Skip boolean values in lists
if not isinstance(text_item, bool):
label = etree.SubElement(instance, "label")
group_ = etree.SubElement(label, "group")
group_.text = str(group)
text_ = etree.SubElement(label, "text")
text_.text = str(text_item)
elif isinstance(text, bool):
if not text:
raise SerializationError(
f"You are not allowed to pass a False value for {group}"
)

label = etree.SubElement(instance, "label")
text_ = etree.SubElement(label, "text")
text_.text = group
else:
label = etree.SubElement(instance, "label")
group_ = etree.SubElement(label, "group")
group_.text = str(group)

text_ = etree.SubElement(label, "text")
text_.text = str(text)

Expand Down
38 changes: 38 additions & 0 deletions kloppy/tests/test_xml.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from datetime import timedelta
from dataclasses import replace

from pandas import DataFrame
from pandas._testing import assert_frame_equal
Expand Down Expand Up @@ -126,3 +127,40 @@ def test_correct_serialization(self, base_dir):
"""
expected_output = bytes(expected_output, "utf-8")
assert output == expected_output

def test_serialization_with_multiple_labels_per_group(self, base_dir):
dataset = sportscode.load(base_dir / "files/code_xml.xml")

# Create a modified code with multiple labels for the same group
modified_code = replace(
dataset.codes[0],
labels={
"Team": ["Henkie", "Klaas"],
"SCORE": ["5-6", "s-1", "s+1"],
"Single": "Value",
},
)

# Create a new dataset with only the modified code
modified_dataset = replace(dataset, records=[modified_code])

serializer = SportsCodeSerializer()
output = serializer.serialize(modified_dataset)

# Verify the output contains multiple label elements for the same group
output_str = output.decode("utf-8")

# Should have 2 Team labels
assert output_str.count("<group>Team</group>") == 2
assert "<text>Henkie</text>" in output_str
assert "<text>Klaas</text>" in output_str

# Should have 3 SCORE labels
assert output_str.count("<group>SCORE</group>") == 3
assert "<text>5-6</text>" in output_str
assert "<text>s-1</text>" in output_str
assert "<text>s+1</text>" in output_str

# Should have 1 Single label
assert output_str.count("<group>Single</group>") == 1
assert "<text>Value</text>" in output_str
2 changes: 1 addition & 1 deletion kloppy/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def performance_logging(
took = (time.time() - start) * 1000
extra = ""
if counter is not None:
extra = f" ({int(counter / took * 1000)}items/sec)"
extra = f" ({counter / took * 1000:.1f}items/sec)"

unit = "ms"
if took < 0.1:
Expand Down
Loading