Skip to content

Commit

Permalink
Handle receiving unknown tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasLM committed Feb 24, 2018
1 parent e792f2b commit 8e7965b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 10 deletions.
25 changes: 15 additions & 10 deletions spinach/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from .brokers.base import Broker
from .const import DEFAULT_QUEUE, DEFAULT_NAMESPACE
from .worker import Workers
from . import signals
from . import signals, exc


logger = getLogger(__name__)
Expand Down Expand Up @@ -55,13 +55,14 @@ def attach_tasks(self, tasks: Tasks):
tasks._spin = self

def _get_task(self, name) -> Task:
try:
return self._tasks[name]
except KeyError:
raise ValueError(
'Unknown task "{}". Known tasks: {}'
.format(name, list(self._tasks.keys()))
)
task = self._tasks.get(name)
if task is not None:
return task

raise exc.UnknownTask(
'Unknown task "{}", known tasks: {}'
.format(name, list(self._tasks.keys()))
)

def execute(self, task_name: str, *args, **kwargs):
return self._get_task(task_name).func(*args, **kwargs)
Expand Down Expand Up @@ -102,8 +103,12 @@ def _arbiter_func(self):
job = self._broker.get_job_from_queue(self._working_queue)

while job:
job.task_func = self._get_task(job.task_name).func
self._workers.submit_job(job)
try:
job.task_func = self._get_task(job.task_name).func
except exc.UnknownTask as err:
self._job_finished_callback(job, 0.0, err)
else:
self._workers.submit_job(job)

if self._workers.can_accept_job():
job = self._broker.get_job_from_queue(
Expand Down
6 changes: 6 additions & 0 deletions spinach/exc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class SpinachError(Exception):
"""Base class for other Spinach exceptions."""


class UnknownTask(SpinachError):
"""Task name is not registered with the Engine."""
8 changes: 8 additions & 0 deletions tests/test_engine.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from datetime import datetime, timezone
from unittest.mock import patch
import time

import pytest

from spinach import Engine, MemoryBroker, RetryException
from spinach.job import Job, JobStatus
from spinach.exc import UnknownTask


@pytest.fixture
Expand Down Expand Up @@ -43,3 +46,8 @@ def test_job_finished_callback(spin):
job.max_retries = 0
spin._job_finished_callback(job, 1.0, RetryException('Must retry', at=now))
assert job.status is JobStatus.FAILED


def test_schedule_unknown_task(spin):
with pytest.raises(UnknownTask):
spin.schedule('foo_task')

0 comments on commit 8e7965b

Please sign in to comment.