diff --git a/.vscode/settings.json b/.vscode/settings.json index 9bf4d12..9247332 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,27 @@ { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[yaml]": { + "editor.defaultFormatter": null + }, "editor.formatOnSave": true } diff --git a/src/providers/taskProvider.ts b/src/providers/taskProvider.ts index d0753cb..c474fb4 100644 --- a/src/providers/taskProvider.ts +++ b/src/providers/taskProvider.ts @@ -230,6 +230,7 @@ export class PyTaskProvider implements vscode.TreeDataProvider { const lines = content.split("\n"); let isDecorated = false; + let taskName: string | undefined; for (let i = 0; i < lines.length; i++) { const line = lines[i].trim(); @@ -237,8 +238,16 @@ export class PyTaskProvider implements vscode.TreeDataProvider { if (line.startsWith("@")) { // Handle both @task and @pytask.task(...) patterns isDecorated = - (hasTaskImport && line === `@${taskAlias}`) || + (hasTaskImport && (line === `@${taskAlias}` || line.startsWith(`@${taskAlias}(`))) || (hasPytaskImport && line.startsWith(`@${pytaskAlias}.task`)); + + // Extract name from decorator if present + if (isDecorated) { + const nameMatch = line.match(/name\s*=\s*["']([^"']+)["']/); + if (nameMatch) { + taskName = nameMatch[1]; + } + } continue; } @@ -248,9 +257,10 @@ export class PyTaskProvider implements vscode.TreeDataProvider { const funcName = funcMatch[1]; // Add if it's a task_* function or has a task decorator if (funcName.startsWith("task_") || isDecorated) { - tasks.push(new TaskItem(funcName, filePath, i + 1)); + tasks.push(new TaskItem(taskName || funcName, filePath, i + 1)); } - isDecorated = false; // Reset decorator flag + isDecorated = false; + taskName = undefined; // Reset task name } } diff --git a/src/test/providers/taskProvider.test.ts b/src/test/providers/taskProvider.test.ts index 61a2cbb..d26d425 100644 --- a/src/test/providers/taskProvider.test.ts +++ b/src/test/providers/taskProvider.test.ts @@ -363,4 +363,22 @@ def decorated_task(): # line 8 expect(tasks[1].label).to.equal("task_one"); expect(tasks[1].lineNumber).to.equal(4); }); + + test("Should handle tasks that set a new name via the decorator", () => { + const content = ` +from pytask import task + +@task(name="new_name") +def task_one(): + pass + +@task(kwargs={}, name="second_new_name") +def task_two(): + pass +`; + const tasks = provider.findTaskFunctions(dummyPath, content); + expect(tasks).to.have.lengthOf(2, "Should find both tasks"); + expect(tasks[0].label).to.equal("new_name"); + expect(tasks[1].label).to.equal("second_new_name"); + }); });