From 4469b55d96742b4c9039ecfce309c638d6e0d8af Mon Sep 17 00:00:00 2001 From: ekmartin Date: Sat, 7 Nov 2015 04:10:49 +0100 Subject: [PATCH] Fix pep8 errors using the Django core's flake8 preset --- channels/__init__.py | 2 +- channels/apps.py | 3 ++- channels/backends/__init__.py | 10 ++++++---- channels/backends/database.py | 20 +++++++++++--------- channels/backends/memory.py | 1 + channels/backends/redis_py.py | 11 ++++++----- channels/decorators.py | 9 ++++++--- channels/management/commands/runserver.py | 1 - channels/management/commands/runworker.py | 3 ++- channels/management/commands/runwsserver.py | 2 +- channels/request.py | 1 - channels/response.py | 6 +++--- channels/tests/settings.py | 2 ++ channels/tests/test_backends.py | 1 - tox.ini | 14 ++++++++++++-- 15 files changed, 53 insertions(+), 33 deletions(-) diff --git a/channels/__init__.py b/channels/__init__.py index 923d05c..185fbc0 100644 --- a/channels/__init__.py +++ b/channels/__init__.py @@ -16,4 +16,4 @@ channel_backends = BackendManager( default_app_config = 'channels.apps.ChannelsConfig' # Promote channel to top-level (down here to avoid circular import errs) -from .channel import Channel, Group +from .channel import Channel, Group # NOQA diff --git a/channels/apps.py b/channels/apps.py index 2d31d8d..389fc99 100644 --- a/channels/apps.py +++ b/channels/apps.py @@ -1,10 +1,11 @@ from django.apps import AppConfig + class ChannelsConfig(AppConfig): name = "channels" verbose_name = "Channels" - + def ready(self): # Do django monkeypatches from .hacks import monkeypatch_django diff --git a/channels/backends/__init__.py b/channels/backends/__init__.py index 5582b73..71efe76 100644 --- a/channels/backends/__init__.py +++ b/channels/backends/__init__.py @@ -13,17 +13,19 @@ class BackendManager(object): def __init__(self, backend_configs): self.configs = backend_configs self.backends = {} - + def make_backend(self, name): # Load the backend class try: backend_class = import_string(self.configs[name]['BACKEND']) except KeyError: raise InvalidChannelBackendError("No BACKEND specified for %s" % name) - except ImportError as e: - raise InvalidChannelBackendError("Cannot import BACKEND %r specified for %s" % (self.configs[name]['BACKEND'], name)) + except ImportError: + raise InvalidChannelBackendError("Cannot import BACKEND %r specified for %s" % + (self.configs[name]['BACKEND'], name)) # Initialise and pass config - instance = backend_class(**{k.lower(): v for k, v in self.configs[name].items() if k != "BACKEND"}) + instance = backend_class( + **{k.lower(): v for k, v in self.configs[name].items() if k != "BACKEND"}) instance.alias = name return instance diff --git a/channels/backends/database.py b/channels/backends/database.py index d1514fa..d6966e9 100644 --- a/channels/backends/database.py +++ b/channels/backends/database.py @@ -1,4 +1,3 @@ -import time import json import datetime @@ -39,6 +38,7 @@ class DatabaseChannelBackend(BaseChannelBackend): channel = models.CharField(max_length=200, db_index=True) content = models.TextField() expiry = models.DateTimeField(db_index=True) + class Meta: apps = Apps() app_label = "channels" @@ -60,6 +60,7 @@ class DatabaseChannelBackend(BaseChannelBackend): group = models.CharField(max_length=200) channel = models.CharField(max_length=200) expiry = models.DateTimeField(db_index=True) + class Meta: apps = Apps() app_label = "channels" @@ -81,6 +82,7 @@ class DatabaseChannelBackend(BaseChannelBackend): class Lock(models.Model): channel = models.CharField(max_length=200, unique=True) expiry = models.DateTimeField(db_index=True) + class Meta: apps = Apps() app_label = "channels" @@ -93,9 +95,9 @@ class DatabaseChannelBackend(BaseChannelBackend): def send(self, channel, message): self.channel_model.objects.create( - channel = channel, - content = json.dumps(message), - expiry = now() + datetime.timedelta(seconds=self.expiry) + channel=channel, + content=json.dumps(message), + expiry=now() + datetime.timedelta(seconds=self.expiry) ) def receive_many(self, channels): @@ -125,9 +127,9 @@ class DatabaseChannelBackend(BaseChannelBackend): seconds (expiry defaults to message expiry if not provided). """ self.group_model.objects.update_or_create( - group = group, - channel = channel, - defaults = {"expiry": now() + datetime.timedelta(seconds=expiry or self.expiry)}, + group=group, + channel=channel, + defaults={"expiry": now() + datetime.timedelta(seconds=expiry or self.expiry)}, ) def group_discard(self, group, channel): @@ -152,8 +154,8 @@ class DatabaseChannelBackend(BaseChannelBackend): # We rely on the UNIQUE constraint for only-one-thread-wins on locks try: self.lock_model.objects.create( - channel = channel, - expiry = now() + datetime.timedelta(seconds=expiry or self.expiry), + channel=channel, + expiry=now() + datetime.timedelta(seconds=expiry or self.expiry), ) except IntegrityError: return False diff --git a/channels/backends/memory.py b/channels/backends/memory.py index 9fff16c..6f4ca4b 100644 --- a/channels/backends/memory.py +++ b/channels/backends/memory.py @@ -7,6 +7,7 @@ queues = {} groups = {} locks = set() + class InMemoryChannelBackend(BaseChannelBackend): """ In-memory channel implementation. Intended only for use with threading, diff --git a/channels/backends/redis_py.py b/channels/backends/redis_py.py index f48f799..b0071f6 100644 --- a/channels/backends/redis_py.py +++ b/channels/backends/redis_py.py @@ -1,6 +1,5 @@ import time import json -import datetime import math import redis import random @@ -64,7 +63,11 @@ class RedisChannelBackend(BaseChannelBackend): def send(self, channel, message): # if channel is no str (=> bytes) convert it if not isinstance(channel, str): - channel = channel.decode('utf-8') + channel = channel.decode("utf-8") + # Write out message into expiring key (avoids big items in list) + # TODO: Use extended set, drop support for older redis? + key = self.prefix + uuid.uuid4().hex + # Pick a connection to the right server - consistent for response # channels, random for normal channels if channel.startswith("!"): @@ -72,9 +75,7 @@ class RedisChannelBackend(BaseChannelBackend): connection = self.connection(index) else: connection = self.connection(None) - # Write out message into expiring key (avoids big items in list) - # TODO: Use extended set, drop support for older redis? - key = self.prefix + uuid.uuid4().hex + connection.set( key, json.dumps(message), diff --git a/channels/decorators.py b/channels/decorators.py index 7c28143..6b0ca7e 100644 --- a/channels/decorators.py +++ b/channels/decorators.py @@ -18,7 +18,8 @@ def linearize(func): def inner(message, *args, **kwargs): # Make sure there's a reply channel if not message.reply_channel: - raise ValueError("No reply_channel sent to consumer; @no_overlap can only be used on messages containing it.") + raise ValueError("No reply_channel sent to consumer; " + "@no_overlap can only be used on messages containing it.") # Get the lock, or re-queue locked = message.channel_backend.lock_channel(message.reply_channel) if not locked: @@ -43,10 +44,12 @@ def channel_session(func): def inner(message, *args, **kwargs): # Make sure there's a reply_channel if not message.reply_channel: - raise ValueError("No reply_channel sent to consumer; @channel_session can only be used on messages containing it.") + raise ValueError("No reply_channel sent to consumer; " + "@channel_session can only be used on messages containing it.") # Make sure there's NOT a channel_session already if hasattr(message, "channel_session"): - raise ValueError("channel_session decorator wrapped inside another channel_session decorator") + raise ValueError("channel_session decorator wrapped " + "inside another channel_session decorator") # Turn the reply_channel into a valid session key length thing. # We take the last 24 bytes verbatim, as these are the random section, # and then hash the remaining ones onto the start, and add a prefix diff --git a/channels/management/commands/runserver.py b/channels/management/commands/runserver.py index 25be5d8..d9e91ea 100644 --- a/channels/management/commands/runserver.py +++ b/channels/management/commands/runserver.py @@ -1,7 +1,6 @@ import threading from django.core.management.commands.runserver import Command as RunserverCommand - from channels import channel_backends, DEFAULT_CHANNEL_BACKEND from channels.adapters import UrlConsumer from channels.interfaces.wsgi import WSGIInterface diff --git a/channels/management/commands/runworker.py b/channels/management/commands/runworker.py index 721e42f..1c7df73 100644 --- a/channels/management/commands/runworker.py +++ b/channels/management/commands/runworker.py @@ -14,7 +14,8 @@ class Command(BaseCommand): channel_backend = channel_backends[DEFAULT_CHANNEL_BACKEND] if channel_backend.local_only: raise CommandError( - "You have a process-local channel backend configured, and so cannot run separate workers.\n" + "You have a process-local channel backend configured, " + "and so cannot run separate workers.\n" "Configure a network-based backend in CHANNEL_BACKENDS to use this command." ) # Launch a worker diff --git a/channels/management/commands/runwsserver.py b/channels/management/commands/runwsserver.py index 72e3cb7..fae1e2c 100644 --- a/channels/management/commands/runwsserver.py +++ b/channels/management/commands/runwsserver.py @@ -23,7 +23,7 @@ class Command(BaseCommand): # Run the interface port = int(options.get("port", None) or 9000) try: - import asyncio + import asyncio # NOQA except ImportError: from channels.interfaces.websocket_twisted import WebsocketTwistedInterface self.logger.info("Running Twisted/Autobahn WebSocket interface server") diff --git a/channels/request.py b/channels/request.py index 2af4098..e29d711 100644 --- a/channels/request.py +++ b/channels/request.py @@ -1,7 +1,6 @@ from django.http import HttpRequest from django.utils.datastructures import MultiValueDict from django.http.request import QueryDict -from django.conf import settings def encode_request(request): diff --git a/channels/response.py b/channels/response.py index 4b253d7..f484da7 100644 --- a/channels/response.py +++ b/channels/response.py @@ -24,9 +24,9 @@ def decode_response(value): Decodes a response JSONish value to a HttpResponse object. """ response = HttpResponse( - content = value['content'], - content_type = value['content_type'], - status = value['status'], + content=value['content'], + content_type=value['content_type'], + status=value['status'], ) for cookie in value['cookies']: response.cookies.load(cookie) diff --git a/channels/tests/settings.py b/channels/tests/settings.py index e1c7f80..c472c7e 100644 --- a/channels/tests/settings.py +++ b/channels/tests/settings.py @@ -5,3 +5,5 @@ DATABASES = { 'ENGINE': 'django.db.backends.sqlite3', } } + +MIDDLEWARE_CLASSES = [] diff --git a/channels/tests/test_backends.py b/channels/tests/test_backends.py index c2cbba6..90089fd 100644 --- a/channels/tests/test_backends.py +++ b/channels/tests/test_backends.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals from django.test import TestCase -from ..channel import Channel from ..backends.database import DatabaseChannelBackend from ..backends.redis_py import RedisChannelBackend from ..backends.memory import InMemoryChannelBackend diff --git a/tox.ini b/tox.ini index 18142eb..ab262df 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,14 @@ [tox] skipsdist = True envlist = - {py27,py35}-django-{16,17,18} + {py27}-django-{17,18,19} + {py35}-django-{18,19} + {py27,py35}-flake8 + +[flake8] +exclude = venv/*,tox/*,docs/* +ignore = E123,E128,E402,W503,E731,W601 +max-line-length = 119 [testenv] setenv = @@ -9,8 +16,11 @@ setenv = deps = six redis==2.10.5 + flake8: flake8 django-16: Django>=1.6,<1.7 django-17: Django>=1.7,<1.8 django-18: Django>=1.8,<1.9 + django-19: Django==1.9b1 commands = - python {toxinidir}/runtests.py + flake8: flake8 + django: python {toxinidir}/runtests.py