Skip to content

Commit dade3cd

Browse files
committed
Implement a running status.
1 parent 09f7312 commit dade3cd

File tree

6 files changed

+30
-20
lines changed

6 files changed

+30
-20
lines changed

docs/source/changes.md

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ releases are available on [PyPI](https://pypi.org/project/pytask) and
4747
- {pull}`603` fixes an example in the documentation about capturing warnings.
4848
- {pull}`604` fixes some examples with `PythonNode`s in the documentation.
4949
- {pull}`605` improves checks and CI.
50+
- {pull}`606` allows a pending status for tasks. Useful for async backends implemented
51+
in pytask-parallel.
5052

5153
## 0.4.7 - 2024-03-19
5254

src/_pytask/execute.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from _pytask.exceptions import ExecutionError
2626
from _pytask.exceptions import NodeLoadError
2727
from _pytask.exceptions import NodeNotFoundError
28+
from _pytask.logging_utils import TaskExecutionStatus
2829
from _pytask.mark import Mark
2930
from _pytask.mark_utils import has_mark
3031
from _pytask.node_protocols import PNode
@@ -98,7 +99,9 @@ def pytask_execute_build(session: Session) -> bool | None:
9899
@hookimpl
99100
def pytask_execute_task_protocol(session: Session, task: PTask) -> ExecutionReport:
100101
"""Follow the protocol to execute each task."""
101-
session.hook.pytask_execute_task_log_start(session=session, task=task)
102+
session.hook.pytask_execute_task_log_start(
103+
session=session, task=task, status=TaskExecutionStatus.RUNNING
104+
)
102105
try:
103106
session.hook.pytask_execute_task_setup(session=session, task=task)
104107
session.hook.pytask_execute_task(session=session, task=task)

src/_pytask/hookspecs.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import click
1919
from pluggy import PluginManager
2020

21+
from _pytask.logging_utils import TaskExecutionStatus
2122
from _pytask.models import NodeInfo
2223
from _pytask.node_protocols import PNode
2324
from _pytask.node_protocols import PProvisionalNode
@@ -255,7 +256,9 @@ def pytask_execute_task_protocol(session: Session, task: PTask) -> ExecutionRepo
255256

256257

257258
@hookspec(firstresult=True)
258-
def pytask_execute_task_log_start(session: Session, task: PTask) -> None:
259+
def pytask_execute_task_log_start(
260+
session: Session, task: PTask, status: TaskExecutionStatus
261+
) -> None:
259262
"""Start logging of task execution.
260263
261264
This hook can be used to provide more verbose output during the execution.

src/_pytask/live.py

+10-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from __future__ import annotations
44

5-
from enum import Enum
65
from typing import TYPE_CHECKING
76
from typing import Any
87
from typing import Generator
@@ -25,6 +24,7 @@
2524
from _pytask.pluginmanager import hookimpl
2625

2726
if TYPE_CHECKING:
27+
from _pytask.logging_utils import TaskExecutionStatus
2828
from _pytask.node_protocols import PTask
2929
from _pytask.reports import CollectionReport
3030
from _pytask.reports import ExecutionReport
@@ -130,14 +130,9 @@ def is_started(self) -> bool:
130130
return self._live.is_started
131131

132132

133-
class _TaskStatus(Enum):
134-
PENDING = "pending"
135-
RUNNING = "running"
136-
137-
138133
class _TaskEntry(NamedTuple):
139134
task: PTask
140-
status: _TaskStatus
135+
status: TaskExecutionStatus
141136

142137

143138
class _ReportEntry(NamedTuple):
@@ -173,9 +168,11 @@ def pytask_execute_build(self) -> Generator[None, None, None]:
173168
return result
174169

175170
@hookimpl(tryfirst=True)
176-
def pytask_execute_task_log_start(self, task: PTask) -> bool:
171+
def pytask_execute_task_log_start(
172+
self, task: PTask, status: TaskExecutionStatus
173+
) -> bool:
177174
"""Mark a new task as running."""
178-
self.update_running_tasks(task)
175+
self.update_running_tasks(new_running_task=task, status=status)
179176
return True
180177

181178
@hookimpl
@@ -268,10 +265,12 @@ def _update_table(
268265
)
269266
self.live_manager.update(table)
270267

271-
def update_running_tasks(self, new_running_task: PTask) -> None:
268+
def update_running_tasks(
269+
self, new_running_task: PTask, status: TaskExecutionStatus
270+
) -> None:
272271
"""Add a new running task."""
273272
self._running_tasks[new_running_task.signature] = _TaskEntry(
274-
task=new_running_task, status=_TaskStatus.RUNNING
273+
task=new_running_task, status=status
275274
)
276275
self._update_table()
277276

src/pytask/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from _pytask.build import build
88
from _pytask.capture_utils import CaptureMethod
99
from _pytask.capture_utils import ShowCapture
10+
from _pytask.logging_utils import TaskExecutionStatus
1011

1112

1213
from _pytask.click import ColoredCommand
@@ -129,6 +130,7 @@
129130
"SkippedUnchanged",
130131
"State",
131132
"Task",
133+
"TaskExecutionStatus",
132134
"TaskOutcome",
133135
"TaskWithoutPath",
134136
"Traceback",

tests/test_live.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77
from _pytask.live import LiveExecution
88
from _pytask.live import LiveManager
9+
from _pytask.logging_utils import TaskExecutionStatus
910
from pytask import ExecutionReport
1011
from pytask import ExitCode
1112
from pytask import Task
@@ -41,7 +42,7 @@ def test_live_execution_sequentially(capsys, tmp_path):
4142
)
4243

4344
live_manager.start()
44-
live.update_running_tasks(task)
45+
live.update_running_tasks(task, status=TaskExecutionStatus.RUNNING)
4546
live_manager.pause()
4647

4748
# Test pause removes the table.
@@ -99,7 +100,7 @@ def test_live_execution_displays_skips_and_persists(capsys, tmp_path, verbose, o
99100
)
100101

101102
live_manager.start()
102-
live.update_running_tasks(task)
103+
live.update_running_tasks(task, status=TaskExecutionStatus.RUNNING)
103104
live_manager.pause()
104105

105106
report = ExecutionReport(task=task, outcome=outcome, exc_info=None)
@@ -149,7 +150,7 @@ def test_live_execution_displays_subset_of_table(capsys, tmp_path, n_entries_in_
149150
)
150151

151152
live_manager.start()
152-
live.update_running_tasks(running_task)
153+
live.update_running_tasks(running_task, status=TaskExecutionStatus.RUNNING)
153154
live_manager.stop(transient=False)
154155

155156
captured = capsys.readouterr()
@@ -161,7 +162,7 @@ def test_live_execution_displays_subset_of_table(capsys, tmp_path, n_entries_in_
161162

162163
completed_task = Task(base_name="task_completed", path=path, function=lambda x: x)
163164
completed_task.name = "task_module.py::task_completed"
164-
live.update_running_tasks(completed_task)
165+
live.update_running_tasks(completed_task, status=TaskExecutionStatus.RUNNING)
165166
report = ExecutionReport(
166167
task=completed_task, outcome=TaskOutcome.SUCCESS, exc_info=None
167168
)
@@ -202,7 +203,7 @@ def test_live_execution_skips_do_not_crowd_out_displayed_tasks(capsys, tmp_path)
202203
)
203204

204205
live_manager.start()
205-
live.update_running_tasks(task)
206+
live.update_running_tasks(task, status=TaskExecutionStatus.RUNNING)
206207
live_manager.stop()
207208

208209
# Test table with running task.
@@ -224,9 +225,9 @@ def test_live_execution_skips_do_not_crowd_out_displayed_tasks(capsys, tmp_path)
224225
tasks.append(skipped_task)
225226

226227
live_manager.start()
227-
live.update_running_tasks(successful_task)
228+
live.update_running_tasks(successful_task, status=TaskExecutionStatus.RUNNING)
228229
for task in tasks:
229-
live.update_running_tasks(task)
230+
live.update_running_tasks(task, status=TaskExecutionStatus.RUNNING)
230231
live_manager.stop()
231232

232233
captured = capsys.readouterr()

0 commit comments

Comments
 (0)