Skip to content

Commit f2a2032

Browse files
authored
Parse task name from decorator. (#3)
1 parent 18a5ca7 commit f2a2032

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

.vscode/settings.json

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,27 @@
11
{
2-
"editor.defaultFormatter": "esbenp.prettier-vscode",
2+
"[javascriptreact]": {
3+
"editor.defaultFormatter": "esbenp.prettier-vscode"
4+
},
5+
"[typescriptreact]": {
6+
"editor.defaultFormatter": "esbenp.prettier-vscode"
7+
},
8+
"[typescript]": {
9+
"editor.defaultFormatter": "esbenp.prettier-vscode"
10+
},
11+
"[scss]": {
12+
"editor.defaultFormatter": "esbenp.prettier-vscode"
13+
},
14+
"[javascript]": {
15+
"editor.defaultFormatter": "esbenp.prettier-vscode"
16+
},
17+
"[html]": {
18+
"editor.defaultFormatter": "esbenp.prettier-vscode"
19+
},
20+
"[css]": {
21+
"editor.defaultFormatter": "esbenp.prettier-vscode"
22+
},
23+
"[yaml]": {
24+
"editor.defaultFormatter": null
25+
},
326
"editor.formatOnSave": true
427
}

src/providers/taskProvider.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,24 @@ export class PyTaskProvider implements vscode.TreeDataProvider<TreeItemType> {
230230
const lines = content.split("\n");
231231

232232
let isDecorated = false;
233+
let taskName: string | undefined;
233234
for (let i = 0; i < lines.length; i++) {
234235
const line = lines[i].trim();
235236

236237
// Check for decorators
237238
if (line.startsWith("@")) {
238239
// Handle both @task and @pytask.task(...) patterns
239240
isDecorated =
240-
(hasTaskImport && line === `@${taskAlias}`) ||
241+
(hasTaskImport && (line === `@${taskAlias}` || line.startsWith(`@${taskAlias}(`))) ||
241242
(hasPytaskImport && line.startsWith(`@${pytaskAlias}.task`));
243+
244+
// Extract name from decorator if present
245+
if (isDecorated) {
246+
const nameMatch = line.match(/name\s*=\s*["']([^"']+)["']/);
247+
if (nameMatch) {
248+
taskName = nameMatch[1];
249+
}
250+
}
242251
continue;
243252
}
244253

@@ -248,9 +257,10 @@ export class PyTaskProvider implements vscode.TreeDataProvider<TreeItemType> {
248257
const funcName = funcMatch[1];
249258
// Add if it's a task_* function or has a task decorator
250259
if (funcName.startsWith("task_") || isDecorated) {
251-
tasks.push(new TaskItem(funcName, filePath, i + 1));
260+
tasks.push(new TaskItem(taskName || funcName, filePath, i + 1));
252261
}
253-
isDecorated = false; // Reset decorator flag
262+
isDecorated = false;
263+
taskName = undefined; // Reset task name
254264
}
255265
}
256266

src/test/providers/taskProvider.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,4 +363,22 @@ def decorated_task(): # line 8
363363
expect(tasks[1].label).to.equal("task_one");
364364
expect(tasks[1].lineNumber).to.equal(4);
365365
});
366+
367+
test("Should handle tasks that set a new name via the decorator", () => {
368+
const content = `
369+
from pytask import task
370+
371+
@task(name="new_name")
372+
def task_one():
373+
pass
374+
375+
@task(kwargs={}, name="second_new_name")
376+
def task_two():
377+
pass
378+
`;
379+
const tasks = provider.findTaskFunctions(dummyPath, content);
380+
expect(tasks).to.have.lengthOf(2, "Should find both tasks");
381+
expect(tasks[0].label).to.equal("new_name");
382+
expect(tasks[1].label).to.equal("second_new_name");
383+
});
366384
});

0 commit comments

Comments
 (0)