Skip to content
Merged
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
3 changes: 1 addition & 2 deletions datawrapper/charts/area.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Literal

import pandas as pd
from pydantic import ConfigDict, Field, field_validator, model_serializer
from pydantic import ConfigDict, Field, field_validator

from .base import BaseChart
from .enums import (
Expand Down Expand Up @@ -233,7 +233,6 @@ def validate_plot_height_mode(cls, v: PlotHeightMode | str) -> PlotHeightMode |
raise ValueError(f"Invalid value: {v}. Must be one of {valid_values}")
return v

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
3 changes: 1 addition & 2 deletions datawrapper/charts/arrow.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Literal

import pandas as pd
from pydantic import ConfigDict, Field, field_validator, model_serializer
from pydantic import ConfigDict, Field, field_validator

from .base import BaseChart
from .enums import DateFormat, NumberFormat, ReplaceFlagsType
Expand Down Expand Up @@ -200,7 +200,6 @@ def validate_replace_flags(
)
return v

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
3 changes: 1 addition & 2 deletions datawrapper/charts/bar.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Literal

import pandas as pd
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_serializer
from pydantic import BaseModel, ConfigDict, Field, field_validator

from .base import BaseChart
from .enums import DateFormat, NumberFormat, ReplaceFlagsType, ValueLabelAlignment
Expand Down Expand Up @@ -398,7 +398,6 @@ def validate_replace_flags(
)
return v

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
3 changes: 1 addition & 2 deletions datawrapper/charts/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import pandas as pd
from IPython.display import IFrame
from pydantic import BaseModel, ConfigDict, Field, model_serializer, model_validator
from pydantic import BaseModel, ConfigDict, Field, model_validator

from datawrapper.__main__ import Datawrapper
from datawrapper.charts.models import Annotate, Describe, Publish, Transform, Visualize
Expand Down Expand Up @@ -250,7 +250,6 @@ class BaseChart(BaseModel):
# Serialization methods for preparing data for API upload
#

@model_serializer
def serialize_model(self) -> dict[str, Any]:
# Create a dict with the bare minimum provided by the base chart class
# This will be supplemented by subclasses tailored to individual chart types
Expand Down
3 changes: 1 addition & 2 deletions datawrapper/charts/column.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Literal

import pandas as pd
from pydantic import ConfigDict, Field, field_validator, model_serializer
from pydantic import ConfigDict, Field, field_validator

from .base import BaseChart
from .enums import (
Expand Down Expand Up @@ -312,7 +312,6 @@ def _deserialize_custom_ticks(cls, visualize: dict) -> dict:
# Call the parent deserializer with the modified dict
return super()._deserialize_custom_ticks(modified_visualize)

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
2 changes: 0 additions & 2 deletions datawrapper/charts/line.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
ConfigDict,
Field,
field_validator,
model_serializer,
model_validator,
)

Expand Down Expand Up @@ -778,7 +777,6 @@ def validate_plot_height_mode(cls, v: PlotHeightMode | str) -> PlotHeightMode |
raise ValueError(f"Invalid value: {v}. Must be one of {valid_values}")
return v

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
2 changes: 0 additions & 2 deletions datawrapper/charts/multiple_column.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
ConfigDict,
Field,
field_validator,
model_serializer,
model_validator,
)

Expand Down Expand Up @@ -654,7 +653,6 @@ def convert_range_annotations(
description="Show label for all panels",
)

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
3 changes: 1 addition & 2 deletions datawrapper/charts/scatter.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Literal

import pandas as pd
from pydantic import ConfigDict, Field, field_validator, model_serializer
from pydantic import ConfigDict, Field, field_validator

from .base import BaseChart
from .enums import (
Expand Down Expand Up @@ -515,7 +515,6 @@ def validate_plot_height_mode(cls, v: PlotHeightMode | str) -> PlotHeightMode |
description="Whether the tooltip is sticky on click",
)

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
3 changes: 1 addition & 2 deletions datawrapper/charts/stacked_bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import Any, Literal

from pydantic import ConfigDict, Field, field_validator, model_serializer
from pydantic import ConfigDict, Field, field_validator

from .base import BaseChart
from .enums import DateFormat, NumberFormat, ReplaceFlagsType, ValueLabelMode
Expand Down Expand Up @@ -174,7 +174,6 @@ def validate_value_label_mode(cls, v: ValueLabelMode | str) -> ValueLabelMode |
)
return v

