Skip to content

Commit

Permalink
CDD-2123: Move build_chart_config_params() to ChartSettings
Browse files Browse the repository at this point in the history
  • Loading branch information
phill-stanley committed Sep 9, 2024
1 parent d188a0c commit 9183541
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 86 deletions.
46 changes: 36 additions & 10 deletions metrics/domain/charts/chart_settings.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import datetime
from decimal import Decimal

from metrics.domain.charts import colour_scheme
from metrics.domain.charts.type_hints import DICT_OF_STR_ONLY
from metrics.domain.charts.utils import return_formatted_max_y_axis_value
from metrics.domain.common.utils import DEFAULT_CHART_WIDTH, get_last_day_of_month
from metrics.domain.models import PlotData

Expand Down Expand Up @@ -102,13 +104,37 @@ def get_line_with_shaded_section_chart_config(self):
chart_config["showlegend"] = False
return chart_config

def get_line_single_simplified_chart_config(
def build_line_single_simplified_axis_params(
self,
x_axis_tick_values: list[int],
x_axis_tick_text: list[str],
y_axis_tick_values: list[int],
y_axis_tick_text: list[str],
):
) -> dict[str, list[str | int | Decimal]]:
"""Creates the parameters for `get_line_single_simplified_chart_config`
Returns:
dictionary of parameters for charts settings parameters
"""
plot_data = self.plots_data[0]
return {
"x_axis_tick_values": [
plot_data.x_axis_values[0],
plot_data.x_axis_values[-1],
],
"x_axis_tick_text": [
plot_data.x_axis_values[0].strftime("%b, %Y"),
plot_data.x_axis_values[-1].strftime("%b, %Y"),
],
"y_axis_tick_values": [0, max(plot_data.y_axis_values)],
"y_axis_tick_text": [
"0",
return_formatted_max_y_axis_value(
y_axis_values=plot_data.y_axis_values,
),
],
}

def get_line_single_simplified_chart_config(self):

axis_params = self.build_line_single_simplified_axis_params()

