diff --git a/dvc/command/params.py b/dvc/command/params.py index aafffb2637..52dad57b69 100644 --- a/dvc/command/params.py +++ b/dvc/command/params.py @@ -1,6 +1,8 @@ import argparse import logging +from collections import OrderedDict + from dvc.command.base import append_doc_link from dvc.command.base import CmdBase from dvc.command.base import fix_subparsers @@ -14,8 +16,9 @@ def _show_diff(diff): from dvc.utils.diff import table rows = [] - for fname, mdiff in diff.items(): - for param, change in mdiff.items(): + for fname, pdiff in diff.items(): + sorted_pdiff = OrderedDict(sorted(pdiff.items())) + for param, change in sorted_pdiff.items(): rows.append([fname, param, change["old"], change["new"]]) return table(["Path", "Param", "Old", "New"], rows) diff --git a/tests/unit/command/test_params.py b/tests/unit/command/test_params.py index fe0420fc3b..16df62d90b 100644 --- a/tests/unit/command/test_params.py +++ b/tests/unit/command/test_params.py @@ -83,3 +83,20 @@ def test_params_diff_show_json(dvc, mocker, caplog): with caplog.at_level(logging.INFO, logger="dvc"): assert cmd.run() == 0 assert '{"params.yaml": {"a": "b"}}\n' in caplog.text + + +def test_params_diff_sorted(): + assert _show_diff( + { + "params.yaml": { + "x.b": {"old": 5, "new": 6}, + "a.d.e": {"old": 3, "new": 4}, + "a.b.c": {"old": 1, "new": 2}, + } + } + ) == ( + " Path Param Old New\n" + "params.yaml a.b.c 1 2 \n" + "params.yaml a.d.e 3 4 \n" + "params.yaml x.b 5 6 " + )