diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..057c78f4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,29 @@ +repos: + - repo: https://github.com/asottile/pyupgrade + rev: v2.21.2 + hooks: + - id: pyupgrade + args: ["--py36-plus"] + + - repo: https://gitlab.com/pycqa/flake8 + rev: 3.9.2 + hooks: + - id: flake8 + + - repo: https://github.com/asottile/yesqa + rev: v1.2.3 + hooks: + - id: yesqa + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.0.1 + hooks: + - id: check-merge-conflict + - id: check-toml + - id: check-yaml + - id: mixed-line-ending + + - repo: https://github.com/pycqa/isort + rev: 5.9.2 + hooks: + - id: isort diff --git a/django_celery_results/__init__.py b/django_celery_results/__init__.py index eaab36aa..b1ca8aad 100644 --- a/django_celery_results/__init__.py +++ b/django_celery_results/__init__.py @@ -4,7 +4,6 @@ # :license: BSD (3 Clause), see LICENSE for more details. import re - from collections import namedtuple import django diff --git a/django_celery_results/admin.py b/django_celery_results/admin.py index 310f6275..b4a36a51 100644 --- a/django_celery_results/admin.py +++ b/django_celery_results/admin.py @@ -1,8 +1,7 @@ """Result Task Admin interface.""" -from django.contrib import admin - from django.conf import settings +from django.contrib import admin from django.utils.translation import gettext_lazy as _ try: @@ -11,7 +10,7 @@ ALLOW_EDITS = False pass -from .models import TaskResult, GroupResult +from .models import GroupResult, TaskResult class TaskResultAdmin(admin.ModelAdmin): @@ -59,9 +58,9 @@ def get_readonly_fields(self, request, obj=None): if ALLOW_EDITS: return self.readonly_fields else: - return list(set( - [field.name for field in self.opts.local_fields] - )) + return list({ + field.name for field in self.opts.local_fields + }) admin.site.register(TaskResult, TaskResultAdmin) diff --git a/django_celery_results/backends/cache.py b/django_celery_results/backends/cache.py index ea47d690..43c3745a 100644 --- a/django_celery_results/backends/cache.py +++ b/django_celery_results/backends/cache.py @@ -1,8 +1,8 @@ """Celery cache backend using the Django Cache Framework.""" -from django.core.cache import cache as default_cache, caches - from celery.backends.base import KeyValueStoreBackend +from django.core.cache import cache as default_cache +from django.core.cache import caches class CacheBackend(KeyValueStoreBackend): diff --git a/django_celery_results/backends/database.py b/django_celery_results/backends/database.py index 786ca51c..ea936421 100644 --- a/django_celery_results/backends/database.py +++ b/django_celery_results/backends/database.py @@ -4,14 +4,15 @@ from celery import maybe_signature from celery.backends.base import BaseDictBackend from celery.exceptions import ChordError -from celery.result import allow_join_result, result_from_tuple, GroupResult -from celery.utils.serialization import b64encode, b64decode +from celery.result import GroupResult, allow_join_result, result_from_tuple from celery.utils.log import get_logger -from kombu.exceptions import DecodeError +from celery.utils.serialization import b64decode, b64encode from django.db import transaction +from kombu.exceptions import DecodeError -from ..models import TaskResult, ChordCounter, GroupResult as GroupResultModel - +from ..models import ChordCounter +from ..models import GroupResult as GroupResultModel +from ..models import TaskResult logger = get_logger(__name__) @@ -224,7 +225,7 @@ def trigger_callback(app, callback, group_result): except Exception as exc: # pylint: disable=broad-except try: culprit = next(group_result._failed_join_report()) - reason = "Dependency {0.id} raised {1!r}".format(culprit, exc) + reason = f"Dependency {culprit.id} raised {exc!r}" except StopIteration: reason = repr(exc) logger.exception("Chord %r raised: %r", group_result.id, exc) @@ -235,5 +236,5 @@ def trigger_callback(app, callback, group_result): except Exception as exc: # pylint: disable=broad-except logger.exception("Chord %r raised: %r", group_result.id, exc) app.backend.chord_error_from_stack( - callback, exc=ChordError("Callback error: {0!r}".format(exc)) + callback, exc=ChordError(f"Callback error: {exc!r}") ) diff --git a/django_celery_results/managers.py b/django_celery_results/managers.py index e76a99aa..7e6a5f22 100644 --- a/django_celery_results/managers.py +++ b/django_celery_results/managers.py @@ -1,15 +1,12 @@ """Model managers.""" import warnings - from functools import wraps from itertools import count from celery.utils.time import maybe_timedelta - -from django.db import connections, router, transaction -from django.db import models from django.conf import settings +from django.db import connections, models, router, transaction from .utils import now diff --git a/django_celery_results/migrations/0001_initial.py b/django_celery_results/migrations/0001_initial.py index c2f24a6d..91599f96 100644 --- a/django_celery_results/migrations/0001_initial.py +++ b/django_celery_results/migrations/0001_initial.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import, unicode_literals - from django.conf import settings from django.db import migrations, models diff --git a/django_celery_results/migrations/0002_add_task_name_args_kwargs.py b/django_celery_results/migrations/0002_add_task_name_args_kwargs.py index 19df8bfa..f7507619 100644 --- a/django_celery_results/migrations/0002_add_task_name_args_kwargs.py +++ b/django_celery_results/migrations/0002_add_task_name_args_kwargs.py @@ -1,6 +1,4 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.9.1 on 2017-10-26 16:06 -from __future__ import absolute_import, unicode_literals from django.db import migrations, models diff --git a/django_celery_results/migrations/0003_auto_20181106_1101.py b/django_celery_results/migrations/0003_auto_20181106_1101.py index 62691b99..154ba1d7 100644 --- a/django_celery_results/migrations/0003_auto_20181106_1101.py +++ b/django_celery_results/migrations/0003_auto_20181106_1101.py @@ -1,6 +1,4 @@ -# -*- coding: utf-8 -*- # Generated by Django 2.1 on 2018-11-06 11:01 -from __future__ import absolute_import, unicode_literals from django.db import migrations diff --git a/django_celery_results/migrations/0004_auto_20190516_0412.py b/django_celery_results/migrations/0004_auto_20190516_0412.py index 284d4f93..c97c9430 100644 --- a/django_celery_results/migrations/0004_auto_20190516_0412.py +++ b/django_celery_results/migrations/0004_auto_20190516_0412.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.20 on 2019-05-16 04:12 # this file is auto-generated so don't do flake8 on it # flake8: noqa -from __future__ import absolute_import, unicode_literals from django.conf import settings from django.db import migrations, models diff --git a/django_celery_results/migrations/0005_taskresult_worker.py b/django_celery_results/migrations/0005_taskresult_worker.py index 0a254978..6001f914 100644 --- a/django_celery_results/migrations/0005_taskresult_worker.py +++ b/django_celery_results/migrations/0005_taskresult_worker.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.22 on 2019-07-24 15:38 # this file is auto-generated so don't do flake8 on it # flake8: noqa -from __future__ import absolute_import, unicode_literals from django.db import migrations, models diff --git a/django_celery_results/migrations/0006_taskresult_date_created.py b/django_celery_results/migrations/0006_taskresult_date_created.py index fe2b48a6..9fd4ed05 100644 --- a/django_celery_results/migrations/0006_taskresult_date_created.py +++ b/django_celery_results/migrations/0006_taskresult_date_created.py @@ -1,13 +1,11 @@ -# -*- coding: utf-8 -*- # Generated by Django 2.2.4 on 2019-08-21 19:53 # this file is auto-generated so don't do flake8 on it # flake8: noqa -from __future__ import absolute_import, unicode_literals -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models def copy_date_done_to_date_created(apps, schema_editor): diff --git a/django_celery_results/migrations/0007_remove_taskresult_hidden.py b/django_celery_results/migrations/0007_remove_taskresult_hidden.py index 0edf6d5b..2bdc9e95 100644 --- a/django_celery_results/migrations/0007_remove_taskresult_hidden.py +++ b/django_celery_results/migrations/0007_remove_taskresult_hidden.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- # Generated by Django 2.2.6 on 2019-10-27 11:29 # this file is auto-generated so don't do flake8 on it # flake8: noqa -from __future__ import absolute_import, unicode_literals from django.db import migrations diff --git a/django_celery_results/migrations/0008_chordcounter.py b/django_celery_results/migrations/0008_chordcounter.py index dc030e36..0e64adfe 100644 --- a/django_celery_results/migrations/0008_chordcounter.py +++ b/django_celery_results/migrations/0008_chordcounter.py @@ -1,5 +1,4 @@ # Generated by Django 3.0.6 on 2020-05-12 12:05 -from __future__ import unicode_literals, absolute_import from django.conf import settings from django.db import migrations, models diff --git a/django_celery_results/migrations/0010_remove_duplicate_indices.py b/django_celery_results/migrations/0010_remove_duplicate_indices.py index bdf3970e..4b50d612 100644 --- a/django_celery_results/migrations/0010_remove_duplicate_indices.py +++ b/django_celery_results/migrations/0010_remove_duplicate_indices.py @@ -7,7 +7,7 @@ to not add the duplicates for new installs """ -from django.db import migrations, DatabaseError +from django.db import DatabaseError, migrations class TryRemoveIndex(migrations.RemoveIndex): diff --git a/django_celery_results/models.py b/django_celery_results/models.py index 49acf71d..5558f8f5 100644 --- a/django_celery_results/models.py +++ b/django_celery_results/models.py @@ -2,14 +2,13 @@ import json +from celery import states +from celery.result import GroupResult as CeleryGroupResult +from celery.result import result_from_tuple from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ -from celery import states -from celery.result import result_from_tuple -from celery.result import GroupResult as CeleryGroupResult - from . import managers ALL_STATES = sorted(states.ALL_STATES) @@ -206,7 +205,7 @@ def as_dict(self): } def __str__(self): - return ''.format(self) + return f'' objects = managers.GroupResultManager() diff --git a/django_celery_results/views.py b/django_celery_results/views.py index 2710306a..78581dcd 100644 --- a/django_celery_results/views.py +++ b/django_celery_results/views.py @@ -1,9 +1,8 @@ """Views.""" -from django.http import JsonResponse - from celery import states from celery.result import AsyncResult, GroupResult from celery.utils import get_full_cls_name +from django.http import JsonResponse from kombu.utils.encoding import safe_repr diff --git a/docs/conf.py b/docs/conf.py index 8896a3df..6f4f3801 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import, unicode_literals - import os from sphinx_celery import conf diff --git a/manage.py b/manage.py index 43ca0db4..33b0685f 100755 --- a/manage.py +++ b/manage.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -from __future__ import absolute_import, unicode_literals + import os import sys diff --git a/setup.cfg b/setup.cfg index f363aab0..ffb9ab00 100644 --- a/setup.cfg +++ b/setup.cfg @@ -17,3 +17,6 @@ match-dir = [^migrations] [wheel] universal = 1 + +[isort] +profile=black diff --git a/setup.py b/setup.py index 198a130e..171fe9f2 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,9 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- +import codecs import os import re import sys -import codecs import setuptools import setuptools.command.test @@ -18,7 +17,7 @@ def _pyimp(): NAME = 'django_celery_results' -E_UNSUPPORTED_PYTHON = '%s 1.0 requires %%s %%s or later!' % (NAME,) +E_UNSUPPORTED_PYTHON = f'{NAME} 1.0 requires %s %s or later!' PYIMP = _pyimp() PY36_OR_LESS = sys.version_info < (3, 6) @@ -65,6 +64,7 @@ def add_default(m): def add_doc(m): return (('doc', m.groups()[0]),) + pats = {re_meta: add_default, re_doc: add_doc} here = os.path.abspath(os.path.dirname(__file__)) @@ -81,8 +81,8 @@ def add_doc(m): # -*- Installation Requires -*- -def strip_comments(l): - return l.split('#', 1)[0].strip() +def strip_comments(line): + return line.split('#', 1)[0].strip() def _pip_requirement(req): @@ -93,11 +93,12 @@ def _pip_requirement(req): def _reqs(*f): - return [ - _pip_requirement(r) for r in ( - strip_comments(l) for l in open( - os.path.join(os.getcwd(), 'requirements', *f)).readlines() - ) if r] + with open(os.path.join(os.getcwd(), 'requirements', *f)) as fp: + return [ + _pip_requirement(r) + for r in (strip_comments(line) for line in fp) + if r + ] def reqs(*f): @@ -105,10 +106,11 @@ def reqs(*f): # -*- Long Description -*- + if os.path.exists('README.rst'): long_description = codecs.open('README.rst', 'r', 'utf-8').read() else: - long_description = 'See http://pypi.python.org/pypi/%s' % (NAME,) + long_description = f'See http://pypi.python.org/pypi/{NAME}' # -*- %%% -*- @@ -124,6 +126,7 @@ def run_tests(self): import pytest sys.exit(pytest.main(self.pytest_args)) + setuptools.setup( name=NAME, packages=setuptools.find_packages(exclude=['ez_setup', 't', 't.*']), diff --git a/t/conftest.py b/t/conftest.py index a3a033a1..00958038 100644 --- a/t/conftest.py +++ b/t/conftest.py @@ -3,9 +3,14 @@ # we have to import the pytest plugin fixtures here, # in case user did not do the `python setup.py develop` yet, # that installs the pytest plugin into the setuptools registry. -from celery.contrib.pytest import (celery_app, celery_enable_logging, - celery_parameters, depends_on_current_app, - celery_config, use_celery_app_trap) +from celery.contrib.pytest import ( + celery_app, + celery_config, + celery_enable_logging, + celery_parameters, + depends_on_current_app, + use_celery_app_trap, +) from celery.contrib.testing.app import TestApp, Trap # Tricks flake8 into silencing redefining fixtures warnings. diff --git a/t/integration/benchmark_models.py b/t/integration/benchmark_models.py index b9d31ce9..d95f681b 100644 --- a/t/integration/benchmark_models.py +++ b/t/integration/benchmark_models.py @@ -1,11 +1,9 @@ -import pytest - -from datetime import timedelta import time +from datetime import timedelta -from django.test import TransactionTestCase - +import pytest from celery import uuid +from django.test import TransactionTestCase from django_celery_results.models import TaskResult from django_celery_results.utils import now diff --git a/t/proj/settings.py b/t/proj/settings.py index b9aeab91..749b7e9d 100644 --- a/t/proj/settings.py +++ b/t/proj/settings.py @@ -13,7 +13,6 @@ import os import sys - # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.abspath(os.path.join(BASE_DIR, os.pardir))) diff --git a/t/unit/backends/test_cache.py b/t/unit/backends/test_cache.py index 55cf7fa5..346ea971 100644 --- a/t/unit/backends/test_cache.py +++ b/t/unit/backends/test_cache.py @@ -1,13 +1,9 @@ -import pytest import sys - from datetime import timedelta +import pytest from billiard.einfo import ExceptionInfo - -from celery import result -from celery import states -from celery import uuid +from celery import result, states, uuid from django_celery_results.backends.cache import CacheBackend diff --git a/t/unit/backends/test_database.py b/t/unit/backends/test_database.py index 059a9b84..87cdd255 100644 --- a/t/unit/backends/test_database.py +++ b/t/unit/backends/test_database.py @@ -1,14 +1,13 @@ -import mock -import celery import json -import pytest -import re import pickle +import re +from unittest import mock -from celery import uuid -from celery import states +import celery +import pytest +from celery import states, uuid from celery.app.task import Context -from celery.result import GroupResult, AsyncResult +from celery.result import AsyncResult, GroupResult from celery.utils.serialization import b64decode from celery.worker.request import Request from celery.worker.strategy import hybrid_to_proto2 diff --git a/t/unit/test_migrations.py b/t/unit/test_migrations.py index 6b15492d..fd3fcc24 100644 --- a/t/unit/test_migrations.py +++ b/t/unit/test_migrations.py @@ -1,11 +1,11 @@ import os -from django.test import TestCase from django.apps import apps -from django.db.migrations.state import ProjectState from django.db.migrations.autodetector import MigrationAutodetector from django.db.migrations.loader import MigrationLoader from django.db.migrations.questioner import NonInteractiveMigrationQuestioner +from django.db.migrations.state import ProjectState +from django.test import TestCase from django_celery_results import migrations as result_migrations diff --git a/t/unit/test_models.py b/t/unit/test_models.py index c5b705b1..1a9b91e9 100644 --- a/t/unit/test_models.py +++ b/t/unit/test_models.py @@ -1,13 +1,11 @@ -import pytest - from datetime import datetime, timedelta +import pytest +from celery import states, uuid from django.db import transaction from django.test import TransactionTestCase -from celery import states, uuid - -from django_celery_results.models import TaskResult, GroupResult +from django_celery_results.models import GroupResult, TaskResult from django_celery_results.utils import now diff --git a/t/unit/test_views.py b/t/unit/test_views.py index 31426f78..b5a43345 100644 --- a/t/unit/test_views.py +++ b/t/unit/test_views.py @@ -1,18 +1,18 @@ import json -import pytest +import pytest +from celery import states, uuid +from celery.result import AsyncResult +from celery.result import GroupResult as CeleryGroupResult from django.test import TestCase from django.test.client import RequestFactory -from celery import states, uuid -from celery.result import GroupResult as CeleryGroupResult, AsyncResult - -from django_celery_results.models import TaskResult, GroupResult +from django_celery_results.models import GroupResult, TaskResult from django_celery_results.views import ( + group_status, + is_group_successful, is_task_successful, task_status, - is_group_successful, - group_status ) @@ -36,7 +36,7 @@ def create_task_result(self): def test_is_task_successful(self): taskmeta = self.create_task_result() - request = self.factory.get('/done/{}'.format(taskmeta.task_id)) + request = self.factory.get(f'/done/{taskmeta.task_id}') response = is_task_successful(request, taskmeta.task_id) assert response result = json.loads(response.content.decode('utf-8')) @@ -50,7 +50,7 @@ def test_is_task_successful(self): status=states.SUCCESS ) - request = self.factory.get('/done/{}'.format(taskmeta.task_id)) + request = self.factory.get(f'/done/{taskmeta.task_id}') response = is_task_successful(request, taskmeta.task_id) assert response result = json.loads(response.content.decode('utf-8')) @@ -58,7 +58,7 @@ def test_is_task_successful(self): def test_task_status(self): taskmeta = self.create_task_result() - request = self.factory.get('/status/{}'.format(taskmeta.task_id)) + request = self.factory.get(f'/status/{taskmeta.task_id}') response = task_status(request, taskmeta.task_id) assert response result = json.loads(response.content.decode('utf-8')) @@ -72,7 +72,7 @@ def test_task_status(self): status=states.SUCCESS ) - request = self.factory.get('/status/{}'.format(taskmeta.task_id)) + request = self.factory.get(f'/status/{taskmeta.task_id}') response = task_status(request, taskmeta.task_id) assert response result = json.loads(response.content.decode('utf-8')) @@ -93,7 +93,7 @@ def create_group_result(self): def test_is_group_successful(self): meta = self.create_group_result() - request = self.factory.get('/group/done/{}'.format(meta.group_id)) + request = self.factory.get(f'/group/done/{meta.group_id}') response = is_group_successful(request, meta.group_id) assert response @@ -104,7 +104,7 @@ def test_is_group_successful(self): def test_group_status(self): meta = self.create_group_result() - request = self.factory.get('/group/status/{}'.format(meta.group_id)) + request = self.factory.get(f'/group/status/{meta.group_id}') response = group_status(request, meta.group_id) assert response