Skip to content

Commit 552f8ba

Browse files
committed
feat(vscode): handling python errors well
[ci skip]
1 parent 079efc8 commit 552f8ba

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

sqlmesh/core/config/loader.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ def load_config_from_paths(
122122
validation_error_message(e, f"Invalid project config '{config_name}':")
123123
+ "\n\nVerify your config.py."
124124
)
125+
except ConfigError:
126+
# Re-raise ConfigError as is (it already has the proper location and message)
127+
raise
125128
else:
126129
raise ConfigError(
127130
f"Unsupported config file extension '{extension}' in config file '{path}'."
@@ -184,8 +187,19 @@ def load_config_from_python_module(
184187
module_path: Path,
185188
config_name: str = "config",
186189
) -> C:
187-
with sys_path(module_path.parent):
188-
config_module = import_python_file(module_path, module_path.parent)
190+
try:
191+
with sys_path(module_path.parent):
192+
config_module = import_python_file(module_path, module_path.parent)
193+
except SyntaxError as e:
194+
raise ConfigError(
195+
f"Python syntax error in config file: {e.msg} ({e.filename}, line {e.lineno})",
196+
location=module_path,
197+
)
198+
except Exception as e:
199+
raise ConfigError(
200+
f"Failed to load config file: {str(e)}",
201+
location=module_path,
202+
)
189203

190204
try:
191205
config_obj = getattr(config_module, config_name)

vscode/extension/tests/broken_project.spec.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,43 @@ test.describe('Bad config.py/config.yaml file issues', () => {
400400
.first()
401401
.isVisible({ timeout: 5_000 })
402402
})
403+
404+
test('sushi example, bad config.py', async ({ page, sharedCodeServer }) => {
405+
const tempDir = await fs.mkdtemp(
406+
path.join(os.tmpdir(), 'vscode-test-tcloud-'),
407+
)
408+
await fs.copy(SUSHI_SOURCE_PATH, tempDir)
409+
await createPythonInterpreterSettingsSpecifier(tempDir)
410+
411+
const configPyPath = path.join(tempDir, 'config.py')
412+
// Write an invalid Python to config.py
413+
await fs.writeFile(configPyPath, 'invalid_python_code = [1, 2, 3')
414+
415+
await page.goto(
416+
`http://127.0.1:${sharedCodeServer.codeServerPort}/?folder=${tempDir}`,
417+
)
418+
await page.waitForLoadState('networkidle')
419+
420+
// Open customers.sql model
421+
await page
422+
.getByRole('treeitem', { name: 'models', exact: true })
423+
.locator('a')
424+
.click()
425+
await page
426+
.getByRole('treeitem', { name: 'customers.sql', exact: true })
427+
.locator('a')
428+
.click()
429+
430+
// Expect the error to appear
431+
await page.waitForSelector('text=Error creating context')
432+
433+
// Open the problems view
434+
await runCommand(page, 'View: Focus Problems')
435+
436+
// Assert that the error is present in the problems view
437+
await page
438+
.getByText('Python syntax error in config file:', { exact: true })
439+
.first()
440+
.isVisible({ timeout: 5_000 })
441+
})
403442
})

0 commit comments

Comments
 (0)