Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 25 additions & 17 deletions extension/src/setup/autoInstall.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,33 @@ const showInstallProgress = (
Toast.showProgress('Installing packages', async progress => {
progress.report({ increment: 0 })

await Toast.runCommandAndIncrementProgress(
async () => {
await installPackages(root, pythonBinPath, 'dvclive')
return 'DVCLive Installed'
},
progress,
25
)
try {
await Toast.runCommandAndIncrementProgress(
async () => {
await installPackages(root, pythonBinPath, 'dvclive')
return 'DVCLive Installed'
},
progress,
25
)
} catch (error: unknown) {
return Toast.reportProgressError(error, progress)
}

await Toast.runCommandAndIncrementProgress(
async () => {
await installPackages(root, pythonBinPath, 'dvc')
return 'DVC Installed'
},
progress,
75
)
try {
await Toast.runCommandAndIncrementProgress(
async () => {
await installPackages(root, pythonBinPath, 'dvc')
return 'DVC Installed'
},
progress,
75
)

return Toast.delayProgressClosing()
return Toast.delayProgressClosing()
} catch (error: unknown) {
return Toast.reportProgressError(error, progress)
}
})

export const autoInstallDvc = async (): Promise<unknown> => {
Expand Down
60 changes: 60 additions & 0 deletions extension/src/test/suite/setup/autoInstall.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import * as Python from '../../../python'
import { autoInstallDvc } from '../../../setup/autoInstall'
import * as WorkspaceFolders from '../../../vscode/workspaceFolders'
import { bypassProgressCloseDelay } from '../util'
import { Toast } from '../../../vscode/toast'

const { getDefaultPython } = Python

Expand Down Expand Up @@ -89,5 +90,64 @@ suite('Auto Install Test Suite', () => {
'dvclive'
)
})

it('should show an error message and exit early if DVCLive fails to install', async () => {
bypassProgressCloseDelay()
const cwd = __dirname
stub(PythonExtension, 'getPythonExecutionDetails').resolves(undefined)
stub(Python, 'findPythonBin').resolves(defaultPython)
const mockInstallPackages = stub(Python, 'installPackages').rejects(
new Error('Failed to install DVCLive')
)
stub(WorkspaceFolders, 'getFirstWorkspaceFolder').returns(cwd)

const showProgressSpy = spy(window, 'withProgress')
const showErrorSpy = spy(window, 'showErrorMessage')

await autoInstallDvc()

expect(showProgressSpy).to.be.called
expect(showErrorSpy).not.to.be.called
expect(mockInstallPackages).to.be.calledOnce
expect(mockInstallPackages).to.be.calledWithExactly(
cwd,
defaultPython,
'dvclive'
)
})

it('should show an error message if DVC fails to install', async () => {
bypassProgressCloseDelay()
const cwd = __dirname
stub(PythonExtension, 'getPythonExecutionDetails').resolves(undefined)
stub(Python, 'findPythonBin').resolves(defaultPython)
const mockInstallPackages = stub(Python, 'installPackages')
.onFirstCall()
.resolves(undefined)
.onSecondCall()
.rejects(new Error('Network error'))
stub(WorkspaceFolders, 'getFirstWorkspaceFolder').returns(cwd)

const showProgressSpy = spy(window, 'withProgress')
const showErrorSpy = spy(window, 'showErrorMessage')
const reportProgressErrorSpy = spy(Toast, 'reportProgressError')

await autoInstallDvc()

expect(showProgressSpy).to.be.called
expect(showErrorSpy).not.to.be.called
expect(reportProgressErrorSpy).to.be.calledOnce
expect(mockInstallPackages).to.be.calledTwice
expect(mockInstallPackages).to.be.calledWithExactly(
cwd,
defaultPython,
'dvclive'
)
expect(mockInstallPackages).to.be.calledWithExactly(
cwd,
defaultPython,
'dvc'
)
})
})
})
16 changes: 16 additions & 0 deletions extension/src/vscode/toast.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,22 @@ export class Toast {
})
}

static reportProgressError(
error: unknown,
progress: Progress<{
message?: string | undefined
increment?: number | undefined
}>
) {
const message = (error as Error)?.message || 'an unexpected error occurred'

progress.report({
increment: 0,
message
})
return Toast.delayProgressClosing(60000)
}

static delayProgressClosing(ms = 5000) {
return delay(ms)
}
Expand Down