Skip to content

Commit fca8a3f

Browse files
authored
feat(vscode): ability to stop server (#4775)
1 parent 8afbaf1 commit fca8a3f

4 files changed

Lines changed: 82 additions & 0 deletions

File tree

vscode/extension/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@
9393
"title": "SQLMesh: Render Model",
9494
"description": "SQLMesh",
9595
"icon": "$(open-preview)"
96+
},
97+
{
98+
"command": "sqlmesh.stop",
99+
"title": "SQLMesh: Stop Server",
100+
"description": "SQLMesh"
96101
}
97102
],
98103
"menus": {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { window } from 'vscode'
2+
import { LSPClient } from '../lsp/lsp'
3+
import { traceInfo } from '../utilities/common/log'
4+
5+
export const stop = (lspClient: LSPClient | undefined) => {
6+
return async () => {
7+
traceInfo('Stopping LSP server')
8+
9+
if (!lspClient) {
10+
await window.showInformationMessage('LSP server is not running')
11+
return
12+
}
13+
14+
await lspClient.stop()
15+
await window.showInformationMessage('LSP server stopped')
16+
traceInfo('LSP server stopped successfully')
17+
}
18+
}

vscode/extension/src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { signOut } from './commands/signout'
1313
import { signIn } from './commands/signin'
1414
import { signInSpecifyFlow } from './commands/signinSpecifyFlow'
1515
import { renderModel, reRenderModelForSourceFile } from './commands/renderModel'
16+
import { stop } from './commands/stop'
1617
import { isErr } from '@bus/result'
1718
import { handleError } from './utilities/errors'
1819
import { selector, completionProvider } from './completion/completion'
@@ -159,6 +160,7 @@ export async function activate(context: vscode.ExtensionContext) {
159160
registerCommand(`sqlmesh.restart`, async () => {
160161
await restart()
161162
}),
163+
registerCommand(`sqlmesh.stop`, stop(lspClient)),
162164
)
163165

164166
const result = await lspClient.start()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import path from 'path'
2+
import { startVSCode, SUSHI_SOURCE_PATH } from './utils'
3+
import os from 'os'
4+
import { test } from '@playwright/test'
5+
import fs from 'fs-extra'
6+
7+
test('Stop server works', async () => {
8+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-'))
9+
await fs.copy(SUSHI_SOURCE_PATH, tempDir)
10+
11+
try {
12+
const { window, close } = await startVSCode(tempDir)
13+
14+
// Wait for the models folder to be visible
15+
await window.waitForSelector('text=models')
16+
17+
// Click on the models folder, excluding external_models
18+
await window
19+
.getByRole('treeitem', { name: 'models', exact: true })
20+
.locator('a')
21+
.click()
22+
23+
// Open the customer_revenue_lifetime model
24+
await window
25+
.getByRole('treeitem', { name: 'customers.sql', exact: true })
26+
.locator('a')
27+
.click()
28+
29+
await window.waitForSelector('text=grain')
30+
await window.waitForSelector('text=Loaded SQLMesh Context')
31+
32+
// Stop the server
33+
await window.keyboard.press(
34+
process.platform === 'darwin' ? 'Meta+Shift+P' : 'Control+Shift+P',
35+
)
36+
await window.keyboard.type('SQLMesh: Stop Server')
37+
await window.keyboard.press('Enter')
38+
39+
// Await LSP server stopped message
40+
await window.waitForSelector('text=LSP server stopped')
41+
42+
// Render the model
43+
await window.keyboard.press(
44+
process.platform === 'darwin' ? 'Meta+Shift+P' : 'Control+Shift+P',
45+
)
46+
await window.keyboard.type('Render Model')
47+
await window.keyboard.press('Enter')
48+
49+
// Await error message
50+
await window.waitForSelector(
51+
'text="Failed to render model: LSP client not ready."',
52+
)
53+
await close()
54+
} finally {
55+
await fs.remove(tempDir)
56+
}
57+
})

0 commit comments

Comments
 (0)