Skip to content

Commit d78493e

Browse files
authored
Python 3.9 migration (#63)
1 parent c1ca5cc commit d78493e

21 files changed

+104
-181
lines changed

.circleci/config.yml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,22 @@ workflows:
33
version: 2
44
eb-sqs-jobs:
55
jobs:
6-
- test-python-3-7
7-
- test-python-2-7
6+
- test-python-3-9
87
jobs:
9-
test-python-3-7: &test-template
8+
test-python-3-9:
109
docker:
11-
- image: circleci/python:3.7.6
10+
- image: cimg/python:3.9.16
1211
steps:
1312
- add_ssh_keys
1413
- checkout
1514
- run:
16-
name: Install dependencies
15+
name: Install pip packages
1716
command: |
18-
sudo pip install -r development.txt
17+
python3 -m venv venv
18+
. venv/bin/activate
19+
pip install -r development.txt
1920
- run:
2021
name: Run tests
2122
command: |
23+
. venv/bin/activate
2224
python -m django test --settings=eb_sqs.test_settings
23-
test-python-2-7:
24-
<<: *test-template
25-
docker:
26-
- image: circleci/python:2.7.16

development.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
boto3==1.9.86
2-
Django==1.10.6
3-
mock==2.0.0
4-
moto==1.3.13
5-
requests==2.10.0
1+
boto3==1.26.99
2+
Django==4.1.7
3+
mock==5.0.1
4+
moto==4.1.6
5+
requests==2.28.2

eb_sqs/auto_tasks/exceptions.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
from typing import Any
2+
3+
14
class RetryableTaskException(Exception):
2-
def __init__(self, inner, delay=None, count_retries=None, max_retries_func=None):
3-
# type: (Exception, int, bool, Any) -> None
5+
def __init__(self, inner: Exception, delay: int = None, count_retries: bool = None, max_retries_func: Any = None):
46
self._inner = inner
57

68
self.delay = delay
79
self.count_retries = count_retries
810
self.max_retries_func = max_retries_func
911

10-
def __repr__(self):
11-
# type: () -> str
12+
def __repr__(self) -> str:
1213
return repr(self._inner)

eb_sqs/auto_tasks/service.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import importlib
22
import logging
3+
from typing import Any
34

45
from eb_sqs.auto_tasks.exceptions import RetryableTaskException
56
from eb_sqs.decorators import task
@@ -24,7 +25,7 @@ def _auto_task_wrapper(module_name, class_name, func_name, *args, **kwargs):
2425
class_ = getattr(module, class_name) # find class
2526

2627
auto_task_executor_service = _AutoTaskExecutorService(func_name)
27-
instance = class_(auto_task_service=auto_task_executor_service) # instantiate class using _AutoTaskExecutorService
28+
instance = class_(auto_task_service=auto_task_executor_service)
2829

2930
executor_func_name = auto_task_executor_service.get_executor_func_name()
3031
if executor_func_name:
@@ -54,12 +55,12 @@ def _auto_task_wrapper(module_name, class_name, func_name, *args, **kwargs):
5455
exc.max_retries_func()
5556
else:
5657
# by default log an error
57-
logger.error('Reached max retries in auto task {}.{}.{} with error: {}'.format(module_name, class_name, func_name, repr(exc)))
58+
logger.error('Reached max retries in auto task {}.{}.{} with error: {}'.format(module_name, class_name,
59+
func_name, repr(exc)))
5860

5961

6062
class AutoTaskService(object):
61-
def register_task(self, method, queue_name=None, max_retries=None):
62-
# type: (Any, str, int) -> None
63+
def register_task(self, method: Any, queue_name: str = None, max_retries: int = None):
6364
instance = method.__self__
6465
class_ = instance.__class__
6566
func_name = method.__name__
@@ -82,14 +83,12 @@ def _auto_task_wrapper_invoker(*args, **kwargs):
8283

8384

8485
class _AutoTaskExecutorService(AutoTaskService):
85-
def __init__(self, func_name):
86-
# type: (str) -> None
86+
def __init__(self, func_name: str):
8787
self._func_name = func_name
8888

8989
self._executor_func_name = None
9090

91-
def register_task(self, method, queue_name=None, max_retries=None):
92-
# type: (Any, str, int) -> None
91+
def register_task(self, method: Any, queue_name: str = None, max_retries: int = None):
9392
if self._func_name == method.__name__:
9493
# circuit breaker to allow actually executing the method once
9594
instance = method.__self__
@@ -99,6 +98,5 @@ def register_task(self, method, queue_name=None, max_retries=None):
9998

10099
super(_AutoTaskExecutorService, self).register_task(method, queue_name, max_retries)
101100

102-
def get_executor_func_name(self):
103-
# type: () -> str
101+
def get_executor_func_name(self) -> str:
104102
return self._executor_func_name

eb_sqs/aws/sqs_queue_client.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from __future__ import absolute_import, unicode_literals
1+
from typing import Any
22

33
import boto3
44
from botocore.config import Config
@@ -10,15 +10,13 @@
1010

1111
class SqsQueueClient(QueueClient):
1212
def __init__(self):
13-
# type: () -> None
1413
self.sqs = boto3.resource('sqs',
1514
region_name=settings.AWS_REGION,
1615
config=Config(retries={'max_attempts': settings.AWS_MAX_RETRIES})
1716
)
1817
self.queue_cache = {}
1918

20-
def _get_queue(self, queue_name, use_cache=True):
21-
# type: (unicode, bool) -> Any
19+
def _get_queue(self, queue_name: str, use_cache: bool = True) -> Any:
2220
full_queue_name = '{}{}'.format(settings.QUEUE_PREFIX, queue_name)
2321

2422
queue = self._get_sqs_queue(full_queue_name, use_cache)
@@ -27,8 +25,7 @@ def _get_queue(self, queue_name, use_cache=True):
2725

2826
return queue
2927

30-
def _get_sqs_queue(self, queue_name, use_cache):
31-
# type: (unicode, bool) -> Any
28+
def _get_sqs_queue(self, queue_name: str, use_cache: bool) -> Any:
3229
if use_cache and self.queue_cache.get(queue_name):
3330
return self.queue_cache[queue_name]
3431

@@ -43,8 +40,7 @@ def _get_sqs_queue(self, queue_name, use_cache):
4340
else:
4441
raise ex
4542

46-
def _add_sqs_queue(self, queue_name):
47-
# type: (unicode) -> Any
43+
def _add_sqs_queue(self, queue_name: str) -> Any:
4844
if settings.AUTO_ADD_QUEUE:
4945
queue = self.sqs.create_queue(
5046
QueueName=queue_name,
@@ -58,8 +54,7 @@ def _add_sqs_queue(self, queue_name):
5854
else:
5955
raise QueueDoesNotExistException(queue_name)
6056

61-
def add_message(self, queue_name, msg, delay):
62-
# type: (unicode, unicode, int) -> None
57+
def add_message(self, queue_name: str, msg: str, delay: int):
6358
try:
6459
queue = self._get_queue(queue_name)
6560
try:

eb_sqs/decorators.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
from __future__ import absolute_import, unicode_literals
1+
from typing import Any
22

33
from eb_sqs import settings
44
from eb_sqs.worker.worker_factory import WorkerFactory
55
from eb_sqs.worker.worker_task import WorkerTask
66

77

8-
def _get_kwarg_val(kwargs, key, default):
9-
# type: (dict, str, Any) -> Any
8+
def _get_kwarg_val(kwargs: dict, key: str, default: Any) -> Any:
109
return kwargs.pop(key, default) if kwargs else default
1110

1211

13-
def func_delay_decorator(func, queue_name, max_retries_count, use_pickle):
14-
# type: (Any, str, int, bool) -> (tuple, dict)
15-
def wrapper(*args, **kwargs):
16-
# type: (tuple, dict) -> Any
12+
def func_delay_decorator(func: Any, queue_name: str, max_retries_count: int, use_pickle: bool) -> (tuple, dict):
13+
def wrapper(*args: tuple, **kwargs: dict) -> Any:
1714
queue = _get_kwarg_val(kwargs, 'queue_name', queue_name if queue_name else settings.DEFAULT_QUEUE)
1815
max_retries = _get_kwarg_val(kwargs, 'max_retries', max_retries_count if max_retries_count else settings.DEFAULT_MAX_RETRIES)
1916
pickle = _get_kwarg_val(kwargs, 'use_pickle', use_pickle if use_pickle else settings.USE_PICKLE)
@@ -28,10 +25,8 @@ def wrapper(*args, **kwargs):
2825
return wrapper
2926

3027

31-
def func_retry_decorator(worker_task):
32-
# type: (WorkerTask) -> (tuple, dict)
33-
def wrapper(*args, **kwargs):
34-
# type: (tuple, dict) -> Any
28+
def func_retry_decorator(worker_task: WorkerTask) -> (tuple, dict):
29+
def wrapper(*args: tuple, **kwargs: dict) -> Any:
3530
execute_inline = _get_kwarg_val(kwargs, 'execute_inline', False) or settings.EXECUTE_INLINE
3631
delay = _get_kwarg_val(kwargs, 'delay', settings.DEFAULT_DELAY)
3732
count_retries = _get_kwarg_val(kwargs, 'count_retries', settings.DEFAULT_COUNT_RETRIES)
@@ -42,14 +37,12 @@ def wrapper(*args, **kwargs):
4237

4338

4439
class task(object):
45-
def __init__(self, queue_name=None, max_retries=None, use_pickle=None):
46-
# type: (str, int, bool) -> None
40+
def __init__(self, queue_name: str = None, max_retries: int = None, use_pickle: bool = None):
4741
self.queue_name = queue_name
4842
self.max_retries = max_retries
4943
self.use_pickle = use_pickle
5044

51-
def __call__(self, *args, **kwargs):
52-
# type: (tuple, dict) -> Any
45+
def __call__(self, *args: tuple, **kwargs: dict) -> Any:
5346
func = args[0]
5447
func.retry_num = 0
5548
func.delay = func_delay_decorator(func, self.queue_name, self.max_retries, self.use_pickle)

eb_sqs/management/commands/process_queue.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from __future__ import absolute_import, unicode_literals
2-
31
from django.core.management import BaseCommand, CommandError
42

53
from eb_sqs.worker.service import WorkerService

eb_sqs/settings.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from __future__ import absolute_import, unicode_literals
2-
31
from django.conf import settings
42

53
AWS_REGION = getattr(settings, 'EB_AWS_REGION', 'us-east-1') # type: str

eb_sqs/test_settings.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
},
3535
]
3636

37-
ROOT_URLCONF = 'eb_sqs.urls'
38-
3937
LOGGING = {
4038
'version': 1,
4139
'disable_existing_loggers': False,

eb_sqs/tests/tests_decorators.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from __future__ import absolute_import, unicode_literals
2-
31
from unittest import TestCase
42

53
from mock import Mock
@@ -11,19 +9,18 @@
119

1210

1311
@task()
14-
def dummy_task(msg):
15-
# type: (unicode) -> None
12+
def dummy_task(msg: str):
1613
if not msg:
1714
raise Exception('No message')
1815

16+
1917
@task(queue_name='CustomQueue')
2018
def dummy_task_custom_queue():
21-
# type: (unicode) -> None
2219
pass
2320

21+
2422
@task()
25-
def dummy_retry_task(msg):
26-
# type: (unicode) -> None
23+
def dummy_retry_task(msg: str):
2724
if dummy_retry_task.retry_num == 0:
2825
dummy_retry_task.retry()
2926
else:

0 commit comments

Comments
 (0)