diff --git a/dvc/command/experiments.py b/dvc/command/experiments.py index 47d35c357..7e9937755 100644 --- a/dvc/command/experiments.py +++ b/dvc/command/experiments.py @@ -956,7 +956,10 @@ def add_parser(subparsers, parent_parser): ) experiments_show_parser.add_argument( "--sort-order", - help="Sort order to use with --sort-by.", + help=( + "Sort order to use with --sort-by." + " Defaults to ascending ('asc')." + ), choices=("asc", "desc"), default="asc", ) diff --git a/tests/unit/command/test_experiments.py b/tests/unit/command/test_experiments.py index 1439c9d76..7278d8bc9 100644 --- a/tests/unit/command/test_experiments.py +++ b/tests/unit/command/test_experiments.py @@ -1,3 +1,4 @@ +import csv from datetime import datetime import pytest @@ -407,6 +408,121 @@ def test_show_experiments(capsys): ) +@pytest.mark.parametrize("sort_order", ["asc", "desc"]) +def test_show_experiments_sort_by(capsys, sort_order): + sort_experiments = { + "workspace": { + "baseline": { + "data": { + "timestamp": None, + "params": { + "params.yaml": { + "data": { + "foo": 1, + } + } + }, + "queued": False, + "running": False, + "executor": None, + "metrics": {}, + } + } + }, + "233b132676792d89e848e5c9c12e408d7efde78a": { + "baseline": { + "data": { + "timestamp": datetime(2021, 8, 2, 16, 48, 14), + "params": { + "params.yaml": { + "data": { + "foo": 0, + } + } + }, + "queued": False, + "running": False, + "executor": None, + "metrics": {}, + "name": "master", + } + }, + "fad0a94": { + "data": { + "timestamp": datetime(2021, 8, 31, 14, 56, 55), + "params": { + "params.yaml": { + "data": { + "foo": 1, + } + } + }, + "queued": False, + "running": False, + "executor": None, + "metrics": {}, + "name": "exp-89140", + } + }, + "60fcda8": { + "data": { + "timestamp": datetime(2021, 8, 31, 14, 56, 55), + "params": { + "params.yaml": { + "data": { + "foo": 2, + } + } + }, + "queued": False, + "running": False, + "executor": None, + "metrics": {}, + "name": "exp-43537", + } + }, + "a7e9aaf": { + "data": { + "timestamp": datetime(2021, 8, 31, 14, 56, 55), + "params": { + "params.yaml": { + "data": { + "foo": 0, + } + } + }, + "queued": False, + "running": False, + "executor": None, + "metrics": {}, + "name": "exp-4f89e", + } + }, + }, + } + + show_experiments( + sort_experiments, + precision=None, + fill_value="", + iso=True, + csv=True, + sort_by="foo", + sort_order=sort_order, + ) + + cap = capsys.readouterr() + rows = list(csv.reader(cap.out.strip().split("\n"))) + # [3:] To skip header, workspace and baseline(master) + # which are not affected by order + params = tuple([int(row[-1]) for row in rows[3:]]) + + if sort_order == "asc": + assert params == (0, 1, 2) + else: + assert params == (2, 1, 0) + + def test_experiments_init_config(dvc, mocker): with dvc.config.edit() as conf: conf["exp"] = {"code": "new_src", "models": "new_models"}