Skip to content

Commit 54c0cbb

Browse files
committed
Update module level function methods
"global" can be confusing
1 parent f194474 commit 54c0cbb

File tree

6 files changed

+52
-50
lines changed

6 files changed

+52
-50
lines changed

django_tasks/backends/base.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from django_tasks.exceptions import InvalidTaskError
1212
from django_tasks.task import MAX_PRIORITY, MIN_PRIORITY, Task, TaskResult
13-
from django_tasks.utils import is_global_function
13+
from django_tasks.utils import is_module_level_function
1414

1515
T = TypeVar("T")
1616
P = ParamSpec("P")
@@ -57,10 +57,8 @@ def validate_task(self, task: Task) -> None:
5757
"""
5858
Determine whether the provided task is one which can be executed by the backend.
5959
"""
60-
if not is_global_function(task.func):
61-
raise InvalidTaskError(
62-
"Task function must be a globally importable function"
63-
)
60+
if not is_module_level_function(task.func):
61+
raise InvalidTaskError("Task function must be defined at a module level")
6462

6563
if not self.supports_async_task and iscoroutinefunction(task.func):
6664
raise InvalidTaskError("Backend does not support async tasks")

django_tasks/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class SerializedExceptionDict(TypedDict):
2525
P = ParamSpec("P")
2626

2727

28-
def is_global_function(func: Callable) -> bool:
28+
def is_module_level_function(func: Callable) -> bool:
2929
if not inspect.isfunction(func) or inspect.isbuiltin(func):
3030
return False
3131

tests/tests/is_global_function_fixture.py

-27
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""
2+
This file is used to test function is considered module level even if it's not defined yet
3+
because it's covered by a decorator.
4+
"""
5+
6+
from django_tasks.utils import is_module_level_function
7+
8+
9+
@is_module_level_function
10+
def really_module_level_function() -> None:
11+
pass
12+
13+
14+
inner_func_is_module_level_function = None
15+
16+
17+
def main() -> None:
18+
global inner_func_is_module_level_function
19+
20+
@is_module_level_function
21+
def inner_func() -> None:
22+
pass
23+
24+
inner_func_is_module_level_function = inner_func
25+
26+
27+
main()

tests/tests/test_tasks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ def test_invalid_function(self) -> None:
216216
with self.subTest(invalid_function):
217217
with self.assertRaisesMessage(
218218
InvalidTaskError,
219-
"Task function must be a globally importable function",
219+
"Task function must be defined at a module level",
220220
):
221221
task()(invalid_function) # type:ignore[arg-type]
222222

tests/tests/test_utils.py

+20-16
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,43 @@
1313
from tests import tasks as test_tasks
1414

1515

16-
class IsGlobalFunctionTestCase(SimpleTestCase):
16+
class IsModuleLevelFunctionTestCase(SimpleTestCase):
1717
def test_builtin(self) -> None:
18-
self.assertFalse(utils.is_global_function(any))
19-
self.assertFalse(utils.is_global_function(isinstance))
18+
self.assertFalse(utils.is_module_level_function(any))
19+
self.assertFalse(utils.is_module_level_function(isinstance))
2020

2121
def test_from_module(self) -> None:
22-
self.assertTrue(utils.is_global_function(subprocess.run))
23-
self.assertTrue(utils.is_global_function(subprocess.check_output))
24-
self.assertTrue(utils.is_global_function(test_tasks.noop_task.func))
22+
self.assertTrue(utils.is_module_level_function(subprocess.run))
23+
self.assertTrue(utils.is_module_level_function(subprocess.check_output))
24+
self.assertTrue(utils.is_module_level_function(test_tasks.noop_task.func))
2525

2626
def test_private_function(self) -> None:
2727
def private_function() -> None:
2828
pass
2929

30-
self.assertFalse(utils.is_global_function(private_function))
30+
self.assertFalse(utils.is_module_level_function(private_function))
3131

3232
def test_coroutine(self) -> None:
33-
self.assertTrue(utils.is_global_function(test_tasks.noop_task_async.func))
33+
self.assertTrue(utils.is_module_level_function(test_tasks.noop_task_async.func))
3434

3535
def test_method(self) -> None:
36-
self.assertFalse(utils.is_global_function(self.test_method))
37-
self.assertFalse(utils.is_global_function(self.setUp))
36+
self.assertFalse(utils.is_module_level_function(self.test_method))
37+
self.assertFalse(utils.is_module_level_function(self.setUp))
3838

3939
def test_lambda(self) -> None:
40-
self.assertFalse(utils.is_global_function(lambda: True))
40+
self.assertFalse(utils.is_module_level_function(lambda: True))
4141

4242
def test_uninitialised_method(self) -> None:
4343
# This import has to be here, so the module is loaded during the test
44-
from . import is_global_function_fixture
45-
46-
self.assertTrue(is_global_function_fixture.really_global_function)
47-
self.assertIsNotNone(is_global_function_fixture.inner_func_is_global_function)
48-
self.assertFalse(is_global_function_fixture.inner_func_is_global_function)
44+
from . import is_module_level_function_fixture
45+
46+
self.assertTrue(is_module_level_function_fixture.really_module_level_function)
47+
self.assertIsNotNone(
48+
is_module_level_function_fixture.inner_func_is_module_level_function
49+
)
50+
self.assertFalse(
51+
is_module_level_function_fixture.inner_func_is_module_level_function
52+
)
4953

5054

5155
class JSONNormalizeTestCase(SimpleTestCase):

0 commit comments

Comments
 (0)