Skip to content

Commit e075165

Browse files
[core] feat: add 'dict' option to GarfReport.to_dict
Add support for converting reports to dict with dict values (current implementation was either a scalar or a list)
1 parent 90b6ab7 commit e075165

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

docs/usage/reports.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,16 @@ campaigns_dict = campaigns.to_dict(
8484
# map campaign_id to campaign_name one-to-many
8585
campaigns_dict = campaigns.to_dict(
8686
key_column="campaign_id",
87-
value_column="clicks",
8887
value_column_output="list",
8988
)
89+
90+
# convert `campaigns` to dictionary
91+
# where values are another dictionary
92+
campaigns_dict = campaigns.to_dict(
93+
key_column="campaign_id",
94+
value_column_output="dict",
95+
)
96+
```
9097
```
9198
9299
#### Building

libs/core/garf_core/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@
2626
'ApiReportFetcher',
2727
]
2828

29-
__version__ = '0.4.2'
29+
__version__ = '0.4.3'

libs/core/garf_core/report.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def to_dict(
136136
self,
137137
key_column: str,
138138
value_column: str | None = None,
139-
value_column_output: Literal['scalar', 'list'] = 'list',
139+
value_column_output: Literal['scalar', 'list', 'dict'] = 'list',
140140
) -> dict[str, api_clients.ApiRowElement | list[api_clients.ApiRowElement]]:
141141
"""Converts report to dictionary.
142142
@@ -174,7 +174,18 @@ def to_dict(
174174
if not value_column:
175175
value = dict(zip(self.column_names, value))
176176
if value_column_output == 'list':
177+
if not value_column:
178+
del value[key_column]
177179
output[key].append(value)
180+
elif value_column_output == 'dict':
181+
del value[key_column]
182+
if key not in output:
183+
output[key] = value
184+
else:
185+
raise GarfReportError(
186+
f'Non unique values found for key_column: {key_column}, '
187+
'consider using `value_column_output="list"` instead'
188+
)
178189
else:
179190
if output.get(key) and output.get(key) != value:
180191
raise GarfReportError(

libs/core/tests/unit/test_report.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,11 +416,45 @@ def test_multi_column_report_converted_to_dict_with_missing_value_column(
416416
key_column = 'campaign_id'
417417
output_dict = multi_column_report.to_dict(key_column=key_column)
418418
assert output_dict == {
419-
1: [{'campaign_id': 1, 'ad_group_id': 2}],
420-
2: [{'campaign_id': 2, 'ad_group_id': 3}],
421-
3: [{'campaign_id': 3, 'ad_group_id': 4}],
419+
1: [{'ad_group_id': 2}],
420+
2: [{'ad_group_id': 3}],
421+
3: [{'ad_group_id': 4}],
422422
}
423423

424+
test_report = report.GarfReport(
425+
results=[[1, 1], [1, 2], [1, 3]],
426+
column_names=['campaign_id', 'ad_group_id'],
427+
)
428+
key_column = 'campaign_id'
429+
output_dict = test_report.to_dict(
430+
key_column=key_column, value_column_output='list'
431+
)
432+
assert output_dict == {
433+
1: [{'ad_group_id': 1}, {'ad_group_id': 2}, {'ad_group_id': 3}]
434+
}
435+
436+
def test_multi_column_report_converted_to_dict_with_dict_values(self):
437+
test_report = report.GarfReport(
438+
results=[[1, 1], [1, 2], [1, 3]],
439+
column_names=['campaign_id', 'ad_group_id'],
440+
)
441+
key_column = 'ad_group_id'
442+
output_dict = test_report.to_dict(
443+
key_column=key_column, value_column_output='dict'
444+
)
445+
assert output_dict == {
446+
1: {'campaign_id': 1},
447+
2: {'campaign_id': 1},
448+
3: {'campaign_id': 1},
449+
}
450+
451+
key_column = 'campaign_id'
452+
with pytest.raises(
453+
report.GarfReportError,
454+
match=f'Non unique values found for key_column: {key_column}',
455+
):
456+
test_report.to_dict(key_column=key_column, value_column_output='dict')
457+
424458
def test_multi_column_report_converted_to_dict_without_arguments(
425459
self,
426460
multi_column_report,

0 commit comments

Comments
 (0)