From 2bf1dd47b496a927963ca250a72ba1940ac93841 Mon Sep 17 00:00:00 2001 From: chillaranand Date: Wed, 7 Jan 2026 23:49:24 +0530 Subject: [PATCH] fix(serialize): include protocol prefix for external paths --- dvc/repo/experiments/serialize.py | 10 ++++++-- tests/unit/repo/experiments/test_serialize.py | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 tests/unit/repo/experiments/test_serialize.py diff --git a/dvc/repo/experiments/serialize.py b/dvc/repo/experiments/serialize.py index 6c9921d4f4..aff5ae3534 100644 --- a/dvc/repo/experiments/serialize.py +++ b/dvc/repo/experiments/serialize.py @@ -62,12 +62,18 @@ def from_repo( params = _gather_params(repo, deps_only=param_deps, on_error="return") metrics = _gather_metrics(repo, on_error="return") + + def _get_path(item) -> str: + if item.is_in_repo: + return relpath(item.fs_path, repo.root_dir) + return item.fs.unstrip_protocol(item.fs_path) + return cls( rev=rev, params=params, metrics=metrics, deps={ - relpath(dep.fs_path, repo.root_dir): ExpDep( + _get_path(dep): ExpDep( hash=dep.hash_info.value if dep.hash_info else None, size=dep.meta.size if dep.meta else None, nfiles=dep.meta.nfiles if dep.meta else None, @@ -79,7 +85,7 @@ def from_repo( ) }, outs={ - relpath(out.fs_path, repo.root_dir): ExpOut( + _get_path(out): ExpOut( hash=out.hash_info.value if out.hash_info else None, size=out.meta.size if out.meta else None, nfiles=out.meta.nfiles if out.meta else None, diff --git a/tests/unit/repo/experiments/test_serialize.py b/tests/unit/repo/experiments/test_serialize.py new file mode 100644 index 0000000000..d977c96e3c --- /dev/null +++ b/tests/unit/repo/experiments/test_serialize.py @@ -0,0 +1,25 @@ +from dvc.repo.experiments.serialize import SerializableExp + + +def test_serialize_external_paths_include_protocol(dvc, mocker): + """External paths should include protocol prefix (e.g. s3://).""" + mock_dep = mocker.MagicMock(fs_path="bucket/data.csv", is_in_repo=False) + mock_dep.fs.unstrip_protocol.return_value = "s3://bucket/data.csv" + + mock_out = mocker.MagicMock( + fs_path="bucket/model.pkl", is_in_repo=False, is_metric=False, is_plot=False + ) + mock_out.fs.unstrip_protocol.return_value = "s3://bucket/model.pkl" + + mocker.patch.object( + type(dvc.index), "deps", mocker.PropertyMock(return_value=[mock_dep]) + ) + mocker.patch.object( + type(dvc.index), "outs", mocker.PropertyMock(return_value=[mock_out]) + ) + mocker.patch.object(dvc, "get_rev", return_value="abc123") + + result = SerializableExp.from_repo(dvc) + + assert "s3://bucket/data.csv" in result.deps + assert "s3://bucket/model.pkl" in result.outs