# Chart Config
chart_config = self.get_base_chart_config()
chart_config["showlegend"] = False
Expand All @@ -118,8 +144,8 @@ def get_line_single_simplified_chart_config(

# x_axis config
chart_config["xaxis"]["ticks"] = "outside"
chart_config["xaxis"]["tickvals"] = x_axis_tick_values
chart_config["xaxis"]["ticktext"] = x_axis_tick_text
chart_config["xaxis"]["tickvals"] = axis_params["x_axis_tick_values"]
chart_config["xaxis"]["ticktext"] = axis_params["x_axis_tick_text"]
chart_config["xaxis"]["ticklen"] = 0
chart_config["xaxis"]["tickfont"][
"color"
Expand All @@ -128,8 +154,8 @@ def get_line_single_simplified_chart_config(
# y_axis config
chart_config["yaxis"]["zeroline"] = False
chart_config["yaxis"]["ticks"] = "outside"
chart_config["yaxis"]["tickvals"] = y_axis_tick_values
chart_config["yaxis"]["ticktext"] = y_axis_tick_text
chart_config["yaxis"]["tickvals"] = axis_params["y_axis_tick_values"]
chart_config["yaxis"]["ticktext"] = axis_params["y_axis_tick_text"]
chart_config["yaxis"]["ticklen"] = 0
chart_config["yaxis"]["tickfont"][
"color"
Expand Down
1 change: 0 additions & 1 deletion metrics/domain/charts/line_single_simplified/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
from .generation import generate_chart_figure
from .utils import return_formatted_max_y_axis_value
55 changes: 5 additions & 50 deletions metrics/domain/charts/line_single_simplified/generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,52 +7,19 @@
from metrics.domain.charts.colour_scheme import RGBAChartLineColours
from metrics.domain.models import PlotData

from .utils import return_formatted_max_y_axis_value


def _build_chart_config_params(
x_axis_values: list[datetime.date],
y_axis_values: list[Decimal],
) -> dict[str | int | Decimal]:
"""Creates the parameters for `get_line_single_simplified_chart_config`
Args:
x_axis_values: list of dates for the x_axis of a chart
y_axis_values: list of Decimal values for the y_axis of a chart
Returns:
dictionary of parameters for charts settings parameters
"""
return {
"x_axis_tick_values": [x_axis_values[0], x_axis_values[-1]],
"x_axis_tick_text": [
x_axis_values[0].strftime("%b, %Y"),
x_axis_values[-1].strftime("%b, %Y"),
],
"y_axis_tick_values": [0, max(y_axis_values)],
"y_axis_tick_text": [
"0",
return_formatted_max_y_axis_value(y_axis_values=y_axis_values),
],
}


def create_simplified_line_chart(
*,
plot_data: PlotData,
chart_height: int,
chart_width: int,
x_axis_values: list[str],
y_axis_values: list[Decimal],
) -> plotly.graph_objects.Figure:
"""Creates a `Figure` object for the given `values` as a line graph with a shaded region.
Args:
plot_data: `PlotData` model
chart_height: chart width as an integer
chart_width: chart height as an integer
x_axis_values: list of `datetime.date` objects
y_axis_values: list of `Decimal` values
Returns:
`Figure`: A `Plotly` object which can be
Expand All @@ -67,8 +34,8 @@ def create_simplified_line_chart(
line_shape = "spline" if plot_data[0].parameters.use_smooth_lines else "linear"

line_plot: dict = _create_line_plot(
x_axis_values=x_axis_values,
y_axis_values=y_axis_values,
x_axis_values=plot_data[0].x_axis_values,
y_axis_values=plot_data[0].y_axis_values,
line_shape=line_shape,
colour=selected_colour.stringified,
)
Expand All @@ -79,20 +46,16 @@ def create_simplified_line_chart(
width=chart_width, height=chart_height, plots_data=plot_data
)

layout_params = _build_chart_config_params(
x_axis_values=x_axis_values,
y_axis_values=y_axis_values,
)
layout_args = settings.get_line_single_simplified_chart_config(**layout_params)
layout_args = settings.get_line_single_simplified_chart_config()
figure.update_layout(**layout_args)

return figure


def _create_line_plot(
*,
x_axis_values: list[str],
y_axis_values: list[str],
x_axis_values: list[datetime.date],
y_axis_values: list[Decimal],
colour: str,
line_shape: str,
) -> dict:
Expand All @@ -110,8 +73,6 @@ def generate_chart_figure(
plot_data: PlotData,
chart_height: int,
chart_width: int,
x_axis_values: list[datetime.date],
y_axis_values: list[Decimal],
) -> plotly.graph_objects.Figure:
"""Creates a `Figure` object for the given `chart_plots_data` as a
simplified line graph with a single plot and 4 axis ticks
Expand All @@ -120,10 +81,6 @@ def generate_chart_figure(
plot_data: A `PlotData` model
chart_height: The chart height in pixels
chart_width: The chart width in pixels
x_axis_values: A list of datetime.date objects for
the x-axis of a chart
y_axis_values: A list of Decimal values for the
y-axis of a chart
Returns:
`Figure`: A `Plotly` object which can then be
Expand All @@ -133,6 +90,4 @@ def generate_chart_figure(
plot_data=plot_data,
chart_height=chart_height,
chart_width=chart_width,
x_axis_values=x_axis_values,
y_axis_values=y_axis_values,
)
File renamed without changes.
6 changes: 1 addition & 5 deletions metrics/interfaces/charts/access.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ def param_builder_for_line_with_shaded_section(self, *, plots_data: list[PlotDat
),
}

def param_builder_for_line_single_simplified(self, *, plots_data):
def param_builder_for_line_single_simplified(self, *, plots_data: list[PlotData]):
"""Returns the params required to create a
`line_single_simplified` chart.
Expand All @@ -336,15 +336,11 @@ def param_builder_for_line_single_simplified(self, *, plots_data):
plot_data = plots_data[0]
chart_height = self.chart_plots.chart_height
chart_width = self.chart_plots.chart_width
x_axis_values = plot_data.x_axis_values
y_axis_value = plot_data.y_axis_values

return {
"plot_data": [plot_data],
"chart_height": chart_height,
"chart_width": chart_width,
"x_axis_values": x_axis_values,
"y_axis_values": y_axis_value,
}

def create_optimized_svg(self, *, figure: plotly.graph_objects.Figure) -> str:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def test_line_single_simplified_figure_is_drawn_with_expected_params(
Then the figure is drawn with the expected parameters
"""
# Given
x_axis_values = DATES_FROM_SEP_TO_JAN
y_axis_values = [1.1, 0.9, 0.8, 0.3]
fake_plot_data.x_axis_values = DATES_FROM_SEP_TO_JAN
fake_plot_data.y_axis_values = [1.1, 0.9, 0.8, 0.3]
chart_height = 200
chart_width = 400

Expand All @@ -36,8 +36,6 @@ def test_line_single_simplified_figure_is_drawn_with_expected_params(
plot_data=[fake_plot_data],
chart_height=chart_height,
chart_width=chart_width,
x_axis_values=x_axis_values,
y_axis_values=y_axis_values,
)

# Then
Expand All @@ -49,13 +47,16 @@ def test_line_single_simplified_figure_is_drawn_with_expected_params(

assert figure.layout.margin.l == figure.layout.margin.r == 25

assert figure.layout.xaxis.tickvals == (x_axis_values[0], x_axis_values[-1])
assert figure.layout.xaxis.tickvals == (
fake_plot_data.x_axis_values[0],
fake_plot_data.x_axis_values[-1],
)
assert figure.layout.xaxis.ticktext == (
x_axis_values[0].strftime("%b, %Y"),
x_axis_values[-1].strftime("%b, %Y"),
fake_plot_data.x_axis_values[0].strftime("%b, %Y"),
fake_plot_data.x_axis_values[-1].strftime("%b, %Y"),
)

assert figure.layout.yaxis.tickvals == (0, max(y_axis_values))
assert figure.layout.yaxis.tickvals == (0, max(fake_plot_data.y_axis_values))
assert figure.layout.yaxis.ticktext == (
"0",
"1",
Expand Down
Empty file.
17 changes: 11 additions & 6 deletions tests/unit/metrics/domain/charts/test_chart_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,8 +343,10 @@ def test_get_line_with_shaded_section_chart_config(

assert line_with_shaded_section_chart_config == expected_chart_config

@mock.patch.object(ChartSettings, "build_line_single_simplified_axis_params")
def test_get_line_single_simplified_chart_config(
self,
mock_build_line_single_simplified_axis_params: mock.MagicMock,
fake_chart_settings: ChartSettings,
):
"""
Expand All @@ -355,19 +357,22 @@ def test_get_line_single_simplified_chart_config(
"""
# Given
chart_settings = fake_chart_settings

fake_x_axis_tick_values = [0, 10]
fake_x_axis_tick_text = ["tick01", "tick02"]
fake_y_axis_tick_values = [0, 10]
fake_y_axis_tick_text = ["tick01", "tick02"]

mock_build_line_single_simplified_axis_params.return_value = {
"x_axis_tick_values": fake_x_axis_tick_values,
"x_axis_tick_text": fake_x_axis_tick_text,
"y_axis_tick_values": fake_y_axis_tick_values,
"y_axis_tick_text": fake_y_axis_tick_text,
}

# When
line_single_simplified_chart_config = (
chart_settings.get_line_single_simplified_chart_config(
x_axis_tick_values=fake_x_axis_tick_values,
x_axis_tick_text=fake_x_axis_tick_text,
y_axis_tick_values=fake_y_axis_tick_values,
y_axis_tick_text=fake_y_axis_tick_text,
)
chart_settings.get_line_single_simplified_chart_config()
)

# Then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@
from unittest import mock
from decimal import Decimal

from metrics.domain.charts.line_single_simplified.utils import (
from metrics.domain.charts.utils import (
return_formatted_max_y_axis_value,
)

MODULE_PATH = "metrics.domain.charts"


class TestReturnFormattedMaxYAxisValue:
@mock.patch(
f"{MODULE_PATH}.line_single_simplified.utils.convert_large_numbers_to_short_text"
)
@mock.patch(f"{MODULE_PATH}.utils.convert_large_numbers_to_short_text")
def test_return_formatted_max_y_axis_value_delegates_calls_correctly(
self,
spy_convert_large_numbers_to_short_text: mock.MagicMock,
Expand Down
2 changes: 0 additions & 2 deletions tests/unit/metrics/interfaces/charts/test_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,8 +556,6 @@ def test_param_builder_for_line_single_simplified(
"plot_data": [fake_plot_data],
"chart_height": chart_height,
"chart_width": chart_width,
"x_axis_values": mocked_x_axis_values,
"y_axis_values": mocked_y_axis_values,
}

# Then
Expand Down

0 comments on commit 9183541

Please sign in to comment.