summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--setup.py2
-rw-r--r--src/mailman/app/tests/test_lifecycle.py2
-rw-r--r--src/mailman/app/tests/test_subscriptions.py4
-rw-r--r--src/mailman/archiving/tests/test_mhonarc.py2
-rw-r--r--src/mailman/archiving/tests/test_prototype.py3
-rw-r--r--src/mailman/commands/cli_import.py2
-rw-r--r--src/mailman/commands/tests/test_control.py4
-rw-r--r--src/mailman/database/alembic/env.py2
-rw-r--r--src/mailman/database/alembic/versions/16c2b25c7b_list_subscription_policy.py4
-rw-r--r--src/mailman/database/alembic/versions/42756496720_header_matches.py2
-rw-r--r--src/mailman/database/alembic/versions/46e92facee7_add_serverowner_domainowner.py2
-rw-r--r--src/mailman/database/alembic/versions/51b7f92bd06c_initial.py2
-rw-r--r--src/mailman/database/tests/test_factory.py4
-rw-r--r--src/mailman/database/types.py2
-rw-r--r--src/mailman/handlers/rfc_2369.py2
-rw-r--r--src/mailman/interfaces/address.py2
-rw-r--r--src/mailman/interfaces/archiver.py2
-rw-r--r--src/mailman/interfaces/autorespond.py2
-rw-r--r--src/mailman/interfaces/chain.py2
-rw-r--r--src/mailman/interfaces/command.py2
-rw-r--r--src/mailman/interfaces/digests.py2
-rw-r--r--src/mailman/interfaces/domain.py2
-rw-r--r--src/mailman/interfaces/languages.py2
-rw-r--r--src/mailman/interfaces/listmanager.py2
-rw-r--r--src/mailman/interfaces/mailinglist.py2
-rw-r--r--src/mailman/interfaces/member.py2
-rw-r--r--src/mailman/interfaces/messages.py2
-rw-r--r--src/mailman/interfaces/mime.py2
-rw-r--r--src/mailman/interfaces/mlistrequest.py2
-rw-r--r--src/mailman/interfaces/pending.py2
-rw-r--r--src/mailman/interfaces/pipeline.py2
-rw-r--r--src/mailman/interfaces/preferences.py2
-rw-r--r--src/mailman/interfaces/requests.py2
-rw-r--r--src/mailman/interfaces/roster.py2
-rw-r--r--src/mailman/interfaces/rules.py2
-rw-r--r--src/mailman/interfaces/runner.py2
-rw-r--r--src/mailman/interfaces/styles.py2
-rw-r--r--src/mailman/interfaces/switchboard.py2
-rw-r--r--src/mailman/interfaces/system.py2
-rw-r--r--src/mailman/interfaces/user.py2
-rw-r--r--src/mailman/interfaces/usermanager.py2
-rw-r--r--src/mailman/model/domain.py2
-rw-r--r--src/mailman/model/subscriptions.py2
-rw-r--r--src/mailman/model/tests/test_listmanager.py2
-rw-r--r--src/mailman/rest/lists.py2
-rw-r--r--src/mailman/rest/queues.py2
-rw-r--r--src/mailman/rest/tests/test_bans.py2
-rw-r--r--src/mailman/rest/tests/test_membership.py2
-rw-r--r--src/mailman/rest/tests/test_users.py2
-rw-r--r--src/mailman/rest/tests/test_validator.py2
-rw-r--r--src/mailman/rest/wsgiapp.py4
-rw-r--r--src/mailman/runners/archive.py4
-rw-r--r--src/mailman/runners/tests/test_lmtp.py2
-rw-r--r--src/mailman/runners/tests/test_owner.py4
-rw-r--r--src/mailman/testing/flake8.py88
-rw-r--r--src/mailman/utilities/importer.py5
56 files changed, 148 insertions, 68 deletions
diff --git a/setup.py b/setup.py
index 5791d0c7c..94d56af43 100644
--- a/setup.py
+++ b/setup.py
@@ -101,7 +101,7 @@ case second `m'. Any other spelling is incorrect.""",
include_package_data = True,
entry_points = {
'console_scripts' : list(scripts),
- 'flake8.extension': ['MM40 = mailman.testing.flake8:ImportOrder'],
+ 'flake8.extension': ['B40 = mailman.testing.flake8:ImportOrder'],
},
install_requires = [
'alembic',
diff --git a/src/mailman/app/tests/test_lifecycle.py b/src/mailman/app/tests/test_lifecycle.py
index d4ad067d2..a3a186f6f 100644
--- a/src/mailman/app/tests/test_lifecycle.py
+++ b/src/mailman/app/tests/test_lifecycle.py
@@ -21,10 +21,10 @@ import os
import shutil
import unittest
+from mailman.app.lifecycle import create_list, remove_list
from mailman.interfaces.address import InvalidEmailAddressError
from mailman.interfaces.domain import BadDomainSpecificationError
from mailman.interfaces.listmanager import IListManager
-from mailman.app.lifecycle import create_list, remove_list
from mailman.testing.layers import ConfigLayer
from zope.component import getUtility
diff --git a/src/mailman/app/tests/test_subscriptions.py b/src/mailman/app/tests/test_subscriptions.py
index 02b5fe6da..1139591de 100644
--- a/src/mailman/app/tests/test_subscriptions.py
+++ b/src/mailman/app/tests/test_subscriptions.py
@@ -22,14 +22,14 @@ import unittest
from mailman.app.lifecycle import create_list
from mailman.app.subscriptions import SubscriptionWorkflow
from mailman.interfaces.bans import IBanManager
+from mailman.interfaces.mailinglist import SubscriptionPolicy
from mailman.interfaces.member import MembershipIsBannedError
from mailman.interfaces.pending import IPendings
from mailman.interfaces.subscriptions import TokenOwner
+from mailman.interfaces.usermanager import IUserManager
from mailman.testing.helpers import (
LogFileMark, get_queue_messages, set_preferred)
from mailman.testing.layers import ConfigLayer
-from mailman.interfaces.mailinglist import SubscriptionPolicy
-from mailman.interfaces.usermanager import IUserManager
from mailman.utilities.datetime import now
from unittest.mock import patch
from zope.component import getUtility
diff --git a/src/mailman/archiving/tests/test_mhonarc.py b/src/mailman/archiving/tests/test_mhonarc.py
index 803875bd4..993a14c1c 100644
--- a/src/mailman/archiving/tests/test_mhonarc.py
+++ b/src/mailman/archiving/tests/test_mhonarc.py
@@ -23,8 +23,8 @@ import shutil
import tempfile
import unittest
-from mailman.archiving.mhonarc import MHonArc
from mailman.app.lifecycle import create_list
+from mailman.archiving.mhonarc import MHonArc
from mailman.database.transaction import transaction
from mailman.testing.helpers import (
configuration, specialized_message_from_string as mfs)
diff --git a/src/mailman/archiving/tests/test_prototype.py b/src/mailman/archiving/tests/test_prototype.py
index 54fbc06af..32dec0729 100644
--- a/src/mailman/archiving/tests/test_prototype.py
+++ b/src/mailman/archiving/tests/test_prototype.py
@@ -29,9 +29,8 @@ from mailman.app.lifecycle import create_list
from mailman.archiving.prototype import Prototype
from mailman.config import config
from mailman.database.transaction import transaction
-from mailman.testing.helpers import LogFileMark
from mailman.testing.helpers import (
- specialized_message_from_string as mfs)
+ LogFileMark, specialized_message_from_string as mfs)
from mailman.testing.layers import ConfigLayer
from mailman.utilities.email import add_message_hash
diff --git a/src/mailman/commands/cli_import.py b/src/mailman/commands/cli_import.py
index ecb879a5a..126c026d0 100644
--- a/src/mailman/commands/cli_import.py
+++ b/src/mailman/commands/cli_import.py
@@ -26,7 +26,7 @@ from mailman.core.i18n import _
from mailman.database.transaction import transactional
from mailman.interfaces.command import ICLISubCommand
from mailman.interfaces.listmanager import IListManager
-from mailman.utilities.importer import import_config_pck, Import21Error
+from mailman.utilities.importer import Import21Error, import_config_pck
from zope.component import getUtility
from zope.interface import implementer
diff --git a/src/mailman/commands/tests/test_control.py b/src/mailman/commands/tests/test_control.py
index b25c63185..26d921cd7 100644
--- a/src/mailman/commands/tests/test_control.py
+++ b/src/mailman/commands/tests/test_control.py
@@ -21,13 +21,13 @@ import os
import sys
import time
import errno
-import signal
import shutil
+import signal
import socket
import unittest
from contextlib import ExitStack, suppress
-from datetime import timedelta, datetime
+from datetime import datetime, timedelta
from mailman.commands.cli_control import Start, kill_watcher
from mailman.config import Configuration, config
from mailman.testing.helpers import configuration
diff --git a/src/mailman/database/alembic/env.py b/src/mailman/database/alembic/env.py
index 7cda59e82..e97b05d5c 100644
--- a/src/mailman/database/alembic/env.py
+++ b/src/mailman/database/alembic/env.py
@@ -20,8 +20,8 @@
from alembic import context
from contextlib import closing
from mailman import public
-from mailman.core.initialize import initialize_1
from mailman.config import config
+from mailman.core.initialize import initialize_1
from mailman.database.model import Model
from mailman.utilities.string import expand
from sqlalchemy import create_engine
diff --git a/src/mailman/database/alembic/versions/16c2b25c7b_list_subscription_policy.py b/src/mailman/database/alembic/versions/16c2b25c7b_list_subscription_policy.py
index 1358b99aa..fef188bd0 100644
--- a/src/mailman/database/alembic/versions/16c2b25c7b_list_subscription_policy.py
+++ b/src/mailman/database/alembic/versions/16c2b25c7b_list_subscription_policy.py
@@ -6,11 +6,11 @@ Create Date: 2015-03-21 11:00:44.634883
"""
-from alembic import op
import sqlalchemy as sa
+from alembic import op
+from mailman.database.helpers import exists_in_db, is_sqlite
from mailman.database.types import Enum
-from mailman.database.helpers import is_sqlite, exists_in_db
from mailman.interfaces.mailinglist import SubscriptionPolicy
diff --git a/src/mailman/database/alembic/versions/42756496720_header_matches.py b/src/mailman/database/alembic/versions/42756496720_header_matches.py
index d197d5959..4514fb398 100644
--- a/src/mailman/database/alembic/versions/42756496720_header_matches.py
+++ b/src/mailman/database/alembic/versions/42756496720_header_matches.py
@@ -9,7 +9,7 @@ Create Date: 2015-09-11 10:11:38.310315
import sqlalchemy as sa
from alembic import op
-from mailman.database.helpers import is_sqlite, exists_in_db
+from mailman.database.helpers import exists_in_db, is_sqlite
# Revision identifiers, used by Alembic.
diff --git a/src/mailman/database/alembic/versions/46e92facee7_add_serverowner_domainowner.py b/src/mailman/database/alembic/versions/46e92facee7_add_serverowner_domainowner.py
index 01a08d7d2..1c689670a 100644
--- a/src/mailman/database/alembic/versions/46e92facee7_add_serverowner_domainowner.py
+++ b/src/mailman/database/alembic/versions/46e92facee7_add_serverowner_domainowner.py
@@ -26,7 +26,7 @@ Create Date: 2015-03-20 16:01:25.007242
import sqlalchemy as sa
from alembic import op
-from mailman.database.helpers import is_sqlite, exists_in_db
+from mailman.database.helpers import exists_in_db, is_sqlite
# Revision identifiers, used by Alembic.
diff --git a/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py b/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py
index 6252e1f23..aa7ea765d 100644
--- a/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py
+++ b/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py
@@ -32,7 +32,7 @@ Create Date: 2014-10-10 09:53:35.624472
import sqlalchemy as sa
from alembic import op
-from mailman.database.helpers import is_sqlite, exists_in_db
+from mailman.database.helpers import exists_in_db, is_sqlite
# Revision identifiers, used by Alembic.
diff --git a/src/mailman/database/tests/test_factory.py b/src/mailman/database/tests/test_factory.py
index 0c2e595c9..d8593cc76 100644
--- a/src/mailman/database/tests/test_factory.py
+++ b/src/mailman/database/tests/test_factory.py
@@ -26,8 +26,8 @@ from mailman.database.factory import LAST_STORM_SCHEMA_VERSION, SchemaManager
from mailman.database.model import Model
from mailman.interfaces.database import DatabaseError
from mailman.testing.layers import ConfigLayer
-from sqlalchemy import MetaData, Table, Column, Integer, Unicode
-from sqlalchemy.exc import ProgrammingError, OperationalError
+from sqlalchemy import Column, Integer, MetaData, Table, Unicode
+from sqlalchemy.exc import OperationalError, ProgrammingError
from sqlalchemy.schema import Index
from unittest.mock import patch
diff --git a/src/mailman/database/types.py b/src/mailman/database/types.py
index 343ee0461..28b261514 100644
--- a/src/mailman/database/types.py
+++ b/src/mailman/database/types.py
@@ -22,7 +22,7 @@ import uuid
from mailman import public
from sqlalchemy import Integer
from sqlalchemy.dialects import postgresql
-from sqlalchemy.types import TypeDecorator, CHAR
+from sqlalchemy.types import CHAR, TypeDecorator
@public
diff --git a/src/mailman/handlers/rfc_2369.py b/src/mailman/handlers/rfc_2369.py
index 3daf6414d..59c618da8 100644
--- a/src/mailman/handlers/rfc_2369.py
+++ b/src/mailman/handlers/rfc_2369.py
@@ -24,8 +24,8 @@ from mailman import public
from mailman.core.i18n import _
from mailman.handlers.cook_headers import uheader
from mailman.interfaces.archiver import ArchivePolicy
-from mailman.interfaces.mailinglist import IListArchiverSet
from mailman.interfaces.handler import IHandler
+from mailman.interfaces.mailinglist import IListArchiverSet
from zope.interface import implementer
diff --git a/src/mailman/interfaces/address.py b/src/mailman/interfaces/address.py
index 19a9d930c..8a1ac81d5 100644
--- a/src/mailman/interfaces/address.py
+++ b/src/mailman/interfaces/address.py
@@ -19,7 +19,7 @@
from mailman import public
from mailman.interfaces.errors import MailmanError
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/archiver.py b/src/mailman/interfaces/archiver.py
index 9a210d74e..cd10b22e3 100644
--- a/src/mailman/interfaces/archiver.py
+++ b/src/mailman/interfaces/archiver.py
@@ -19,7 +19,7 @@
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/autorespond.py b/src/mailman/interfaces/autorespond.py
index 7f6d44711..a67cf6aaf 100644
--- a/src/mailman/interfaces/autorespond.py
+++ b/src/mailman/interfaces/autorespond.py
@@ -20,7 +20,7 @@
from datetime import timedelta
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
ALWAYS_REPLY = timedelta()
diff --git a/src/mailman/interfaces/chain.py b/src/mailman/interfaces/chain.py
index 3fccb4090..0af9bf8e5 100644
--- a/src/mailman/interfaces/chain.py
+++ b/src/mailman/interfaces/chain.py
@@ -19,7 +19,7 @@
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/command.py b/src/mailman/interfaces/command.py
index 76bf8aa1c..95719b504 100644
--- a/src/mailman/interfaces/command.py
+++ b/src/mailman/interfaces/command.py
@@ -19,7 +19,7 @@
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/digests.py b/src/mailman/interfaces/digests.py
index 0bff36ec4..cff838284 100644
--- a/src/mailman/interfaces/digests.py
+++ b/src/mailman/interfaces/digests.py
@@ -19,7 +19,7 @@
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/domain.py b/src/mailman/interfaces/domain.py
index eef391071..7be5909a9 100644
--- a/src/mailman/interfaces/domain.py
+++ b/src/mailman/interfaces/domain.py
@@ -19,7 +19,7 @@
from mailman import public
from mailman.interfaces.errors import MailmanError
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/languages.py b/src/mailman/interfaces/languages.py
index 129b5e1df..b45083575 100644
--- a/src/mailman/interfaces/languages.py
+++ b/src/mailman/interfaces/languages.py
@@ -18,7 +18,7 @@
"""Interfaces for managing languages."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/listmanager.py b/src/mailman/interfaces/listmanager.py
index 0887248b2..fddec06c8 100644
--- a/src/mailman/interfaces/listmanager.py
+++ b/src/mailman/interfaces/listmanager.py
@@ -19,7 +19,7 @@
from mailman import public
from mailman.interfaces.errors import MailmanError
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/mailinglist.py b/src/mailman/interfaces/mailinglist.py
index 4ccf97a6d..911d958f5 100644
--- a/src/mailman/interfaces/mailinglist.py
+++ b/src/mailman/interfaces/mailinglist.py
@@ -20,7 +20,7 @@
from enum import Enum
from mailman import public
from mailman.interfaces.member import MemberRole
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/member.py b/src/mailman/interfaces/member.py
index dd8d3f383..367838e21 100644
--- a/src/mailman/interfaces/member.py
+++ b/src/mailman/interfaces/member.py
@@ -20,7 +20,7 @@
from enum import Enum
from mailman import public
from mailman.interfaces.errors import MailmanError
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/messages.py b/src/mailman/interfaces/messages.py
index cd05722c9..2ea2aa312 100644
--- a/src/mailman/interfaces/messages.py
+++ b/src/mailman/interfaces/messages.py
@@ -18,7 +18,7 @@
"""The message storage service."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/mime.py b/src/mailman/interfaces/mime.py
index e30354cd9..c1a6e050f 100644
--- a/src/mailman/interfaces/mime.py
+++ b/src/mailman/interfaces/mime.py
@@ -19,7 +19,7 @@
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/mlistrequest.py b/src/mailman/interfaces/mlistrequest.py
index 731caf147..45712ed86 100644
--- a/src/mailman/interfaces/mlistrequest.py
+++ b/src/mailman/interfaces/mlistrequest.py
@@ -18,7 +18,7 @@
"""Interface for a web request accessing a mailing list."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/pending.py b/src/mailman/interfaces/pending.py
index b7621cbe2..cf92fed9e 100644
--- a/src/mailman/interfaces/pending.py
+++ b/src/mailman/interfaces/pending.py
@@ -23,7 +23,7 @@ confirmation.
"""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/pipeline.py b/src/mailman/interfaces/pipeline.py
index 5e39c2a3e..cdef6a768 100644
--- a/src/mailman/interfaces/pipeline.py
+++ b/src/mailman/interfaces/pipeline.py
@@ -18,7 +18,7 @@
"""Interface for describing pipelines."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
# For i18n extraction.
diff --git a/src/mailman/interfaces/preferences.py b/src/mailman/interfaces/preferences.py
index b3690ac35..4b5b490cb 100644
--- a/src/mailman/interfaces/preferences.py
+++ b/src/mailman/interfaces/preferences.py
@@ -18,7 +18,7 @@
"""Interface for preferences."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/requests.py b/src/mailman/interfaces/requests.py
index be164183e..3098772a9 100644
--- a/src/mailman/interfaces/requests.py
+++ b/src/mailman/interfaces/requests.py
@@ -23,7 +23,7 @@ moderators, such as subscription requests and held messages.
from enum import Enum
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/roster.py b/src/mailman/interfaces/roster.py
index 5ad36847b..2993e4fc4 100644
--- a/src/mailman/interfaces/roster.py
+++ b/src/mailman/interfaces/roster.py
@@ -18,7 +18,7 @@
"""Interface for a roster of members."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/rules.py b/src/mailman/interfaces/rules.py
index 7093da5a7..9f5f1365e 100644
--- a/src/mailman/interfaces/rules.py
+++ b/src/mailman/interfaces/rules.py
@@ -18,7 +18,7 @@
"""Interface describing the basics of rules."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/runner.py b/src/mailman/interfaces/runner.py
index aed8edddf..e39efb097 100644
--- a/src/mailman/interfaces/runner.py
+++ b/src/mailman/interfaces/runner.py
@@ -18,7 +18,7 @@
"""Interface for runners."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/styles.py b/src/mailman/interfaces/styles.py
index 5629af5d4..a183933f7 100644
--- a/src/mailman/interfaces/styles.py
+++ b/src/mailman/interfaces/styles.py
@@ -19,7 +19,7 @@
from mailman import public
from mailman.interfaces.errors import MailmanError
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/switchboard.py b/src/mailman/interfaces/switchboard.py
index 30dd62843..4428f4b12 100644
--- a/src/mailman/interfaces/switchboard.py
+++ b/src/mailman/interfaces/switchboard.py
@@ -18,7 +18,7 @@
"""Interface for switchboards."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/system.py b/src/mailman/interfaces/system.py
index 95e92b20c..1b0a9a2de 100644
--- a/src/mailman/interfaces/system.py
+++ b/src/mailman/interfaces/system.py
@@ -18,7 +18,7 @@
"""System information."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/user.py b/src/mailman/interfaces/user.py
index f80b51583..f1932fd7f 100644
--- a/src/mailman/interfaces/user.py
+++ b/src/mailman/interfaces/user.py
@@ -19,7 +19,7 @@
from mailman import public
from mailman.interfaces.address import AddressError
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/interfaces/usermanager.py b/src/mailman/interfaces/usermanager.py
index 3cd18bd20..87d4bf6e2 100644
--- a/src/mailman/interfaces/usermanager.py
+++ b/src/mailman/interfaces/usermanager.py
@@ -18,7 +18,7 @@
"""Interface describing the user management service."""
from mailman import public
-from zope.interface import Interface, Attribute
+from zope.interface import Attribute, Interface
@public
diff --git a/src/mailman/model/domain.py b/src/mailman/model/domain.py
index 8607f0d94..e137da310 100644
--- a/src/mailman/model/domain.py
+++ b/src/mailman/model/domain.py
@@ -26,9 +26,9 @@ from mailman.interfaces.domain import (
from mailman.interfaces.user import IUser
from mailman.interfaces.usermanager import IUserManager
from mailman.model.mailinglist import MailingList
-from urllib.parse import urljoin, urlparse
from sqlalchemy import Column, Integer, Unicode
from sqlalchemy.orm import relationship
+from urllib.parse import urljoin, urlparse
from zope.event import notify
from zope.interface import implementer
from zope.component import getUtility
diff --git a/src/mailman/model/subscriptions.py b/src/mailman/model/subscriptions.py
index 1591a3adf..3d2bcbeb0 100644
--- a/src/mailman/model/subscriptions.py
+++ b/src/mailman/model/subscriptions.py
@@ -29,7 +29,7 @@ from mailman.model.member import Member
from mailman.model.user import User
from mailman.utilities.queries import QuerySequence
from operator import attrgetter
-from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
+from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound
from zope.component import getUtility
from zope.interface import implementer
diff --git a/src/mailman/model/tests/test_listmanager.py b/src/mailman/model/tests/test_listmanager.py
index 464ebfc52..a8ac68c92 100644
--- a/src/mailman/model/tests/test_listmanager.py
+++ b/src/mailman/model/tests/test_listmanager.py
@@ -22,8 +22,8 @@ import unittest
from mailman.app.lifecycle import create_list
from mailman.app.moderator import hold_message
from mailman.config import config
-from mailman.interfaces.autorespond import IAutoResponseSet, Response
from mailman.interfaces.address import InvalidEmailAddressError
+from mailman.interfaces.autorespond import IAutoResponseSet, Response
from mailman.interfaces.listmanager import (
IListManager, ListAlreadyExistsError, ListCreatedEvent, ListCreatingEvent,
ListDeletedEvent, ListDeletingEvent)
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 2d669a267..7315d805a 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -31,11 +31,11 @@ from mailman.interfaces.member import MemberRole
from mailman.interfaces.styles import IStyleManager
from mailman.interfaces.subscriptions import ISubscriptionService
from mailman.rest.bans import BannedEmails
-from mailman.rest.listconf import ListConfiguration
from mailman.rest.header_matches import HeaderMatches
from mailman.rest.helpers import (
CollectionMixin, GetterSetter, NotFound, accepted, bad_request, child,
created, etag, no_content, not_found, okay)
+from mailman.rest.listconf import ListConfiguration
from mailman.rest.members import AMember, MemberCollection
from mailman.rest.post_moderation import HeldMessages
from mailman.rest.sub_moderation import SubscriptionRequests
diff --git a/src/mailman/rest/queues.py b/src/mailman/rest/queues.py
index 69f6df973..9fa5b9dc6 100644
--- a/src/mailman/rest/queues.py
+++ b/src/mailman/rest/queues.py
@@ -18,8 +18,8 @@
"""<api>/queues."""
from mailman import public
-from mailman.config import config
from mailman.app.inject import inject_text
+from mailman.config import config
from mailman.interfaces.listmanager import IListManager
from mailman.rest.helpers import (
CollectionMixin, bad_request, created, etag, no_content, not_found, okay)
diff --git a/src/mailman/rest/tests/test_bans.py b/src/mailman/rest/tests/test_bans.py
index e6159d9a4..fc096fa1b 100644
--- a/src/mailman/rest/tests/test_bans.py
+++ b/src/mailman/rest/tests/test_bans.py
@@ -22,8 +22,8 @@ import unittest
from mailman.app.lifecycle import create_list
from mailman.database.transaction import transaction
from mailman.interfaces.bans import IBanManager
-from mailman.testing.layers import RESTLayer
from mailman.testing.helpers import call_api
+from mailman.testing.layers import RESTLayer
from urllib.error import HTTPError
diff --git a/src/mailman/rest/tests/test_membership.py b/src/mailman/rest/tests/test_membership.py
index 3d47b13a7..1ea70e90b 100644
--- a/src/mailman/rest/tests/test_membership.py
+++ b/src/mailman/rest/tests/test_membership.py
@@ -28,10 +28,10 @@ from mailman.interfaces.member import DeliveryMode, MemberRole
from mailman.interfaces.registrar import IRegistrar
from mailman.interfaces.subscriptions import TokenOwner
from mailman.interfaces.usermanager import IUserManager
+from mailman.runners.incoming import IncomingRunner
from mailman.testing.helpers import (
TestableMaster, call_api, get_lmtp_client, make_testable_runner,
set_preferred, subscribe, wait_for_webservice)
-from mailman.runners.incoming import IncomingRunner
from mailman.testing.layers import ConfigLayer, RESTLayer
from mailman.utilities.datetime import now
from urllib.error import HTTPError
diff --git a/src/mailman/rest/tests/test_users.py b/src/mailman/rest/tests/test_users.py
index e42bdf623..890f1df3f 100644
--- a/src/mailman/rest/tests/test_users.py
+++ b/src/mailman/rest/tests/test_users.py
@@ -25,11 +25,11 @@ from mailman.config import config
from mailman.database.transaction import transaction
from mailman.interfaces.member import DeliveryMode
from mailman.interfaces.usermanager import IUserManager
+from mailman.model.preferences import Preferences
from mailman.testing.helpers import call_api, configuration
from mailman.testing.layers import RESTLayer
from urllib.error import HTTPError
from zope.component import getUtility
-from mailman.model.preferences import Preferences
class TestUsers(unittest.TestCase):
diff --git a/src/mailman/rest/tests/test_validator.py b/src/mailman/rest/tests/test_validator.py
index de2207108..5da4349d2 100644
--- a/src/mailman/rest/tests/test_validator.py
+++ b/src/mailman/rest/tests/test_validator.py
@@ -19,8 +19,8 @@
import unittest
-from mailman.interfaces.usermanager import IUserManager
from mailman.core.api import API30, API31
+from mailman.interfaces.usermanager import IUserManager
from mailman.rest.validator import (
list_of_strings_validator, subscriber_validator)
from mailman.testing.layers import RESTLayer
diff --git a/src/mailman/rest/wsgiapp.py b/src/mailman/rest/wsgiapp.py
index 6184da4ee..2c22948bb 100644
--- a/src/mailman/rest/wsgiapp.py
+++ b/src/mailman/rest/wsgiapp.py
@@ -27,8 +27,8 @@ from mailman import public
from mailman.config import config
from mailman.database.transaction import transactional
from mailman.rest.root import Root
-from wsgiref.simple_server import WSGIRequestHandler, WSGIServer
-from wsgiref.simple_server import make_server as wsgi_server
+from wsgiref.simple_server import (
+ WSGIRequestHandler, WSGIServer, make_server as wsgi_server)
log = logging.getLogger('mailman.http')
diff --git a/src/mailman/runners/archive.py b/src/mailman/runners/archive.py
index cfa0b1a12..7bf655a24 100644
--- a/src/mailman/runners/archive.py
+++ b/src/mailman/runners/archive.py
@@ -20,15 +20,15 @@
import copy
import logging
-from email.utils import parsedate_tz, mktime_tz
from datetime import datetime
+from email.utils import parsedate_tz, mktime_tz
from lazr.config import as_timedelta
from mailman import public
from mailman.config import config
from mailman.core.runner import Runner
from mailman.interfaces.archiver import ClobberDate
-from mailman.utilities.datetime import RFC822_DATE_FMT, now
from mailman.interfaces.mailinglist import IListArchiverSet
+from mailman.utilities.datetime import RFC822_DATE_FMT, now
log = logging.getLogger('mailman.archiver')
diff --git a/src/mailman/runners/tests/test_lmtp.py b/src/mailman/runners/tests/test_lmtp.py
index 9d86af2dc..b4f810947 100644
--- a/src/mailman/runners/tests/test_lmtp.py
+++ b/src/mailman/runners/tests/test_lmtp.py
@@ -22,8 +22,8 @@ import smtplib
import unittest
from datetime import datetime
-from mailman.config import config
from mailman.app.lifecycle import create_list
+from mailman.config import config
from mailman.database.transaction import transaction
from mailman.testing.helpers import get_lmtp_client, get_queue_messages
from mailman.testing.layers import LMTPLayer
diff --git a/src/mailman/runners/tests/test_owner.py b/src/mailman/runners/tests/test_owner.py
index 48ccaaba0..1aa430b28 100644
--- a/src/mailman/runners/tests/test_owner.py
+++ b/src/mailman/runners/tests/test_owner.py
@@ -29,11 +29,11 @@ from mailman.config import config
from mailman.database.transaction import transaction
from mailman.interfaces.member import MemberRole
from mailman.interfaces.usermanager import IUserManager
-from mailman.testing.helpers import (
- TestableMaster, get_lmtp_client, make_testable_runner)
from mailman.runners.incoming import IncomingRunner
from mailman.runners.outgoing import OutgoingRunner
from mailman.runners.pipeline import PipelineRunner
+from mailman.testing.helpers import (
+ TestableMaster, get_lmtp_client, make_testable_runner)
from mailman.testing.layers import SMTPLayer
from operator import itemgetter
from zope.component import getUtility
diff --git a/src/mailman/testing/flake8.py b/src/mailman/testing/flake8.py
index d002e8b6c..df4e39c90 100644
--- a/src/mailman/testing/flake8.py
+++ b/src/mailman/testing/flake8.py
@@ -19,17 +19,39 @@
from ast import NodeVisitor
+from collections import namedtuple
+from enum import Enum
+
+
+class ImportType(Enum):
+ non_from = 0
+ from_import = 1
+
+
+ImportRecord = namedtuple('ImportRecord', 'itype lineno colno, module, names')
class ImportVisitor(NodeVisitor):
def __init__(self):
- self.last_import = None
+ self.imports = []
def visit_Import(self, node):
if node.col_offset != 0:
# Ignore nested imports.
return
-
+ names = [alias.name for alias in node.names]
+ self.imports.append(
+ ImportRecord(ImportType.non_from, node.lineno, node.col_offset,
+ None, names))
+
+ def visit_ImportFrom(self, node):
+ if node.col_offset != 0:
+ # Ignore nested imports.
+ return
+ names = [alias.name for alias in node.names]
+ self.imports.append(
+ ImportRecord(ImportType.from_import, node.lineno, node.col_offset,
+ node.module, names))
class ImportOrder:
@@ -40,5 +62,65 @@ class ImportOrder:
self.tree = tree
self.filename = filename
+ def _error(self, record, code, text):
+ return (record.lineno, record.colno,
+ '{} {}'.format(code, text), ImportOrder)
+
def run(self):
- print('Running', self.name, self.version)
+ visitor = ImportVisitor()
+ visitor.visit(self.tree)
+ last_import = None
+ for record in visitor.imports:
+ if last_import is None:
+ last_import = record
+ continue
+ if record.itype is ImportType.non_from:
+ if len(record.names) != 1:
+ yield self._error(record, 'B402',
+ 'Multiple names on non-from import')
+ if last_import.itype is ImportType.from_import:
+ yield self._error(record, 'B401',
+ 'Non-from import follows from-import')
+ if len(last_import.names[0]) > len(record.names[0]):
+ yield self._error(
+ record, 'B403',
+ 'Shorter non-from import follows longer')
+ # It's also possible that the imports are the same length, in
+ # which case they must be sorted alphabetically.
+ if (len(last_import.names[0]) == len(record.names[0]) and
+ last_import.names[0] > record.names[0]):
+ yield self._error(
+ record, 'B404',
+ 'Non-from imports not alphabetically sorted')
+ if last_import.lineno + 1 != record.lineno:
+ yield self._error(
+ record, 'B405',
+ 'Unexpected blank line since last non-from import')
+ else:
+ assert record.itype is ImportType.from_import
+ if (last_import.itype is ImportType.non_from and
+ record.lineno != last_import.lineno + 2):
+ yield self._error(
+ record, 'B406',
+ 'Expected one blank line since last non-from import')
+ if last_import.itype is ImportType.non_from:
+ last_import = record
+ continue
+ if last_import.module > record.module:
+ yield self._error(
+ record, 'B407',
+ 'From-imports not sorted alphabetically')
+ # All imports from the same module should show up in the same
+ # multiline import.
+ if last_import.module == record.module:
+ yield self._error(
+ record, 'B408',
+ 'Importing from same module on different lines')
+ # Check the sort order of the imported names.
+ if sorted(record.names) != record.names:
+ yield self._error(
+ record, 'B409',
+ 'Imported names are not sorted alphabetically')
+ # How to check for no blank lines between from imports?
+ # Update the last import.
+ last_import = record
diff --git a/src/mailman/utilities/importer.py b/src/mailman/utilities/importer.py
index acd673c7d..9a5684d9c 100644
--- a/src/mailman/utilities/importer.py
+++ b/src/mailman/utilities/importer.py
@@ -37,9 +37,8 @@ from mailman.interfaces.digests import DigestFrequency
from mailman.interfaces.errors import MailmanError
from mailman.interfaces.languages import ILanguageManager
from mailman.interfaces.mailinglist import (
- IAcceptableAliasSet, IHeaderMatchList)
-from mailman.interfaces.mailinglist import Personalization, ReplyToMunging
-from mailman.interfaces.mailinglist import SubscriptionPolicy
+ IAcceptableAliasSet, IHeaderMatchList, Personalization, ReplyToMunging,
+ SubscriptionPolicy)
from mailman.interfaces.member import DeliveryMode, DeliveryStatus, MemberRole
from mailman.interfaces.nntp import NewsgroupModeration
from mailman.interfaces.usermanager import IUserManager