From 55d492c9c633912685351b32df91bfe1f9ecefb9 Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Tue, 4 Oct 2022 14:21:27 +1100 Subject: [PATCH 1/4] Use exp show status (drop queued and running) --- extension/src/cli/dvc/contract.ts | 10 +- .../src/experiments/data/collect.test.ts | 5 +- extension/src/experiments/index.ts | 4 +- .../src/experiments/model/accumulator.ts | 4 +- .../src/experiments/model/collect.test.ts | 25 +- extension/src/experiments/model/collect.ts | 16 +- extension/src/experiments/model/index.test.ts | 13 +- extension/src/experiments/model/index.ts | 38 +-- .../experiments/model/sortBy/index.test.ts | 1 - .../experiments/model/status/collect.test.ts | 3 +- .../src/experiments/model/status/collect.ts | 5 +- .../experiments/model/status/index.test.ts | 3 +- .../src/experiments/model/status/index.ts | 5 +- extension/src/experiments/model/tree.test.ts | 9 +- extension/src/experiments/model/tree.ts | 8 +- extension/src/experiments/webview/contract.ts | 2 + extension/src/plots/model/collect.ts | 12 +- .../src/test/fixtures/expShow/dataTypes.ts | 14 +- .../src/test/fixtures/expShow/deeplyNested.ts | 14 +- .../src/test/fixtures/expShow/modified.ts | 272 ++++++------------ extension/src/test/fixtures/expShow/output.ts | 49 ++-- extension/src/test/fixtures/expShow/rows.ts | 49 ++-- .../test/fixtures/expShow/uncommittedDeps.ts | 8 +- .../experiments/model/filterBy/tree.test.ts | 3 +- .../test/suite/experiments/model/tree.test.ts | 18 +- extension/src/test/suite/plots/index.test.ts | 8 +- .../src/experiments/components/table/Cell.tsx | 5 +- .../src/experiments/components/table/Row.tsx | 11 +- .../components/table/RowContextMenu.tsx | 16 +- .../components/table/Table.test.tsx | 12 +- webview/src/stories/Table.stories.tsx | 21 +- webview/src/test/tableDataFixture.ts | 23 +- 32 files changed, 290 insertions(+), 396 deletions(-) diff --git a/extension/src/cli/dvc/contract.ts b/extension/src/cli/dvc/contract.ts index b88858114d..aa343726aa 100644 --- a/extension/src/cli/dvc/contract.ts +++ b/extension/src/cli/dvc/contract.ts @@ -37,11 +37,17 @@ export interface ValueTreeNode { export type ValueTree = ValueTreeRoot | ValueTreeNode +export enum ExperimentStatus { + FAILED = 'Failed', + QUEUED = 'Queued', + RUNNING = 'Running', + SUCCESS = 'Success' +} + export interface BaseExperimentFields { name?: string timestamp?: string | null - queued?: boolean - running?: boolean + status?: ExperimentStatus executor?: string | null checkpoint_tip?: string checkpoint_parent?: string diff --git a/extension/src/experiments/data/collect.test.ts b/extension/src/experiments/data/collect.test.ts index 03248c104c..d58bc94bf0 100644 --- a/extension/src/experiments/data/collect.test.ts +++ b/extension/src/experiments/data/collect.test.ts @@ -1,6 +1,6 @@ import { join } from 'path' import { collectFiles } from './collect' -import { ExperimentsOutput } from '../../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../../cli/dvc/contract' import expShowFixture from '../../test/fixtures/expShow/output' describe('collectFiles', () => { @@ -100,8 +100,7 @@ describe('collectFiles', () => { } } }, - queued: false, - running: true, + status: ExperimentStatus.RUNNING, timestamp: null } } diff --git a/extension/src/experiments/index.ts b/extension/src/experiments/index.ts index 28156f2910..ffbbb3f56c 100644 --- a/extension/src/experiments/index.ts +++ b/extension/src/experiments/index.ts @@ -29,7 +29,7 @@ import { DecorationProvider } from './model/decorationProvider' import { starredFilter } from './model/filterBy/constants' import { ResourceLocator } from '../resourceLocator' import { AvailableCommands, InternalCommands } from '../commands/internal' -import { ExperimentsOutput } from '../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../cli/dvc/contract' import { ViewKey } from '../webview/constants' import { BaseRepository } from '../webview/repository' import { FileSystemData } from '../fileSystem/data' @@ -333,7 +333,7 @@ export class Experiments extends BaseRepository { if (useFilters) { const filteredExperiments = this.experiments .getUnfilteredExperiments() - .filter(exp => !exp.queued) + .filter(exp => exp.status !== ExperimentStatus.QUEUED) if (tooManySelected(filteredExperiments)) { await this.warnAndDoNotAutoApply(filteredExperiments) } else { diff --git a/extension/src/experiments/model/accumulator.ts b/extension/src/experiments/model/accumulator.ts index 7a5c8f5fe3..e65ed74fbb 100644 --- a/extension/src/experiments/model/accumulator.ts +++ b/extension/src/experiments/model/accumulator.ts @@ -1,4 +1,4 @@ -import { Experiment } from '../webview/contract' +import { Experiment, ExperimentStatus } from '../webview/contract' export class ExperimentsAccumulator { public workspace = {} as Experiment @@ -11,6 +11,6 @@ export class ExperimentsAccumulator { if (workspace) { this.workspace = workspace } - this.hasRunning = !!workspace?.running + this.hasRunning = !!(workspace?.status === ExperimentStatus.RUNNING) } } diff --git a/extension/src/experiments/model/collect.test.ts b/extension/src/experiments/model/collect.test.ts index fe5289387a..3ab8bd8645 100644 --- a/extension/src/experiments/model/collect.test.ts +++ b/extension/src/experiments/model/collect.test.ts @@ -1,6 +1,7 @@ import { collectExperiments, collectMutableRevisions } from './collect' import { Experiment } from '../webview/contract' import modifiedFixture from '../../test/fixtures/expShow/modified' +import { ExperimentStatus } from '../../cli/dvc/contract' describe('collectExperiments', () => { it('should return an empty array if no branches are present', () => { @@ -132,16 +133,16 @@ describe('collectExperiments', () => { describe('collectMutableRevisions', () => { const baseExperiments = [ - { label: 'branch-A', running: false, selected: false }, - { label: 'workspace', running: false, selected: false } + { label: 'branch-A', selected: false, status: ExperimentStatus.SUCCESS }, + { label: 'workspace', selected: false, status: ExperimentStatus.FAILED } ] as Experiment[] it('should not return the workspace when there is a selected running checkpoint experiment (race condition)', () => { const experiments = [ { label: 'exp-123', - running: true, - selected: true + selected: true, + status: ExperimentStatus.RUNNING }, ...baseExperiments ] as Experiment[] @@ -154,8 +155,8 @@ describe('collectMutableRevisions', () => { const experiments = [ { label: 'exp-123', - running: true, - selected: false + selected: false, + status: ExperimentStatus.RUNNING }, ...baseExperiments ] as Experiment[] @@ -166,8 +167,8 @@ describe('collectMutableRevisions', () => { it('should return the workspace when there are no checkpoints', () => { const experiments = [ - { label: 'branch-A', running: false, selected: false }, - { label: 'workspace', running: false, selected: false } + { label: 'branch-A', selected: false, status: ExperimentStatus.SUCCESS }, + { label: 'workspace', selected: false, status: ExperimentStatus.SUCCESS } ] as Experiment[] const mutableRevisions = collectMutableRevisions(experiments, false) @@ -176,10 +177,10 @@ describe('collectMutableRevisions', () => { it('should return all running experiments when there are checkpoints', () => { const experiments = [ - { label: 'branch-A', running: false, selected: false }, - { label: 'workspace', running: false, selected: false }, - { label: 'running-1', running: true, selected: false }, - { label: 'running-2', running: true, selected: true } + { label: 'branch-A', selected: false, status: ExperimentStatus.SUCCESS }, + { label: 'workspace', selected: false, status: ExperimentStatus.SUCCESS }, + { label: 'running-1', selected: false, status: ExperimentStatus.RUNNING }, + { label: 'running-2', selected: true, status: ExperimentStatus.RUNNING } ] as Experiment[] const mutableRevisions = collectMutableRevisions(experiments, false) diff --git a/extension/src/experiments/model/collect.ts b/extension/src/experiments/model/collect.ts index f03fc59063..a53ed32b3b 100644 --- a/extension/src/experiments/model/collect.ts +++ b/extension/src/experiments/model/collect.ts @@ -13,7 +13,8 @@ import { ExperimentFieldsOrError, ExperimentFields, ExperimentsBranchOutput, - ExperimentsOutput + ExperimentsOutput, + ExperimentStatus } from '../../cli/dvc/contract' import { addToMapArray } from '../../util/map' import { uniqueValues } from '../../util/array' @@ -228,7 +229,7 @@ const collectHasRunningExperiment = ( acc: ExperimentsAccumulator, experiment: Experiment ) => { - if (experiment.running) { + if (experiment.status === ExperimentStatus.RUNNING) { acc.hasRunning = true } } @@ -327,19 +328,20 @@ const getDefaultMutableRevision = (hasCheckpoints: boolean): string[] => { const noWorkspaceVsSelectedRaceCondition = ( hasCheckpoints: boolean, - running: boolean | undefined, + status: ExperimentStatus | undefined, selected: boolean | undefined -): boolean => !!(hasCheckpoints && running && !selected) +): boolean => + !!(hasCheckpoints && status === ExperimentStatus.RUNNING && !selected) const collectMutableRevision = ( acc: string[], - { label, running, selected }: Experiment, + { label, status, selected }: Experiment, hasCheckpoints: boolean ) => { - if (noWorkspaceVsSelectedRaceCondition(hasCheckpoints, running, selected)) { + if (noWorkspaceVsSelectedRaceCondition(hasCheckpoints, status, selected)) { acc.push('workspace') } - if (running && !hasCheckpoints) { + if (status === ExperimentStatus.RUNNING && !hasCheckpoints) { acc.push(label) } } diff --git a/extension/src/experiments/model/index.test.ts b/extension/src/experiments/model/index.test.ts index fa98aaaf0d..d92af29aa1 100644 --- a/extension/src/experiments/model/index.test.ts +++ b/extension/src/experiments/model/index.test.ts @@ -19,6 +19,7 @@ import { dataTypesOutput, rows as dataTypesRows } from '../../test/fixtures/expShow/dataTypes' +import { ExperimentStatus } from '../../cli/dvc/contract' jest.mock('vscode') @@ -96,8 +97,7 @@ describe('ExperimentsModel', () => { data: { executor: null, params: { 'params.yaml': { data: { epochs: 100 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: null } } @@ -109,8 +109,7 @@ describe('ExperimentsModel', () => { executor: null, name: 'main', params: { 'params.yaml': { data: { epochs: 100 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2022-08-10T19:40:14' } }, @@ -126,8 +125,7 @@ describe('ExperimentsModel', () => { }, executor: null, name: 'exp-750e4', - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2022-08-11T23:04:39' } }, @@ -137,8 +135,7 @@ describe('ExperimentsModel', () => { executor: null, name: 'exp-d6ddc', params: { 'params.yaml': { data: { epochs: 100 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2022-08-11T22:55:46' } } diff --git a/extension/src/experiments/model/index.ts b/extension/src/experiments/model/index.ts index d1d91d0eab..f2fa7b9ca9 100644 --- a/extension/src/experiments/model/index.ts +++ b/extension/src/experiments/model/index.ts @@ -29,9 +29,8 @@ import { reorderListSubset, reorderObjectList } from '../../util/array' -import { ExperimentsOutput } from '../../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../../cli/dvc/contract' import { setContextValue } from '../../vscode/context' -import { hasKey } from '../../util/object' import { flattenMapValues } from '../../util/map' import { ModelWithPersistence } from '../../persistence/model' import { PersistenceKey } from '../../persistence/constants' @@ -130,7 +129,7 @@ export class ExperimentsModel extends ModelWithPersistence { public toggleStatus(id: string) { if ( this.getFlattenedExperiments().find(({ id: queuedId }) => queuedId === id) - ?.queued + ?.status === ExperimentStatus.QUEUED ) { return } @@ -318,8 +317,8 @@ export class ExperimentsModel extends ModelWithPersistence { public getExperimentsWithCheckpoints(): ExperimentWithCheckpoints[] { const experimentsWithCheckpoints: ExperimentWithCheckpoints[] = [] for (const experiment of this.getAllExperiments()) { - const { id, queued } = experiment - if (queued) { + const { id, status } = experiment + if (status === ExperimentStatus.QUEUED) { continue } @@ -412,9 +411,10 @@ export class ExperimentsModel extends ModelWithPersistence { return this.getExperimentsByBranch(branch)?.map(experiment => ({ ...experiment, hasChildren: definedAndNonEmpty(this.checkpointsByTip.get(experiment.id)), - type: experiment.queued - ? ExperimentType.QUEUED - : ExperimentType.EXPERIMENT + type: + experiment.status === ExperimentStatus.QUEUED + ? ExperimentType.QUEUED + : ExperimentType.EXPERIMENT })) } @@ -494,11 +494,11 @@ export class ExperimentsModel extends ModelWithPersistence { } private splitExperimentsByQueued(getQueued = false) { - return this.getFlattenedExperiments().filter(({ queued }) => { + return this.getFlattenedExperiments().filter(({ status }) => { if (getQueued) { - return queued + return status === ExperimentStatus.QUEUED } - return !queued + return status !== ExperimentStatus.QUEUED }) } @@ -569,23 +569,11 @@ export class ExperimentsModel extends ModelWithPersistence { private addDetails(experiment: Experiment) { const { id } = experiment - const starred = !!this.isStarred(id) - - if (!hasKey(this.coloredStatus, id)) { - return { - ...experiment, - selected: false, - starred - } - } - - const selected = this.isSelected(id) - return { ...experiment, displayColor: this.getDisplayColor(id), - selected, - starred + selected: this.isSelected(id), + starred: !!this.isStarred(id) } } diff --git a/extension/src/experiments/model/sortBy/index.test.ts b/extension/src/experiments/model/sortBy/index.test.ts index ac95c56748..e3693d93e3 100644 --- a/extension/src/experiments/model/sortBy/index.test.ts +++ b/extension/src/experiments/model/sortBy/index.test.ts @@ -12,7 +12,6 @@ describe('sortExperiments', () => { checkpoint_tip: 'd3f4a0d3661c5977540d2205d819470cf0d2145a', id: testId, label: testLabel, - queued: false, timestamp: testTimestamp } const testPathArray: [ColumnType, string, string] = [ diff --git a/extension/src/experiments/model/status/collect.test.ts b/extension/src/experiments/model/status/collect.test.ts index 48154385e5..b1f6723547 100644 --- a/extension/src/experiments/model/status/collect.test.ts +++ b/extension/src/experiments/model/status/collect.test.ts @@ -1,6 +1,7 @@ import { collectColoredStatus } from './collect' import { copyOriginalColors } from './colors' import { Experiment } from '../../webview/contract' +import { ExperimentStatus } from '../../../cli/dvc/contract' describe('collectColoredStatus', () => { const buildMockExperiments = (n: number, prefix = 'exp') => { @@ -41,7 +42,7 @@ describe('collectColoredStatus', () => { it('should not push queued experiments into the returned object', () => { const experiments = [ { id: 'exp1' }, - { id: 'exp2', queued: true } + { id: 'exp2', status: ExperimentStatus.QUEUED } ] as Experiment[] const colors = copyOriginalColors() diff --git a/extension/src/experiments/model/status/collect.ts b/extension/src/experiments/model/status/collect.ts index 96b1b04b00..bb5c776868 100644 --- a/extension/src/experiments/model/status/collect.ts +++ b/extension/src/experiments/model/status/collect.ts @@ -4,6 +4,7 @@ import { hasKey } from '../../../util/object' import { Experiment } from '../../webview/contract' import { definedAndNonEmpty, reorderListSubset } from '../../../util/array' import { flattenMapValues } from '../../../util/map' +import { ExperimentStatus } from '../../../cli/dvc/contract' const getStatus = ( acc: ColoredStatus, @@ -21,8 +22,8 @@ const collectStatus = ( experiment: Experiment, unassignColors?: Color[] ) => { - const { id, queued } = experiment - if (!id || queued || hasKey(acc, id)) { + const { id, status } = experiment + if (!id || status === ExperimentStatus.QUEUED || hasKey(acc, id)) { return } diff --git a/extension/src/experiments/model/status/index.test.ts b/extension/src/experiments/model/status/index.test.ts index 60efcdf888..404d6d2369 100644 --- a/extension/src/experiments/model/status/index.test.ts +++ b/extension/src/experiments/model/status/index.test.ts @@ -1,6 +1,7 @@ import { canSelect, limitToMaxSelected } from '.' import { copyOriginalColors } from './colors' import { Experiment } from '../../webview/contract' +import { ExperimentStatus } from '../../../cli/dvc/contract' describe('canSelect', () => { const colors = copyOriginalColors() @@ -48,7 +49,7 @@ describe('limitToMaxSelected', () => { expect( limitToMaxSelected([ ...mockedExperiments, - { id: '1', label: 'R', running: true } + { id: '1', label: 'R', status: ExperimentStatus.RUNNING } ]) .map(({ label }) => label) .sort() diff --git a/extension/src/experiments/model/status/index.ts b/extension/src/experiments/model/status/index.ts index 449dc1f047..386d3a3d40 100644 --- a/extension/src/experiments/model/status/index.ts +++ b/extension/src/experiments/model/status/index.ts @@ -1,5 +1,6 @@ import { Color } from './colors' import { Experiment } from '../../webview/contract' +import { ExperimentStatus } from '../../../cli/dvc/contract' export const MAX_SELECTED_EXPERIMENTS = 7 @@ -25,9 +26,9 @@ const compareTimestamps = (a: Experiment, b: Experiment) => export const limitToMaxSelected = (experiments: Experiment[]) => experiments .sort((a, b) => { - if (a.running === b.running) { + if (a.status === b.status) { return compareTimestamps(a, b) } - return a.running ? -1 : 1 + return a.status === ExperimentStatus.RUNNING ? -1 : 1 }) .slice(0, MAX_SELECTED_EXPERIMENTS) diff --git a/extension/src/experiments/model/tree.test.ts b/extension/src/experiments/model/tree.test.ts index e8c114ba20..ed3a576481 100644 --- a/extension/src/experiments/model/tree.test.ts +++ b/extension/src/experiments/model/tree.test.ts @@ -15,6 +15,7 @@ import { ResourceLocator } from '../../resourceLocator' import { RegisteredCommands } from '../../commands/external' import { getMarkdownString } from '../../vscode/markdownString' import { DecoratableTreeItemScheme, getDecoratableUri } from '../../tree' +import { ExperimentStatus } from '../webview/contract' const mockedCommands = jest.mocked(commands) mockedCommands.registerCommand = jest.fn() @@ -141,8 +142,8 @@ describe('ExperimentsTree', () => { hasChildren: false, id: 'exp-67899', label: 'f0778b3', - running: true, selected: true, + status: ExperimentStatus.RUNNING, type: ExperimentType.EXPERIMENT }, { @@ -150,7 +151,6 @@ describe('ExperimentsTree', () => { hasChildren: false, id: 'exp-abcdef', label: 'e350702', - running: false, selected: false, type: ExperimentType.EXPERIMENT }, @@ -161,7 +161,6 @@ describe('ExperimentsTree', () => { hasChildren: false, id: '139eabc', label: '139eabc', - running: false, selected: false, type: ExperimentType.EXPERIMENT }, @@ -169,7 +168,7 @@ describe('ExperimentsTree', () => { hasChildren: false, id: 'f81f1b5', label: 'f81f1b5', - queued: true, + status: ExperimentStatus.QUEUED, type: ExperimentType.QUEUED } ] @@ -352,7 +351,6 @@ describe('ExperimentsTree', () => { iconPath: getMockedUri('circle-filled', '#b180d7'), id: 'f81f1b5', label: 'f81f1b5', - queued: false, tooltip: undefined, type: ExperimentType.BRANCH } @@ -363,7 +361,6 @@ describe('ExperimentsTree', () => { hasChildren: false, id: 'exp-abcdef', label: 'e350702', - running: false, selected: false, type: ExperimentType.EXPERIMENT } diff --git a/extension/src/experiments/model/tree.ts b/extension/src/experiments/model/tree.ts index 10e9af4369..fed019c877 100644 --- a/extension/src/experiments/model/tree.ts +++ b/extension/src/experiments/model/tree.ts @@ -30,7 +30,7 @@ import { } from '../../commands/external' import { sum } from '../../util/math' import { Disposable } from '../../class/dispose' -import { Experiment } from '../webview/contract' +import { Experiment, ExperimentStatus } from '../webview/contract' export class ExperimentsTree extends Disposable @@ -236,17 +236,17 @@ export class ExperimentsTree private getExperimentIcon({ displayColor, - running, + status, type, selected }: { displayColor?: string label: string - running?: boolean + status?: ExperimentStatus type?: ExperimentType selected?: boolean }): ThemeIcon | Uri | Resource { - if (running) { + if (status === ExperimentStatus.RUNNING) { return this.getUriOrIcon(displayColor, IconName.LOADING_SPIN) } if (type === ExperimentType.QUEUED) { diff --git a/extension/src/experiments/webview/contract.ts b/extension/src/experiments/webview/contract.ts index 08713ee5e8..42f9ebb87e 100644 --- a/extension/src/experiments/webview/contract.ts +++ b/extension/src/experiments/webview/contract.ts @@ -2,6 +2,8 @@ import { BaseExperimentFields, ValueTree } from '../../cli/dvc/contract' import { FilteredCounts } from '../model/filterBy/collect' import { SortDefinition } from '../model/sortBy' +export { ExperimentStatus } from '../../cli/dvc/contract' + export interface MetricOrParamColumns { [filename: string]: ValueTree } diff --git a/extension/src/plots/model/collect.ts b/extension/src/plots/model/collect.ts index 23a01767af..9fef841977 100644 --- a/extension/src/plots/model/collect.ts +++ b/extension/src/plots/model/collect.ts @@ -18,6 +18,7 @@ import { ExperimentFieldsOrError, ExperimentsBranchOutput, ExperimentsOutput, + ExperimentStatus, PlotsOutput, Value, ValueTree @@ -80,8 +81,7 @@ type MetricsAndDetailsOrUndefined = checkpoint_parent: string | undefined checkpoint_tip: string | undefined metrics: MetricOrParamColumns | undefined - queued: boolean | undefined - running: boolean | undefined + status: ExperimentStatus | undefined } | undefined @@ -93,19 +93,17 @@ const transformExperimentData = ( return } - const { checkpoint_tip, checkpoint_parent, queued, running } = - experimentFields + const { checkpoint_tip, checkpoint_parent, status } = experimentFields const { metrics } = extractColumns(experimentFields) - return { checkpoint_parent, checkpoint_tip, metrics, queued, running } + return { checkpoint_parent, checkpoint_tip, metrics, status } } type ValidData = { checkpoint_parent: string checkpoint_tip: string metrics: MetricOrParamColumns - queued: boolean | undefined - running: boolean | undefined + status: ExperimentStatus } const isValid = (data: MetricsAndDetailsOrUndefined): data is ValidData => diff --git a/extension/src/test/fixtures/expShow/dataTypes.ts b/extension/src/test/fixtures/expShow/dataTypes.ts index 09b83d7246..789bf27c95 100644 --- a/extension/src/test/fixtures/expShow/dataTypes.ts +++ b/extension/src/test/fixtures/expShow/dataTypes.ts @@ -1,4 +1,4 @@ -import { ExperimentsOutput } from '../../../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../../../cli/dvc/contract' import { timestampColumn } from '../../../experiments/columns/constants' import { Column, @@ -26,8 +26,7 @@ export const dataTypesOutput: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null } } @@ -36,8 +35,7 @@ export const dataTypesOutput: ExperimentsOutput = { baseline: { data: { timestamp: '2020-11-21T19:58:22', - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, name: 'main' } @@ -159,8 +157,7 @@ export const rows: Row[] = [ zero: 0 } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: true, starred: false }, @@ -170,8 +167,7 @@ export const rows: Row[] = [ id: 'main', label: 'main', name: 'main', - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: true, sha: '53c3851f46955fa3e2b8f6e1c52999acc8c9ea77', starred: false, diff --git a/extension/src/test/fixtures/expShow/deeplyNested.ts b/extension/src/test/fixtures/expShow/deeplyNested.ts index 693464a01e..11e48cc447 100644 --- a/extension/src/test/fixtures/expShow/deeplyNested.ts +++ b/extension/src/test/fixtures/expShow/deeplyNested.ts @@ -1,4 +1,4 @@ -import { ExperimentsOutput } from '../../../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../../../cli/dvc/contract' import { timestampColumn } from '../../../experiments/columns/constants' import { Column, @@ -32,8 +32,7 @@ export const deeplyNestedOutput: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null } } @@ -63,8 +62,7 @@ export const deeplyNestedOutput: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, name: 'main' } @@ -655,8 +653,6 @@ export const rows = [ { id: 'workspace', label: 'workspace', - queued: false, - running: false, executor: null, params: { 'params.yaml': { @@ -679,14 +675,14 @@ export const rows = [ }, displayColor: '#945dd6', selected: true, + status: ExperimentStatus.SUCCESS, starred: false }, { id: 'main', label: 'main', Created: '2020-11-21T19:58:22', - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, name: 'main', sha: '53c3851f46955fa3e2b8f6e1c52999acc8c9ea77', diff --git a/extension/src/test/fixtures/expShow/modified.ts b/extension/src/test/fixtures/expShow/modified.ts index de2315a32e..c99ebccd25 100644 --- a/extension/src/test/fixtures/expShow/modified.ts +++ b/extension/src/test/fixtures/expShow/modified.ts @@ -1,3 +1,5 @@ +import { ExperimentStatus } from '../../../cli/dvc/contract' + const data = { workspace: { baseline: { @@ -12,8 +14,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -40,8 +41,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -62,8 +62,7 @@ const data = { params: { 'params.yaml': { data: { seed: 473987, lr: 0.001, weight_decay: 0 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -81,8 +80,7 @@ const data = { params: { 'params.yaml': { data: { seed: 473987, lr: 0.001, weight_decay: 0 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -99,8 +97,7 @@ const data = { params: { 'params.yaml': { data: { seed: 473987, lr: 0.001, weight_decay: 0 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -117,8 +114,7 @@ const data = { params: { 'params.yaml': { data: { seed: 473987, lr: 0.001, weight_decay: 0 } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -141,8 +137,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -170,8 +165,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -198,8 +192,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -226,8 +219,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -254,8 +246,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -282,8 +273,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -310,8 +300,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -338,8 +327,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -366,8 +354,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -395,8 +382,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -423,8 +409,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -451,8 +436,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -479,8 +463,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -507,8 +490,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -535,8 +517,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -564,8 +545,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -592,8 +572,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -620,8 +599,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -648,8 +626,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -676,8 +653,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -704,8 +680,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -732,8 +707,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -760,8 +734,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -788,8 +761,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -816,8 +788,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -844,8 +815,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -872,8 +842,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -900,8 +869,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -928,8 +896,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -956,8 +923,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -984,8 +950,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1012,8 +977,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1040,8 +1004,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1068,8 +1031,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1096,8 +1058,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1124,8 +1085,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1152,8 +1112,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1180,8 +1139,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1208,8 +1166,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1236,8 +1193,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1264,8 +1220,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1292,8 +1247,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1320,8 +1274,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1348,8 +1301,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1377,8 +1329,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1405,8 +1356,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1433,8 +1383,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1461,8 +1410,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1489,8 +1437,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1517,8 +1464,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1545,8 +1491,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1573,8 +1518,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1601,8 +1545,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1629,8 +1572,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1657,8 +1599,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1685,8 +1626,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1713,8 +1653,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1741,8 +1680,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1769,8 +1707,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1797,8 +1734,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1825,8 +1761,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1853,8 +1788,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1881,8 +1815,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1909,8 +1842,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1937,8 +1869,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1965,8 +1896,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -1993,8 +1923,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2021,8 +1950,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2049,8 +1977,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2077,8 +2004,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2105,8 +2031,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2133,8 +2058,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2161,8 +2085,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2189,8 +2112,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2217,8 +2139,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2245,8 +2166,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2273,8 +2193,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2301,8 +2220,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2329,8 +2247,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2357,8 +2274,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2385,8 +2301,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2413,8 +2328,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2441,8 +2355,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { @@ -2469,8 +2382,7 @@ const data = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: { 'logs.json': { diff --git a/extension/src/test/fixtures/expShow/output.ts b/extension/src/test/fixtures/expShow/output.ts index c2bbe6e87b..706d0b83e8 100644 --- a/extension/src/test/fixtures/expShow/output.ts +++ b/extension/src/test/fixtures/expShow/output.ts @@ -1,5 +1,5 @@ import { join } from '../../util/path' -import { ExperimentsOutput } from '../../../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../../../cli/dvc/contract' export const errorShas = [ '489fd8bdaa709f7330aac342e051a9431c625481', @@ -111,8 +111,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: true, + status: ExperimentStatus.RUNNING, timestamp: null } } @@ -222,8 +221,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-11-21T19:58:22' } }, @@ -333,8 +331,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: true, + status: ExperimentStatus.RUNNING, timestamp: '2020-12-29T15:31:52' } }, @@ -443,8 +440,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:31:51' } }, @@ -553,8 +549,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:31:44' } }, @@ -664,8 +659,7 @@ const data: ExperimentsOutput = { is_data_source: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:28:59' } }, @@ -774,8 +768,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:28:57' } }, @@ -884,8 +877,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:28:50' } }, @@ -995,8 +987,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:27:02' } }, @@ -1105,8 +1096,7 @@ const data: ExperimentsOutput = { is_data_source: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:27:01' } }, @@ -1215,8 +1205,7 @@ const data: ExperimentsOutput = { is_data_source: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:26:55' } }, @@ -1325,8 +1314,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:26:49' } }, @@ -1435,8 +1423,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:26:43' } }, @@ -1545,8 +1532,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.RUNNING, timestamp: '2020-12-29T15:26:36' } }, @@ -1658,8 +1644,7 @@ const data: ExperimentsOutput = { } } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, timestamp: '2020-12-29T15:26:36' } }, @@ -1755,7 +1740,7 @@ const data: ExperimentsOutput = { } } }, - queued: true, + status: ExperimentStatus.QUEUED, timestamp: '2020-12-29T15:25:27' } } diff --git a/extension/src/test/fixtures/expShow/rows.ts b/extension/src/test/fixtures/expShow/rows.ts index 48107b9537..57806cbdfa 100644 --- a/extension/src/test/fixtures/expShow/rows.ts +++ b/extension/src/test/fixtures/expShow/rows.ts @@ -2,6 +2,7 @@ import { join } from '../../util/path' import { Row } from '../../../experiments/webview/contract' import { copyOriginalColors } from '../../../experiments/model/status/colors' import { shortenForLabel } from '../../../util/string' +import { ExperimentStatus } from '../../../cli/dvc/contract' const valueWithNoChanges = (str: string) => ({ value: shortenForLabel(str), @@ -92,8 +93,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: true, + status: ExperimentStatus.RUNNING, selected: true, starred: false }, @@ -179,8 +179,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: true, sha: '53c3851f46955fa3e2b8f6e1c52999acc8c9ea77', starred: false, @@ -271,8 +270,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: true, + status: ExperimentStatus.RUNNING, selected: true, sha: '4fb124aebddb2adf1545030907687fa9a4c80e70', starred: false, @@ -363,8 +361,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: 'd1343a87c6ee4a2e82d19525964d2fb2cb6756c9', starred: false, @@ -456,8 +453,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: '1ee5f2ecb0fa4d83cbf614386536344cf894dd53', starred: false, @@ -552,8 +548,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: true, sha: '42b8736b08170529903cd203a1f40382a4b4a8cd', starred: false, @@ -644,8 +639,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, starred: false, sha: '217312476f8854dda1865450b737eb6bc7a3ba1b', @@ -737,8 +731,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: '9523bde67538cf31230efaff2dbc47d38a944ab5', starred: false, @@ -833,8 +826,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: true, sha: '1ba7bcd6ce6154e72e18b155475663ecbbd1f49d', starred: false, @@ -925,8 +917,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: '22e40e1fa3c916ac567f69b85969e3066a91dda4', starred: false, @@ -1018,8 +1009,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: '91116c1eae4b79cb1f5ab0312dfd9b3e43608e15', starred: false, @@ -1111,8 +1101,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: 'e821416bfafb4bc28b3e0a8ddb322505b0ad2361', starred: false, @@ -1204,8 +1193,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: false, sha: 'c658f8b14ac819ac2a5ea0449da6c15dbe8eb880', starred: false, @@ -1297,8 +1285,7 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.RUNNING, selected: false, sha: '23250b33e3d6dd0e136262d1d26a2face031cb03', starred: false, @@ -1395,14 +1382,14 @@ const data: Row[] = [ test: true } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, selected: true, sha: 'f0f918662b4f8c47819ca154a23029bf9b47d4f3', starred: false, Created: '2020-12-29T15:26:36' }, { + displayColor: undefined, deps: { [join('data', 'data.xml')]: valueWithNoChanges( '22a1a2931c8370d3aeedd7183606fd7f' @@ -1473,8 +1460,8 @@ const data: Row[] = [ test: true } }, - queued: true, selected: false, + status: ExperimentStatus.QUEUED, sha: '90aea7f2482117a55dfcadcdb901aaa6610fbbc9', starred: false, Created: '2020-12-29T15:25:27' diff --git a/extension/src/test/fixtures/expShow/uncommittedDeps.ts b/extension/src/test/fixtures/expShow/uncommittedDeps.ts index 270c908cf9..8cab7fc95a 100644 --- a/extension/src/test/fixtures/expShow/uncommittedDeps.ts +++ b/extension/src/test/fixtures/expShow/uncommittedDeps.ts @@ -1,4 +1,4 @@ -import { ExperimentsOutput } from '../../../cli/dvc/contract' +import { ExperimentsOutput, ExperimentStatus } from '../../../cli/dvc/contract' const data: ExperimentsOutput = { workspace: { @@ -53,8 +53,7 @@ const data: ExperimentsOutput = { is_data_source: false } }, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: {} } @@ -66,8 +65,7 @@ const data: ExperimentsOutput = { timestamp: '2022-08-13T09:13:15', deps: {}, outs: {}, - queued: false, - running: false, + status: ExperimentStatus.SUCCESS, executor: null, metrics: {}, name: 'main' diff --git a/extension/src/test/suite/experiments/model/filterBy/tree.test.ts b/extension/src/test/suite/experiments/model/filterBy/tree.test.ts index e6a9c57b14..96b86d104b 100644 --- a/extension/src/test/suite/experiments/model/filterBy/tree.test.ts +++ b/extension/src/test/suite/experiments/model/filterBy/tree.test.ts @@ -38,6 +38,7 @@ import { FilterItem } from '../../../../../experiments/model/filterBy/tree' import { starredFilter } from '../../../../../experiments/model/filterBy/constants' +import { ExperimentStatus } from '../../../../../cli/dvc/contract' suite('Experiments Filter By Tree Test Suite', () => { const disposable = Disposable.fn() @@ -95,7 +96,7 @@ suite('Experiments Filter By Tree Test Suite', () => { ) }) .map(experiment => - experiment.queued || experiment.error + experiment.status === ExperimentStatus.QUEUED || experiment.error ? experiment : { ...experiment, diff --git a/extension/src/test/suite/experiments/model/tree.test.ts b/extension/src/test/suite/experiments/model/tree.test.ts index b04de2b72f..2f9be4723e 100644 --- a/extension/src/test/suite/experiments/model/tree.test.ts +++ b/extension/src/test/suite/experiments/model/tree.test.ts @@ -368,27 +368,27 @@ suite('Experiments Tree Test Suite', () => { }, { displayColor: colors[1], + group: '[exp-83425]', + id: '23250b33e3d6dd0e136262d1d26a2face031cb03', + revision: '23250b3' + }, + { + displayColor: colors[4], group: '[exp-e7a67]', id: 'd1343a87c6ee4a2e82d19525964d2fb2cb6756c9', revision: 'd1343a8' }, { - displayColor: colors[4], + displayColor: colors[5], group: '[exp-e7a67]', id: '1ee5f2ecb0fa4d83cbf614386536344cf894dd53', revision: '1ee5f2e' }, { - displayColor: colors[5], + displayColor: colors[6], group: '[test-branch]', id: '217312476f8854dda1865450b737eb6bc7a3ba1b', revision: '2173124' - }, - { - displayColor: colors[6], - group: '[test-branch]', - id: '9523bde67538cf31230efaff2dbc47d38a944ab5', - revision: '9523bde' } ]) expect( @@ -398,7 +398,7 @@ suite('Experiments Tree Test Suite', () => { dvcDemoPath, '1ee5f2e', '2173124', - '9523bde', + '23250b3', 'd1343a8' ) }).timeout(WEBVIEW_TEST_TIMEOUT) diff --git a/extension/src/test/suite/plots/index.test.ts b/extension/src/test/suite/plots/index.test.ts index fd8941e162..54840d7ce2 100644 --- a/extension/src/test/suite/plots/index.test.ts +++ b/extension/src/test/suite/plots/index.test.ts @@ -35,6 +35,7 @@ import { MessageFromWebviewType } from '../../../webview/contract' import { reorderObjectList } from '../../../util/array' import * as Telemetry from '../../../telemetry' import { EventName } from '../../../telemetry/constants' +import { ExperimentStatus } from '../../../cli/dvc/contract' suite('Plots Test Suite', () => { const disposable = Disposable.fn() @@ -97,17 +98,14 @@ suite('Plots Test Suite', () => { '53c3851f46955fa3e2b8f6e1c52999acc8c9ea77': { checkpoint: { data: { - checkpoint_tip: 'experiment', - queued: false, - running: false + checkpoint_tip: 'experiment' } }, experiment: { data: { checkpoint_tip: 'experiment', name: 'exp-e1new', - queued: false, - running: true + status: ExperimentStatus.RUNNING } } } diff --git a/webview/src/experiments/components/table/Cell.tsx b/webview/src/experiments/components/table/Cell.tsx index 94016dbe80..93f249f2de 100644 --- a/webview/src/experiments/components/table/Cell.tsx +++ b/webview/src/experiments/components/table/Cell.tsx @@ -1,5 +1,6 @@ import React from 'react' import cx from 'classnames' +import { ExperimentStatus } from 'dvc/src/experiments/webview/contract' import { ErrorTooltip } from './Errors' import { IndicatorWithJustTheCounter } from './Indicators' import styles from './styles.module.scss' @@ -43,7 +44,7 @@ export const FirstCell: React.FC< > = ({ cell, bulletColor, toggleExperiment, ...rowActionsProps }) => { const { row, isPlaceholder } = cell const { - original: { error, queued, label, displayNameOrParent = '' } + original: { error, status, label, displayNameOrParent = '' } } = row const { @@ -73,7 +74,7 @@ export const FirstCell: React.FC< aria-label={'Sub-rows selected for plots'} count={plotSelections} /> - {queued && } + {status === ExperimentStatus.QUEUED && } {isPlaceholder ? null : ( diff --git a/webview/src/experiments/components/table/Row.tsx b/webview/src/experiments/components/table/Row.tsx index 77118c9852..1e3458b2d6 100644 --- a/webview/src/experiments/components/table/Row.tsx +++ b/webview/src/experiments/components/table/Row.tsx @@ -1,7 +1,10 @@ import React from 'react' import { useSelector } from 'react-redux' import cx from 'classnames' -import { Experiment } from 'dvc/src/experiments/webview/contract' +import { + Experiment, + ExperimentStatus +} from 'dvc/src/experiments/webview/contract' import { MessageFromWebviewType } from 'dvc/src/webview/contract' import { RowProp } from './interfaces' import styles from './styles.module.scss' @@ -14,11 +17,11 @@ import { HandlerFunc } from '../../../util/props' import { cond } from '../../../util/helpers' import { ExperimentsState } from '../../store' -const getExperimentTypeClass = ({ running, queued, selected }: Experiment) => { - if (running) { +const getExperimentTypeClass = ({ status, selected }: Experiment) => { + if (status === ExperimentStatus.RUNNING) { return styles.runningExperiment } - if (queued) { + if (status === ExperimentStatus.QUEUED) { return styles.queuedExperiment } if (selected === false) { diff --git a/webview/src/experiments/components/table/RowContextMenu.tsx b/webview/src/experiments/components/table/RowContextMenu.tsx index 6967e2052b..48bad34a29 100644 --- a/webview/src/experiments/components/table/RowContextMenu.tsx +++ b/webview/src/experiments/components/table/RowContextMenu.tsx @@ -1,5 +1,6 @@ import React from 'react' import { MessageFromWebviewType } from 'dvc/src/webview/contract' +import { ExperimentStatus } from 'dvc/src/experiments/webview/contract' import { RowProp } from './interfaces' import { RowSelectionContext } from './RowSelectionContext' import { MessagesMenu } from '../../../shared/components/messagesMenu/MessagesMenu' @@ -144,10 +145,11 @@ const getSingleSelectMenuOptions = ( projectHasCheckpoints: boolean, hasRunningExperiment: boolean, depth: number, - queued?: boolean, + status?: ExperimentStatus, starred?: boolean ) => { - const isNotExperimentOrCheckpoint = queued || isWorkspace || depth <= 0 + const isNotExperimentOrCheckpoint = + status === ExperimentStatus.QUEUED || isWorkspace || depth <= 0 const withId = ( label: string, @@ -213,7 +215,7 @@ const getContextMenuOptions = ( hasRunningExperiment: boolean, depth: number, selectedRows: Record, - queued?: boolean, + status?: ExperimentStatus, starred?: boolean ) => { const isFromSelection = !!selectedRows[id] @@ -231,7 +233,7 @@ const getContextMenuOptions = ( projectHasCheckpoints, hasRunningExperiment, depth, - queued, + status, starred ) ) @@ -241,7 +243,7 @@ export const RowContextMenu: React.FC = ({ hasRunningExperiment = false, projectHasCheckpoints = false, row: { - original: { queued, starred }, + original: { status, starred }, depth, values: { id } } @@ -259,11 +261,11 @@ export const RowContextMenu: React.FC = ({ hasRunningExperiment, depth, selectedRows, - queued, + status, starred ) }, [ - queued, + status, starred, isWorkspace, depth, diff --git a/webview/src/experiments/components/table/Table.test.tsx b/webview/src/experiments/components/table/Table.test.tsx index d119ea1330..8006844256 100644 --- a/webview/src/experiments/components/table/Table.test.tsx +++ b/webview/src/experiments/components/table/Table.test.tsx @@ -9,7 +9,11 @@ import { screen } from '@testing-library/react' import { Provider } from 'react-redux' -import { Experiment, TableData } from 'dvc/src/experiments/webview/contract' +import { + Experiment, + ExperimentStatus, + TableData +} from 'dvc/src/experiments/webview/contract' import { MessageFromWebviewType } from 'dvc/src/webview/contract' import React from 'react' import { TableInstance } from 'react-table' @@ -53,8 +57,7 @@ describe('Table', () => { row: { id: 'workspace', original: { - queued: false, - running: false + status: ExperimentStatus.SUCCESS } } } @@ -102,8 +105,7 @@ describe('Table', () => { id: 'workspace', label: 'workspace', original: { - queued: false, - running: false + status: ExperimentStatus.SUCCESS }, values: { id: 'workspace' diff --git a/webview/src/stories/Table.stories.tsx b/webview/src/stories/Table.stories.tsx index f5625b6627..f32d08d19e 100644 --- a/webview/src/stories/Table.stories.tsx +++ b/webview/src/stories/Table.stories.tsx @@ -8,6 +8,7 @@ import workspaceChangesFixture from 'dvc/src/test/fixtures/expShow/workspaceChan import deeplyNestedTableData from 'dvc/src/test/fixtures/expShow/deeplyNested' import { dataTypesTableData } from 'dvc/src/test/fixtures/expShow/dataTypes' import { timestampColumn } from 'dvc/src/experiments/columns/constants' +import { ExperimentStatus } from 'dvc/src/experiments/webview/contract' import { within, userEvent, @@ -46,7 +47,9 @@ const tableData: TableDataState = { starred: experiment.starred || experiment.label === '42b8736', subRows: experiment.subRows?.map(checkpoint => ({ ...checkpoint, - running: checkpoint.running || checkpoint.label === '23250b3', + running: + checkpoint.status === ExperimentStatus.RUNNING || + checkpoint.label === '23250b3', starred: checkpoint.starred || checkpoint.label === '22e40e1' })) })) @@ -62,13 +65,16 @@ const noRunningExperiments = { hasRunningExperiment: false, rows: rowsFixture.map(row => ({ ...row, - running: false, + status: ExperimentStatus.SUCCESS, subRows: row.subRows?.map(experiment => ({ ...experiment, - running: false, + status: + experiment.status === ExperimentStatus.RUNNING + ? ExperimentStatus.SUCCESS + : experiment.status, subRows: experiment.subRows?.map(checkpoint => ({ ...checkpoint, - running: false + status: ExperimentStatus.SUCCESS })) })) })) @@ -79,10 +85,13 @@ const noRunningExperimentsNoCheckpoints = { hasCheckpoints: false, rows: rowsFixture.map(row => ({ ...row, - running: false, + status: ExperimentStatus.SUCCESS, subRows: row.subRows?.map(experiment => ({ ...experiment, - running: false, + status: + experiment.status === ExperimentStatus.RUNNING + ? ExperimentStatus.SUCCESS + : experiment.status, subRows: [] })) })) diff --git a/webview/src/test/tableDataFixture.ts b/webview/src/test/tableDataFixture.ts index 2b6cc33a7a..a67bf63aeb 100644 --- a/webview/src/test/tableDataFixture.ts +++ b/webview/src/test/tableDataFixture.ts @@ -1,5 +1,9 @@ import { copyOriginalColors } from 'dvc/src/experiments/model/status/colors' -import { Row, TableData } from 'dvc/src/experiments/webview/contract' +import { + ExperimentStatus, + Row, + TableData +} from 'dvc/src/experiments/webview/contract' const matchAndTransform = ( rows: Row[], @@ -41,12 +45,16 @@ export const transformRows = ( } as TableData } -export const setRowPropertyAsTrue = - (prop: keyof Row) => (fixture: TableData, labelOrIds: string[]) => { - return transformRows(fixture, labelOrIds, row => ({ ...row, [prop]: true })) +const setRowProperty = + (prop: keyof Row, value: unknown) => + (fixture: TableData, labelOrIds: string[]) => { + return transformRows(fixture, labelOrIds, row => ({ + ...row, + [prop]: value + })) } -export const setExperimentsAsStarred = setRowPropertyAsTrue('starred') +export const setExperimentsAsStarred = setRowProperty('starred', true) export const setExperimentsAsSelected = ( fixture: TableData, @@ -66,4 +74,7 @@ export const setExperimentsAsSelected = ( selected: true })) } -export const setExperimentsAsRunning = setRowPropertyAsTrue('running') +export const setExperimentsAsRunning = setRowProperty( + 'status', + ExperimentStatus.RUNNING +) From 4e77e4c7f056e0a42446afafc7c47442079d4885 Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Thu, 6 Oct 2022 13:57:42 +1100 Subject: [PATCH 2/4] pull out is running and is queued functions --- .../src/experiments/model/accumulator.ts | 4 ++-- extension/src/experiments/model/collect.ts | 9 ++++---- extension/src/experiments/model/index.ts | 20 ++++++++-------- .../src/experiments/model/status/collect.ts | 5 ++-- .../src/experiments/model/status/index.ts | 5 ++-- extension/src/experiments/model/tree.ts | 4 ++-- extension/src/experiments/webview/contract.ts | 12 +++++++++- .../experiments/model/filterBy/tree.test.ts | 4 ++-- .../src/experiments/components/table/Cell.tsx | 4 ++-- .../src/experiments/components/table/Row.tsx | 7 +++--- .../components/table/RowContextMenu.tsx | 7 ++++-- webview/src/stories/Table.stories.tsx | 23 +++++++++---------- 12 files changed, 58 insertions(+), 46 deletions(-) diff --git a/extension/src/experiments/model/accumulator.ts b/extension/src/experiments/model/accumulator.ts index e65ed74fbb..6bf3a8dc9e 100644 --- a/extension/src/experiments/model/accumulator.ts +++ b/extension/src/experiments/model/accumulator.ts @@ -1,4 +1,4 @@ -import { Experiment, ExperimentStatus } from '../webview/contract' +import { Experiment, isRunning } from '../webview/contract' export class ExperimentsAccumulator { public workspace = {} as Experiment @@ -11,6 +11,6 @@ export class ExperimentsAccumulator { if (workspace) { this.workspace = workspace } - this.hasRunning = !!(workspace?.status === ExperimentStatus.RUNNING) + this.hasRunning = isRunning(workspace?.status) } } diff --git a/extension/src/experiments/model/collect.ts b/extension/src/experiments/model/collect.ts index a53ed32b3b..99854d941d 100644 --- a/extension/src/experiments/model/collect.ts +++ b/extension/src/experiments/model/collect.ts @@ -8,7 +8,7 @@ import omit from 'lodash.omit' import { ExperimentType } from '.' import { ExperimentsAccumulator } from './accumulator' import { extractColumns } from '../columns/extract' -import { Experiment, ColumnType } from '../webview/contract' +import { Experiment, ColumnType, isRunning } from '../webview/contract' import { ExperimentFieldsOrError, ExperimentFields, @@ -229,7 +229,7 @@ const collectHasRunningExperiment = ( acc: ExperimentsAccumulator, experiment: Experiment ) => { - if (experiment.status === ExperimentStatus.RUNNING) { + if (isRunning(experiment.status)) { acc.hasRunning = true } } @@ -330,8 +330,7 @@ const noWorkspaceVsSelectedRaceCondition = ( hasCheckpoints: boolean, status: ExperimentStatus | undefined, selected: boolean | undefined -): boolean => - !!(hasCheckpoints && status === ExperimentStatus.RUNNING && !selected) +): boolean => !!(hasCheckpoints && isRunning(status) && !selected) const collectMutableRevision = ( acc: string[], @@ -341,7 +340,7 @@ const collectMutableRevision = ( if (noWorkspaceVsSelectedRaceCondition(hasCheckpoints, status, selected)) { acc.push('workspace') } - if (status === ExperimentStatus.RUNNING && !hasCheckpoints) { + if (isRunning(status) && !hasCheckpoints) { acc.push(label) } } diff --git a/extension/src/experiments/model/index.ts b/extension/src/experiments/model/index.ts index 42f23fe788..e9b69eea5b 100644 --- a/extension/src/experiments/model/index.ts +++ b/extension/src/experiments/model/index.ts @@ -23,7 +23,7 @@ import { UNSELECTED } from './status' import { collectFlatExperimentParams } from './modify/collect' -import { Experiment, Row } from '../webview/contract' +import { Experiment, isQueued, Row } from '../webview/contract' import { definedAndNonEmpty, reorderListSubset, @@ -128,8 +128,11 @@ export class ExperimentsModel extends ModelWithPersistence { public toggleStatus(id: string) { if ( - this.getFlattenedExperiments().find(({ id: queuedId }) => queuedId === id) - ?.status === ExperimentStatus.QUEUED + isQueued( + this.getFlattenedExperiments().find( + ({ id: queuedId }) => queuedId === id + )?.status + ) ) { return } @@ -318,7 +321,7 @@ export class ExperimentsModel extends ModelWithPersistence { const experimentsWithCheckpoints: ExperimentWithCheckpoints[] = [] for (const experiment of this.getAllExperiments()) { const { id, status } = experiment - if (status === ExperimentStatus.QUEUED) { + if (isQueued(status)) { continue } @@ -411,10 +414,9 @@ export class ExperimentsModel extends ModelWithPersistence { return this.getExperimentsByBranch(branch)?.map(experiment => ({ ...experiment, hasChildren: definedAndNonEmpty(this.checkpointsByTip.get(experiment.id)), - type: - experiment.status === ExperimentStatus.QUEUED - ? ExperimentType.QUEUED - : ExperimentType.EXPERIMENT + type: isQueued(experiment.status) + ? ExperimentType.QUEUED + : ExperimentType.EXPERIMENT })) } @@ -496,7 +498,7 @@ export class ExperimentsModel extends ModelWithPersistence { private splitExperimentsByQueued(getQueued = false) { return this.getFlattenedExperiments().filter(({ status }) => { if (getQueued) { - return status === ExperimentStatus.QUEUED + return isQueued(status) } return status !== ExperimentStatus.QUEUED }) diff --git a/extension/src/experiments/model/status/collect.ts b/extension/src/experiments/model/status/collect.ts index bb5c776868..8fda28af72 100644 --- a/extension/src/experiments/model/status/collect.ts +++ b/extension/src/experiments/model/status/collect.ts @@ -1,10 +1,9 @@ import { canSelect, ColoredStatus, UNSELECTED } from '.' import { Color, copyOriginalColors } from './colors' import { hasKey } from '../../../util/object' -import { Experiment } from '../../webview/contract' +import { Experiment, isQueued } from '../../webview/contract' import { definedAndNonEmpty, reorderListSubset } from '../../../util/array' import { flattenMapValues } from '../../../util/map' -import { ExperimentStatus } from '../../../cli/dvc/contract' const getStatus = ( acc: ColoredStatus, @@ -23,7 +22,7 @@ const collectStatus = ( unassignColors?: Color[] ) => { const { id, status } = experiment - if (!id || status === ExperimentStatus.QUEUED || hasKey(acc, id)) { + if (!id || isQueued(status) || hasKey(acc, id)) { return } diff --git a/extension/src/experiments/model/status/index.ts b/extension/src/experiments/model/status/index.ts index 386d3a3d40..f24b7074d9 100644 --- a/extension/src/experiments/model/status/index.ts +++ b/extension/src/experiments/model/status/index.ts @@ -1,6 +1,5 @@ import { Color } from './colors' -import { Experiment } from '../../webview/contract' -import { ExperimentStatus } from '../../../cli/dvc/contract' +import { Experiment, isRunning } from '../../webview/contract' export const MAX_SELECTED_EXPERIMENTS = 7 @@ -29,6 +28,6 @@ export const limitToMaxSelected = (experiments: Experiment[]) => if (a.status === b.status) { return compareTimestamps(a, b) } - return a.status === ExperimentStatus.RUNNING ? -1 : 1 + return isRunning(a.status) ? -1 : 1 }) .slice(0, MAX_SELECTED_EXPERIMENTS) diff --git a/extension/src/experiments/model/tree.ts b/extension/src/experiments/model/tree.ts index fed019c877..109002062c 100644 --- a/extension/src/experiments/model/tree.ts +++ b/extension/src/experiments/model/tree.ts @@ -30,7 +30,7 @@ import { } from '../../commands/external' import { sum } from '../../util/math' import { Disposable } from '../../class/dispose' -import { Experiment, ExperimentStatus } from '../webview/contract' +import { Experiment, ExperimentStatus, isRunning } from '../webview/contract' export class ExperimentsTree extends Disposable @@ -246,7 +246,7 @@ export class ExperimentsTree type?: ExperimentType selected?: boolean }): ThemeIcon | Uri | Resource { - if (status === ExperimentStatus.RUNNING) { + if (isRunning(status)) { return this.getUriOrIcon(displayColor, IconName.LOADING_SPIN) } if (type === ExperimentType.QUEUED) { diff --git a/extension/src/experiments/webview/contract.ts b/extension/src/experiments/webview/contract.ts index 42f9ebb87e..1409ff6ae8 100644 --- a/extension/src/experiments/webview/contract.ts +++ b/extension/src/experiments/webview/contract.ts @@ -1,4 +1,8 @@ -import { BaseExperimentFields, ValueTree } from '../../cli/dvc/contract' +import { + BaseExperimentFields, + ExperimentStatus, + ValueTree +} from '../../cli/dvc/contract' import { FilteredCounts } from '../model/filterBy/collect' import { SortDefinition } from '../model/sortBy' @@ -35,6 +39,12 @@ export interface Experiment extends BaseExperimentFields { Created?: string } +export const isRunning = (status: ExperimentStatus | undefined): boolean => + status === ExperimentStatus.RUNNING + +export const isQueued = (status: ExperimentStatus | undefined): boolean => + status === ExperimentStatus.QUEUED + export interface Row extends Experiment { subRows?: Row[] } diff --git a/extension/src/test/suite/experiments/model/filterBy/tree.test.ts b/extension/src/test/suite/experiments/model/filterBy/tree.test.ts index 96b86d104b..0b16bac6eb 100644 --- a/extension/src/test/suite/experiments/model/filterBy/tree.test.ts +++ b/extension/src/test/suite/experiments/model/filterBy/tree.test.ts @@ -24,6 +24,7 @@ import { buildExperiments, stubWorkspaceExperimentsGetters } from '../../util' import { ColumnType, Experiment, + isQueued, TableData } from '../../../../../experiments/webview/contract' import { WEBVIEW_TEST_TIMEOUT } from '../../../timeouts' @@ -38,7 +39,6 @@ import { FilterItem } from '../../../../../experiments/model/filterBy/tree' import { starredFilter } from '../../../../../experiments/model/filterBy/constants' -import { ExperimentStatus } from '../../../../../cli/dvc/contract' suite('Experiments Filter By Tree Test Suite', () => { const disposable = Disposable.fn() @@ -96,7 +96,7 @@ suite('Experiments Filter By Tree Test Suite', () => { ) }) .map(experiment => - experiment.status === ExperimentStatus.QUEUED || experiment.error + isQueued(experiment.status) || experiment.error ? experiment : { ...experiment, diff --git a/webview/src/experiments/components/table/Cell.tsx b/webview/src/experiments/components/table/Cell.tsx index 93f249f2de..260e66f68f 100644 --- a/webview/src/experiments/components/table/Cell.tsx +++ b/webview/src/experiments/components/table/Cell.tsx @@ -1,6 +1,6 @@ import React from 'react' import cx from 'classnames' -import { ExperimentStatus } from 'dvc/src/experiments/webview/contract' +import { isQueued } from 'dvc/src/experiments/webview/contract' import { ErrorTooltip } from './Errors' import { IndicatorWithJustTheCounter } from './Indicators' import styles from './styles.module.scss' @@ -74,7 +74,7 @@ export const FirstCell: React.FC< aria-label={'Sub-rows selected for plots'} count={plotSelections} /> - {status === ExperimentStatus.QUEUED && } + {isQueued(status) && } {isPlaceholder ? null : ( diff --git a/webview/src/experiments/components/table/Row.tsx b/webview/src/experiments/components/table/Row.tsx index 1e3458b2d6..26b20a45bd 100644 --- a/webview/src/experiments/components/table/Row.tsx +++ b/webview/src/experiments/components/table/Row.tsx @@ -3,7 +3,8 @@ import { useSelector } from 'react-redux' import cx from 'classnames' import { Experiment, - ExperimentStatus + isQueued, + isRunning } from 'dvc/src/experiments/webview/contract' import { MessageFromWebviewType } from 'dvc/src/webview/contract' import { RowProp } from './interfaces' @@ -18,10 +19,10 @@ import { cond } from '../../../util/helpers' import { ExperimentsState } from '../../store' const getExperimentTypeClass = ({ status, selected }: Experiment) => { - if (status === ExperimentStatus.RUNNING) { + if (isRunning(status)) { return styles.runningExperiment } - if (status === ExperimentStatus.QUEUED) { + if (isQueued(status)) { return styles.queuedExperiment } if (selected === false) { diff --git a/webview/src/experiments/components/table/RowContextMenu.tsx b/webview/src/experiments/components/table/RowContextMenu.tsx index 48bad34a29..8989134e14 100644 --- a/webview/src/experiments/components/table/RowContextMenu.tsx +++ b/webview/src/experiments/components/table/RowContextMenu.tsx @@ -1,6 +1,9 @@ import React from 'react' import { MessageFromWebviewType } from 'dvc/src/webview/contract' -import { ExperimentStatus } from 'dvc/src/experiments/webview/contract' +import { + ExperimentStatus, + isQueued +} from 'dvc/src/experiments/webview/contract' import { RowProp } from './interfaces' import { RowSelectionContext } from './RowSelectionContext' import { MessagesMenu } from '../../../shared/components/messagesMenu/MessagesMenu' @@ -149,7 +152,7 @@ const getSingleSelectMenuOptions = ( starred?: boolean ) => { const isNotExperimentOrCheckpoint = - status === ExperimentStatus.QUEUED || isWorkspace || depth <= 0 + isQueued(status) || isWorkspace || depth <= 0 const withId = ( label: string, diff --git a/webview/src/stories/Table.stories.tsx b/webview/src/stories/Table.stories.tsx index f32d08d19e..255f7747d2 100644 --- a/webview/src/stories/Table.stories.tsx +++ b/webview/src/stories/Table.stories.tsx @@ -8,7 +8,10 @@ import workspaceChangesFixture from 'dvc/src/test/fixtures/expShow/workspaceChan import deeplyNestedTableData from 'dvc/src/test/fixtures/expShow/deeplyNested' import { dataTypesTableData } from 'dvc/src/test/fixtures/expShow/dataTypes' import { timestampColumn } from 'dvc/src/experiments/columns/constants' -import { ExperimentStatus } from 'dvc/src/experiments/webview/contract' +import { + ExperimentStatus, + isRunning +} from 'dvc/src/experiments/webview/contract' import { within, userEvent, @@ -47,9 +50,7 @@ const tableData: TableDataState = { starred: experiment.starred || experiment.label === '42b8736', subRows: experiment.subRows?.map(checkpoint => ({ ...checkpoint, - running: - checkpoint.status === ExperimentStatus.RUNNING || - checkpoint.label === '23250b3', + running: isRunning(checkpoint.status) || checkpoint.label === '23250b3', starred: checkpoint.starred || checkpoint.label === '22e40e1' })) })) @@ -68,10 +69,9 @@ const noRunningExperiments = { status: ExperimentStatus.SUCCESS, subRows: row.subRows?.map(experiment => ({ ...experiment, - status: - experiment.status === ExperimentStatus.RUNNING - ? ExperimentStatus.SUCCESS - : experiment.status, + status: isRunning(experiment.status) + ? ExperimentStatus.SUCCESS + : experiment.status, subRows: experiment.subRows?.map(checkpoint => ({ ...checkpoint, status: ExperimentStatus.SUCCESS @@ -88,10 +88,9 @@ const noRunningExperimentsNoCheckpoints = { status: ExperimentStatus.SUCCESS, subRows: row.subRows?.map(experiment => ({ ...experiment, - status: - experiment.status === ExperimentStatus.RUNNING - ? ExperimentStatus.SUCCESS - : experiment.status, + status: isRunning(experiment.status) + ? ExperimentStatus.SUCCESS + : experiment.status, subRows: [] })) })) From b3f47de1cb739456b6cb7fe07e74bc52b9f501fb Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Thu, 6 Oct 2022 14:46:24 +1100 Subject: [PATCH 3/4] clean up missed status equality checks --- extension/src/experiments/index.ts | 6 +++--- extension/src/experiments/model/index.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extension/src/experiments/index.ts b/extension/src/experiments/index.ts index c431be0c16..8245c49dfd 100644 --- a/extension/src/experiments/index.ts +++ b/extension/src/experiments/index.ts @@ -23,13 +23,13 @@ import { ColumnsModel } from './columns/model' import { CheckpointsModel } from './checkpoints/model' import { ExperimentsData } from './data' import { askToDisableAutoApplyFilters } from './toast' -import { Experiment, ColumnType, TableData } from './webview/contract' +import { Experiment, ColumnType, TableData, isQueued } from './webview/contract' import { WebviewMessages } from './webview/messages' import { DecorationProvider } from './model/decorationProvider' import { starredFilter } from './model/filterBy/constants' import { ResourceLocator } from '../resourceLocator' import { AvailableCommands, InternalCommands } from '../commands/internal' -import { ExperimentsOutput, ExperimentStatus } from '../cli/dvc/contract' +import { ExperimentsOutput } from '../cli/dvc/contract' import { ViewKey } from '../webview/constants' import { BaseRepository } from '../webview/repository' import { FileSystemData } from '../fileSystem/data' @@ -333,7 +333,7 @@ export class Experiments extends BaseRepository { if (useFilters) { const filteredExperiments = this.experiments .getUnfilteredExperiments() - .filter(exp => exp.status !== ExperimentStatus.QUEUED) + .filter(exp => !isQueued(exp.status)) if (tooManySelected(filteredExperiments)) { await this.warnAndDoNotAutoApply(filteredExperiments) } else { diff --git a/extension/src/experiments/model/index.ts b/extension/src/experiments/model/index.ts index e9b69eea5b..a1b07f6f17 100644 --- a/extension/src/experiments/model/index.ts +++ b/extension/src/experiments/model/index.ts @@ -29,7 +29,7 @@ import { reorderListSubset, reorderObjectList } from '../../util/array' -import { ExperimentsOutput, ExperimentStatus } from '../../cli/dvc/contract' +import { ExperimentsOutput } from '../../cli/dvc/contract' import { setContextValue } from '../../vscode/context' import { flattenMapValues } from '../../util/map' import { ModelWithPersistence } from '../../persistence/model' @@ -500,7 +500,7 @@ export class ExperimentsModel extends ModelWithPersistence { if (getQueued) { return isQueued(status) } - return status !== ExperimentStatus.QUEUED + return !isQueued(status) }) } From aded13566bdbefd42265c9345dcb4f9b767ae11a Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Thu, 6 Oct 2022 16:20:41 +1100 Subject: [PATCH 4/4] bump min version to 2.30.0 (breaking change exp show) --- demo/requirements.txt | 2 +- extension/src/cli/dvc/constants.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/requirements.txt b/demo/requirements.txt index 2a27d7b0e5..fa81e540e2 100644 --- a/demo/requirements.txt +++ b/demo/requirements.txt @@ -1,3 +1,3 @@ -dvc[s3]==2.28.0 +dvc[s3]==2.30.0 torch==1.12.0 torchvision==0.13.0 \ No newline at end of file diff --git a/extension/src/cli/dvc/constants.ts b/extension/src/cli/dvc/constants.ts index a930297329..695bd63a4d 100644 --- a/extension/src/cli/dvc/constants.ts +++ b/extension/src/cli/dvc/constants.ts @@ -1,7 +1,7 @@ import { join } from 'path' -export const MIN_CLI_VERSION = '2.24.0' -export const LATEST_TESTED_CLI_VERSION = '2.28.0' +export const MIN_CLI_VERSION = '2.30.0' +export const LATEST_TESTED_CLI_VERSION = '2.30.0' export const MAX_CLI_VERSION = '3' export const UNEXPECTED_ERROR_CODE = 255