@model_serializer
def serialize_model(self) -> dict:
"""Serialize the model to a dictionary."""
# Call the parent class's serialize_model method
Expand Down
4 changes: 2 additions & 2 deletions tests/integration/test_base_metadata_structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def test_metadata_section_order():
)

# Serialize the chart
serialized = chart.model_dump()
serialized = chart.serialize_model()

# Check that root-level fields are present
assert "type" in serialized
Expand Down Expand Up @@ -68,7 +68,7 @@ def test_metadata_content_structure():
}
)

serialized = chart.model_dump()
serialized = chart.serialize_model()
metadata = serialized["metadata"]

# Check data section structure
Expand Down
12 changes: 6 additions & 6 deletions tests/integration/test_base_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_base_chart_serialization_includes_root_metadata():
)

# Serialize the chart
serialized = chart.model_dump()
serialized = chart.serialize_model()

# Verify root-level metadata is present
assert "type" in serialized
Expand All @@ -43,7 +43,7 @@ def test_base_chart_serialization_with_empty_theme():
}
)

serialized = chart.model_dump()
serialized = chart.serialize_model()

# Empty theme should be omitted from serialization (our fix for Datawrapper API compatibility)
assert "theme" not in serialized
Expand All @@ -53,7 +53,7 @@ def test_base_chart_serialization_with_default_values():
"""Test that BaseChart serialization works with default values."""
chart = datawrapper.BaseChart.model_validate({"chart-type": "d3-area"})

serialized = chart.model_dump()
serialized = chart.serialize_model()

# Verify root-level metadata with defaults
assert serialized["type"] == "d3-area"
Expand All @@ -72,7 +72,7 @@ def test_base_chart_serialization_structure():
}
)

serialized = chart.model_dump()
serialized = chart.serialize_model()

# Verify all expected root-level sections are present
expected_root_sections = [
Expand Down Expand Up @@ -108,7 +108,7 @@ def test_base_chart_field_name_is_type_not_chart_type():
"""Test that the serialized field is 'type', not 'chart-type' or 'chart_type'."""
chart = datawrapper.BaseChart.model_validate({"chart-type": "d3-scatter-plot"})

serialized = chart.model_dump()
serialized = chart.serialize_model()

# Should use "type" as the field name in serialized output
assert "type" in serialized
Expand All @@ -132,7 +132,7 @@ def test_base_chart_serialization_with_data():
}
)

serialized = chart.model_dump()
serialized = chart.serialize_model()

# Root metadata should still be present
assert serialized["type"] == "d3-bars"
Expand Down
36 changes: 18 additions & 18 deletions tests/integration/test_multiple_column_chart.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ def test_serialize_basic_chart(self):
data = pd.DataFrame({"Year": [2020, 2021], "Value": [100, 110]})
chart = MultipleColumnChart(title="Test", data=data)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()

assert serialized["type"] == "multiple-columns"
assert serialized["title"] == "Test"
Expand All @@ -172,7 +172,7 @@ def test_serialize_layout_fields(self):
grid_row_height=150,
)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()
viz = serialized["metadata"]["visualize"]

assert viz["gridLayout"] == "minimumWidth"
Expand All @@ -192,7 +192,7 @@ def test_serialize_sort_object(self):
sort_by="range",
)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()
sort_obj = serialized["metadata"]["visualize"]["sort"]

assert sort_obj["enabled"] is True
Expand All @@ -209,7 +209,7 @@ def test_serialize_custom_ticks(self):
custom_ticks_y=[10, 20, 30],
)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()
viz = serialized["metadata"]["visualize"]

assert viz["custom-ticks-x"] == "0,50,100"
Expand All @@ -221,15 +221,15 @@ def test_serialize_grid_lines_x(self):

# Test with x_grid off
chart_off = MultipleColumnChart(title="Test", data=data, x_grid="off")
serialized_off = chart_off.model_dump(by_alias=True)
serialized_off = chart_off.serialize_model()
grid_lines_x_off = serialized_off["metadata"]["visualize"]["grid-lines-x"]

assert grid_lines_x_off["enabled"] is False
assert grid_lines_x_off["type"] == ""

# Test with x_grid on
chart_on = MultipleColumnChart(title="Test", data=data, x_grid="ticks")
serialized_on = chart_on.model_dump(by_alias=True)
serialized_on = chart_on.serialize_model()
grid_lines_x_on = serialized_on["metadata"]["visualize"]["grid-lines-x"]

