From a24d8a4e73c0d41474967fbe1fdac86b7e5fc944 Mon Sep 17 00:00:00 2001 From: Doris Lin Date: Mon, 5 Oct 2026 11:34:48 -0700 Subject: [PATCH] keep section info for grouped runsets --- tests/test_reports.py | 26 ++++++++++++++++++++++++ wandb_workspaces/reports/v2/interface.py | 6 +++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/test_reports.py b/tests/test_reports.py index b35e93f..eb31986 100644 --- a/tests/test_reports.py +++ b/tests/test_reports.py @@ -652,6 +652,32 @@ def test_runset_query_parameter(): assert reconstructed_empty_search.query == "" +@pytest.mark.parametrize( + ("key", "expected_groupby"), + [ + ( + Key(section="config", name="algo_backbone.value"), + "config.algo_backbone.value", + ), + (Key(section="summary", name="loss"), "summary.loss"), + (Key(section="summary", name="eval.loss"), "summary.eval.loss"), + (Key(section="run", name="group"), "run.Group"), + (Key(section="run", name="custom.metric"), "run.custom.metric"), + ], +) +def test_runset_groupby_round_trip_preserves_section(key, expected_groupby): + """Loading and saving a runset must not reinterpret a grouping key's section.""" + from wandb_workspaces.reports.v2 import internal + + original = internal.Runset(grouping=[key]) + + runset = wr.Runset._from_model(original) + assert runset.groupby == [expected_groupby] + + round_tripped = runset._to_model() + assert round_tripped.grouping == original.grouping + + def test_metric_to_backend_groupby(): """Test the _metric_to_backend_groupby function with various input formats""" diff --git a/wandb_workspaces/reports/v2/interface.py b/wandb_workspaces/reports/v2/interface.py index fa833fd..0632a75 100644 --- a/wandb_workspaces/reports/v2/interface.py +++ b/wandb_workspaces/reports/v2/interface.py @@ -1285,7 +1285,11 @@ def _from_model(cls, model: internal.Runset): name=model.name, query=model.search.query if model.search else "", filters=filter_string, - groupby=[expr.to_frontend_name(k.name) for k in model.grouping], + # Keep the section explicit so dotted key names are not mistaken for + # "section.name" when groupby strings are parsed again on save. + groupby=[ + f"{k.section}.{expr.to_frontend_name(k.name)}" for k in model.grouping + ], order=[OrderBy._from_model(s) for s in model.sort.keys], run_settings=run_settings, pinned_columns=pinned_columns,