mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Merge pull request #2686 from Textualize/worker-coverage
Increase worker coverage and fix bug.
This commit is contained in:
@@ -12,8 +12,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
- Fixed zero division error https://github.com/Textualize/textual/issues/2673
|
- Fixed zero division error https://github.com/Textualize/textual/issues/2673
|
||||||
- Fix `scroll_to_center` when there were nested layers out of view (Compositor full_map not populated fully) https://github.com/Textualize/textual/pull/2684
|
- Fix `scroll_to_center` when there were nested layers out of view (Compositor full_map not populated fully) https://github.com/Textualize/textual/pull/2684
|
||||||
|
- Issue with computing progress in workers https://github.com/Textualize/textual/pull/2686
|
||||||
- Issues with `switch_screen` not updating the results callback appropriately https://github.com/Textualize/textual/issues/2650
|
- Issues with `switch_screen` not updating the results callback appropriately https://github.com/Textualize/textual/issues/2650
|
||||||
|
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- `work` decorator accepts `description` parameter to add debug string https://github.com/Textualize/textual/issues/2597
|
- `work` decorator accepts `description` parameter to add debug string https://github.com/Textualize/textual/issues/2597
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ class Worker(Generic[ResultType]):
|
|||||||
if completed_steps is not None:
|
if completed_steps is not None:
|
||||||
self._completed_steps += completed_steps
|
self._completed_steps += completed_steps
|
||||||
if total_steps != -1:
|
if total_steps != -1:
|
||||||
self._total_steps = None if total_steps is None else min(0, total_steps)
|
self._total_steps = None if total_steps is None else max(0, total_steps)
|
||||||
|
|
||||||
def advance(self, steps: int = 1) -> None:
|
def advance(self, steps: int = 1) -> None:
|
||||||
"""Advance the number of completed steps.
|
"""Advance the number of completed steps.
|
||||||
|
|||||||
@@ -4,8 +4,11 @@ import pytest
|
|||||||
|
|
||||||
from textual.app import App
|
from textual.app import App
|
||||||
from textual.worker import (
|
from textual.worker import (
|
||||||
|
DeadlockError,
|
||||||
|
NoActiveWorker,
|
||||||
Worker,
|
Worker,
|
||||||
WorkerCancelled,
|
WorkerCancelled,
|
||||||
|
WorkerError,
|
||||||
WorkerFailed,
|
WorkerFailed,
|
||||||
WorkerState,
|
WorkerState,
|
||||||
get_current_worker,
|
get_current_worker,
|
||||||
@@ -153,3 +156,61 @@ async def test_get_worker() -> None:
|
|||||||
worker._start(app)
|
worker._start(app)
|
||||||
|
|
||||||
assert await worker.wait() is worker
|
assert await worker.wait() is worker
|
||||||
|
|
||||||
|
|
||||||
|
def test_no_active_worker() -> None:
|
||||||
|
"""No active worker raises a specific exception."""
|
||||||
|
with pytest.raises(NoActiveWorker):
|
||||||
|
get_current_worker()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_progress_update():
|
||||||
|
async def long_work():
|
||||||
|
pass
|
||||||
|
|
||||||
|
app = App()
|
||||||
|
async with app.run_test():
|
||||||
|
worker = Worker(app, long_work)
|
||||||
|
worker._start(app)
|
||||||
|
worker.update(total_steps=100)
|
||||||
|
assert worker.progress == 0
|
||||||
|
worker.advance(50)
|
||||||
|
assert worker.progress == 50
|
||||||
|
worker.update(completed_steps=23)
|
||||||
|
assert worker.progress == 73
|
||||||
|
|
||||||
|
|
||||||
|
async def test_double_start():
|
||||||
|
async def long_work():
|
||||||
|
return 0
|
||||||
|
|
||||||
|
app = App()
|
||||||
|
async with app.run_test():
|
||||||
|
worker = Worker(app, long_work)
|
||||||
|
worker._start(app)
|
||||||
|
worker._start(app)
|
||||||
|
assert await worker.wait() == 0
|
||||||
|
|
||||||
|
|
||||||
|
async def test_self_referential_deadlock():
|
||||||
|
async def self_referential_work():
|
||||||
|
await get_current_worker().wait()
|
||||||
|
|
||||||
|
app = App()
|
||||||
|
async with app.run_test():
|
||||||
|
worker = Worker(app, self_referential_work)
|
||||||
|
worker._start(app)
|
||||||
|
with pytest.raises(WorkerFailed) as exc:
|
||||||
|
await worker.wait()
|
||||||
|
assert exc.type is DeadlockError
|
||||||
|
|
||||||
|
|
||||||
|
async def test_wait_without_start():
|
||||||
|
async def work():
|
||||||
|
return
|
||||||
|
|
||||||
|
app = App()
|
||||||
|
async with app.run_test():
|
||||||
|
worker = Worker(app, work)
|
||||||
|
with pytest.raises(WorkerError):
|
||||||
|
await worker.wait()
|
||||||
|
|||||||
Reference in New Issue
Block a user