assert grid_lines_x_on["enabled"] is True
Expand All @@ -246,7 +246,7 @@ def test_serialize_y_axis_labels(self):
y_grid_labels="inside",
y_grid_label_align="right",
)
serialized_on = chart_on.model_dump(by_alias=True)
serialized_on = chart_on.serialize_model()
y_labels_on = serialized_on["metadata"]["visualize"]["yAxisLabels"]

assert y_labels_on["enabled"] is True
Expand All @@ -255,7 +255,7 @@ def test_serialize_y_axis_labels(self):

# Test with labels off
chart_off = MultipleColumnChart(title="Test", data=data, y_grid_labels="off")
serialized_off = chart_off.model_dump(by_alias=True)
serialized_off = chart_off.serialize_model()
y_labels_off = serialized_off["metadata"]["visualize"]["yAxisLabels"]

assert y_labels_off["enabled"] is False
Expand All @@ -269,7 +269,7 @@ def test_serialize_negative_color(self):
chart_enabled = MultipleColumnChart(
title="Test", data=data, negative_color="#FF0000"
)
serialized_enabled = chart_enabled.model_dump(by_alias=True)
serialized_enabled = chart_enabled.serialize_model()
neg_color_enabled = serialized_enabled["metadata"]["visualize"]["negativeColor"]

assert neg_color_enabled["enabled"] is True
Expand All @@ -279,7 +279,7 @@ def test_serialize_negative_color(self):
chart_disabled = MultipleColumnChart(
title="Test", data=data, negative_color=None
)
serialized_disabled = chart_disabled.model_dump(by_alias=True)
serialized_disabled = chart_disabled.serialize_model()
neg_color_disabled = serialized_disabled["metadata"]["visualize"][
"negativeColor"
]
Expand All @@ -295,7 +295,7 @@ def test_serialize_color_category(self):
color_category={"Series A": "#FF0000", "Series B": "#00FF00"},
)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()
viz = serialized["metadata"]["visualize"]

assert viz["color-category"]["map"] == {
Expand All @@ -316,7 +316,7 @@ def test_serialize_panels(self):
],
)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()
panels = serialized["metadata"]["visualize"]["panels"]

assert isinstance(panels, dict)
Expand All @@ -336,7 +336,7 @@ def test_serialize_value_labels(self):
value_labels_format="0,0",
value_labels_placement="inside",
)
serialized_always = chart_always.model_dump(by_alias=True)
serialized_always = chart_always.serialize_model()
val_labels_always = serialized_always["metadata"]["visualize"]["valueLabels"]

assert val_labels_always["show"] == "always"
Expand All @@ -356,7 +356,7 @@ def test_serialize_value_labels(self):
show_value_labels="hover",
value_labels_format="0.0a",
)
serialized_hover = chart_hover.model_dump(by_alias=True)
serialized_hover = chart_hover.serialize_model()
val_labels_hover = serialized_hover["metadata"]["visualize"]["valueLabels"]

assert val_labels_hover["show"] == "hover"
Expand All @@ -373,7 +373,7 @@ def test_serialize_value_labels(self):
chart_off = MultipleColumnChart(
title="Test", data=data, show_value_labels="off"
)
serialized_off = chart_off.model_dump(by_alias=True)
serialized_off = chart_off.serialize_model()
val_labels_off = serialized_off["metadata"]["visualize"]["valueLabels"]

assert val_labels_off["show"] == ""
Expand Down Expand Up @@ -530,7 +530,7 @@ def test_round_trip_basic_chart(self):
)

# Serialize
serialized = original.model_dump(by_alias=True)
serialized = original.serialize_model()

# Parse back (simulating API response)
chart_metadata = {
Expand Down Expand Up @@ -585,7 +585,7 @@ def test_round_trip_with_all_options(self):
)

# Serialize
serialized = original.model_dump(by_alias=True)
serialized = original.serialize_model()

# Parse back
chart_metadata = {
Expand Down Expand Up @@ -644,7 +644,7 @@ def test_metadata_structure_matches(self):
negative_color="#00FF00",
)

serialized = chart.model_dump(by_alias=True)
serialized = chart.serialize_model()
viz = serialized["metadata"]["visualize"]

# Check structure matches expected format
Expand Down
Loading