From 82f0ceb724e93ccf22140762c65da88c9c2f4bb4 Mon Sep 17 00:00:00 2001 From: Sean McGinnis Date: Tue, 2 Jun 2020 16:58:53 -0500 Subject: [PATCH] Add flake8-import-order extension This adds the import order extension to match what we have in the cinder repo. This is a linting extension that will check that imports are in the correct order and the correct grouping so they automatically get flagged, and it won't be whether reviewers notice and decide to do anything or not. Cinder change was Ic13ba238a4a45c6219f4de131cfe0366219d722f for a little more wordy reasoning. Also includes updates for noqa tags. Newer version of the linters appear to want these on the function definition line, not on the decorator line. Change-Id: Ibf3f3afbf3bb6ec6613b35f91d4a353c6a391f41 Signed-off-by: Sean McGinnis --- cinderclient/apiclient/base.py | 8 +++----- cinderclient/shell.py | 2 +- cinderclient/tests/unit/fake_actions_module.py | 4 ++-- cinderclient/tests/unit/test_utils.py | 4 ++-- .../tests/unit/v2/contrib/test_list_extensions.py | 4 +--- cinderclient/tests/unit/v2/fakes.py | 1 - cinderclient/tests/unit/v2/test_capabilities.py | 3 +-- cinderclient/tests/unit/v2/test_pools.py | 3 +-- cinderclient/tests/unit/v2/test_shell.py | 2 +- cinderclient/tests/unit/v2/test_type_access.py | 3 +-- cinderclient/tests/unit/v2/test_types.py | 3 +-- cinderclient/tests/unit/v3/fakes.py | 3 +-- cinderclient/tests/unit/v3/test_clusters.py | 4 ++-- cinderclient/tests/unit/v3/test_group_types.py | 3 +-- cinderclient/tests/unit/v3/test_services.py | 3 +-- cinderclient/tests/unit/v3/test_shell.py | 7 +++---- cinderclient/v3/messages.py | 5 +++-- cinderclient/v3/volume_backups.py | 12 ++++++------ cinderclient/v3/volumes.py | 14 +++++++------- test-requirements.txt | 2 ++ tools/colorizer.py | 2 +- tox.ini | 4 +++- 22 files changed, 44 insertions(+), 52 deletions(-) diff --git a/cinderclient/apiclient/base.py b/cinderclient/apiclient/base.py index c0bcd24a5..8caa0bc1b 100644 --- a/cinderclient/apiclient/base.py +++ b/cinderclient/apiclient/base.py @@ -16,9 +16,7 @@ # License for the specific language governing permissions and limitations # under the License. -""" -Base utilities to build API operation managers and objects on top of. -""" +"""Base utilities to build API operation managers and objects on top of.""" # E1102: %s is not callable # pylint: disable=E1102 @@ -26,13 +24,13 @@ Base utilities to build API operation managers and objects on top of. import abc import copy +from oslo_utils import encodeutils +from oslo_utils import strutils from requests import Response from cinderclient.apiclient import exceptions from cinderclient import utils -from oslo_utils import encodeutils -from oslo_utils import strutils def getid(obj): diff --git a/cinderclient/shell.py b/cinderclient/shell.py index f0825d5f2..0c3fa4535 100644 --- a/cinderclient/shell.py +++ b/cinderclient/shell.py @@ -22,6 +22,7 @@ import collections import getpass import logging import sys +from urllib import parse as urlparse from keystoneauth1 import discover from keystoneauth1 import exceptions @@ -31,7 +32,6 @@ from keystoneauth1 import loading from keystoneauth1 import session from oslo_utils import importutils import requests -from urllib import parse as urlparse import cinderclient from cinderclient._i18n import _ diff --git a/cinderclient/tests/unit/fake_actions_module.py b/cinderclient/tests/unit/fake_actions_module.py index 07e7d29b4..a2c4bf79c 100644 --- a/cinderclient/tests/unit/fake_actions_module.py +++ b/cinderclient/tests/unit/fake_actions_module.py @@ -26,8 +26,8 @@ def do_fake_action(): return "fake_action 3.0 to 3.1" -@api_versions.wraps("3.2", "3.3") # noqa: F811 -def do_fake_action(): # noqa +@api_versions.wraps("3.2", "3.3") +def do_fake_action(): # noqa: F811 return "fake_action 3.2 to 3.3" diff --git a/cinderclient/tests/unit/test_utils.py b/cinderclient/tests/unit/test_utils.py index a9636db83..1fb9433b4 100644 --- a/cinderclient/tests/unit/test_utils.py +++ b/cinderclient/tests/unit/test_utils.py @@ -70,8 +70,8 @@ class FakeManagerWithApi(base.Manager): def return_api_version(self): return '3.1' - @api_versions.wraps('3.2') # noqa: F811 - def return_api_version(self): # noqa + @api_versions.wraps('3.2') + def return_api_version(self): # noqa: F811 return '3.2' diff --git a/cinderclient/tests/unit/v2/contrib/test_list_extensions.py b/cinderclient/tests/unit/v2/contrib/test_list_extensions.py index 313b6ef58..4b6100f7a 100644 --- a/cinderclient/tests/unit/v2/contrib/test_list_extensions.py +++ b/cinderclient/tests/unit/v2/contrib/test_list_extensions.py @@ -15,11 +15,9 @@ # under the License. from cinderclient import extension -from cinderclient.v2.contrib import list_extensions - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v2 import fakes - +from cinderclient.v2.contrib import list_extensions extensions = [ extension.Extension(list_extensions.__name__.split(".")[-1], diff --git a/cinderclient/tests/unit/v2/fakes.py b/cinderclient/tests/unit/v2/fakes.py index 99a87d018..4c09e9dcb 100644 --- a/cinderclient/tests/unit/v2/fakes.py +++ b/cinderclient/tests/unit/v2/fakes.py @@ -13,7 +13,6 @@ # limitations under the License. from datetime import datetime - from urllib import parse as urlparse from cinderclient import client as base_client diff --git a/cinderclient/tests/unit/v2/test_capabilities.py b/cinderclient/tests/unit/v2/test_capabilities.py index 01a132d95..98d8d71fc 100644 --- a/cinderclient/tests/unit/v2/test_capabilities.py +++ b/cinderclient/tests/unit/v2/test_capabilities.py @@ -13,10 +13,9 @@ # License for the specific language governing permissions and limitations # under the License. -from cinderclient.v2.capabilities import Capabilities - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v2 import fakes +from cinderclient.v2.capabilities import Capabilities cs = fakes.FakeClient() diff --git a/cinderclient/tests/unit/v2/test_pools.py b/cinderclient/tests/unit/v2/test_pools.py index 543e31674..e909871ae 100644 --- a/cinderclient/tests/unit/v2/test_pools.py +++ b/cinderclient/tests/unit/v2/test_pools.py @@ -13,10 +13,9 @@ # License for the specific language governing permissions and limitations # under the License. -from cinderclient.v2.pools import Pool - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v2 import fakes +from cinderclient.v2.pools import Pool cs = fakes.FakeClient() diff --git a/cinderclient/tests/unit/v2/test_shell.py b/cinderclient/tests/unit/v2/test_shell.py index f54846e95..78ecf7409 100644 --- a/cinderclient/tests/unit/v2/test_shell.py +++ b/cinderclient/tests/unit/v2/test_shell.py @@ -14,11 +14,11 @@ # under the License. from unittest import mock +from urllib import parse import ddt import fixtures from requests_mock.contrib import fixture as requests_mock_fixture -from urllib import parse from cinderclient import client from cinderclient import exceptions diff --git a/cinderclient/tests/unit/v2/test_type_access.py b/cinderclient/tests/unit/v2/test_type_access.py index 35a4480a7..d904c1d3e 100644 --- a/cinderclient/tests/unit/v2/test_type_access.py +++ b/cinderclient/tests/unit/v2/test_type_access.py @@ -14,10 +14,9 @@ # License for the specific language governing permissions and limitations # under the License. -from cinderclient.v2 import volume_type_access - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v2 import fakes +from cinderclient.v2 import volume_type_access cs = fakes.FakeClient() diff --git a/cinderclient/tests/unit/v2/test_types.py b/cinderclient/tests/unit/v2/test_types.py index 9ba13a9c0..cf13723f1 100644 --- a/cinderclient/tests/unit/v2/test_types.py +++ b/cinderclient/tests/unit/v2/test_types.py @@ -14,10 +14,9 @@ # License for the specific language governing permissions and limitations # under the License. -from cinderclient.v2 import volume_types - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v2 import fakes +from cinderclient.v2 import volume_types cs = fakes.FakeClient() diff --git a/cinderclient/tests/unit/v3/fakes.py b/cinderclient/tests/unit/v3/fakes.py index 3fb6a36b0..7647fb39f 100644 --- a/cinderclient/tests/unit/v3/fakes.py +++ b/cinderclient/tests/unit/v3/fakes.py @@ -14,10 +14,9 @@ from datetime import datetime -from cinderclient.v3 import client - from cinderclient.tests.unit import fakes from cinderclient.tests.unit.v2 import fakes as fake_v2 +from cinderclient.v3 import client fake_attachment = {'attachment': { diff --git a/cinderclient/tests/unit/v3/test_clusters.py b/cinderclient/tests/unit/v3/test_clusters.py index c2045b6e1..21b560d5f 100644 --- a/cinderclient/tests/unit/v3/test_clusters.py +++ b/cinderclient/tests/unit/v3/test_clusters.py @@ -13,12 +13,12 @@ # License for the specific language governing permissions and limitations # under the License. +import ddt + from cinderclient import api_versions from cinderclient import exceptions as exc from cinderclient.tests.unit import utils from cinderclient.tests.unit.v3 import fakes -import ddt - cs = fakes.FakeClient(api_version=api_versions.APIVersion('3.7')) diff --git a/cinderclient/tests/unit/v3/test_group_types.py b/cinderclient/tests/unit/v3/test_group_types.py index 5833c3fc2..2263d0e8a 100644 --- a/cinderclient/tests/unit/v3/test_group_types.py +++ b/cinderclient/tests/unit/v3/test_group_types.py @@ -16,10 +16,9 @@ from cinderclient import api_versions from cinderclient import exceptions as exc -from cinderclient.v3 import group_types - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v3 import fakes +from cinderclient.v3 import group_types cs = fakes.FakeClient(api_version=api_versions.APIVersion('3.11')) pre_cs = fakes.FakeClient(api_version=api_versions.APIVersion('3.10')) diff --git a/cinderclient/tests/unit/v3/test_services.py b/cinderclient/tests/unit/v3/test_services.py index 0715cd378..8af368283 100644 --- a/cinderclient/tests/unit/v3/test_services.py +++ b/cinderclient/tests/unit/v3/test_services.py @@ -14,10 +14,9 @@ # under the License. from cinderclient import api_versions -from cinderclient.v3 import services - from cinderclient.tests.unit import utils from cinderclient.tests.unit.v3 import fakes +from cinderclient.v3 import services class ServicesTest(utils.TestCase): diff --git a/cinderclient/tests/unit/v3/test_shell.py b/cinderclient/tests/unit/v3/test_shell.py index 82e3943da..756f51201 100644 --- a/cinderclient/tests/unit/v3/test_shell.py +++ b/cinderclient/tests/unit/v3/test_shell.py @@ -51,15 +51,14 @@ from cinderclient import base from cinderclient import client from cinderclient import exceptions from cinderclient import shell +from cinderclient.tests.unit.fixture_data import keystone_client +from cinderclient.tests.unit import utils +from cinderclient.tests.unit.v3 import fakes from cinderclient import utils as cinderclient_utils from cinderclient.v3 import attachments from cinderclient.v3 import volume_snapshots from cinderclient.v3 import volumes -from cinderclient.tests.unit.fixture_data import keystone_client -from cinderclient.tests.unit import utils -from cinderclient.tests.unit.v3 import fakes - @ddt.ddt @mock.patch.object(client, 'Client', fakes.FakeClient) diff --git a/cinderclient/v3/messages.py b/cinderclient/v3/messages.py index 2c620c206..93aeefa71 100644 --- a/cinderclient/v3/messages.py +++ b/cinderclient/v3/messages.py @@ -51,8 +51,9 @@ class MessageManager(base.ManagerWithFind): url = self._build_list_url(resource_type, detailed=False) return self._list(url, resource_type) - @api_versions.wraps('3.5') # noqa: F811 - def list(self, search_opts=None, marker=None, limit=None, sort=None): # noqa + @api_versions.wraps('3.5') + def list(self, search_opts=None, marker=None, limit=None, # noqa: F811 + sort=None): """Lists all messages. :param search_opts: Search options to filter out volumes. diff --git a/cinderclient/v3/volume_backups.py b/cinderclient/v3/volume_backups.py index 7dd85603b..22d25a338 100644 --- a/cinderclient/v3/volume_backups.py +++ b/cinderclient/v3/volume_backups.py @@ -60,8 +60,8 @@ class VolumeBackupManager(volume_backups.VolumeBackupManager): return self._create_backup(volume_id, container, name, description, incremental, force, snapshot_id) - @api_versions.wraps("3.43") # noqa: F811 - def create(self, volume_id, container=None, # noqa + @api_versions.wraps("3.43") + def create(self, volume_id, container=None, # noqa: F811 name=None, description=None, incremental=False, force=False, snapshot_id=None, @@ -84,10 +84,10 @@ class VolumeBackupManager(volume_backups.VolumeBackupManager): return self._create_backup(volume_id, container, name, description, incremental, force, snapshot_id, metadata) - @api_versions.wraps("3.51") # noqa: F811 - def create(self, volume_id, container=None, name=None, description=None, # noqa - incremental=False, force=False, snapshot_id=None, metadata=None, - availability_zone=None): + @api_versions.wraps("3.51") + def create(self, volume_id, container=None, name=None, # noqa: F811 + description=None, incremental=False, force=False, + snapshot_id=None, metadata=None, availability_zone=None): return self._create_backup(volume_id, container, name, description, incremental, force, snapshot_id, metadata, availability_zone) diff --git a/cinderclient/v3/volumes.py b/cinderclient/v3/volumes.py index 974bcfcfe..8ea388008 100644 --- a/cinderclient/v3/volumes.py +++ b/cinderclient/v3/volumes.py @@ -159,8 +159,8 @@ class VolumeManager(volumes.VolumeManager): return common_base.ListWithMeta([], response_list) - @api_versions.wraps("3.15") # noqa: F811 - def delete_metadata(self, volume, keys): # noqa + @api_versions.wraps("3.15") + def delete_metadata(self, volume, keys): # noqa: F811 """Delete specified keys from volumes metadata. :param volume: The :class:`Volume`. @@ -190,9 +190,9 @@ class VolumeManager(volumes.VolumeManager): 'container_format': container_format, 'disk_format': disk_format}) - @api_versions.wraps("3.1") # noqa: F811 - def upload_to_image(self, volume, force, image_name, container_format, # noqa - disk_format, visibility, protected): + @api_versions.wraps("3.1") + def upload_to_image(self, volume, force, image_name, # noqa: F811 + container_format, disk_format, visibility, protected): """Upload volume to image service as image. :param volume: The :class:`Volume` to upload. """ @@ -264,8 +264,8 @@ class VolumeManager(volumes.VolumeManager): return self._get('/scheduler-stats/get_pools%s' % query_string, None) - @api_versions.wraps("3.33") # noqa: F811 - def get_pools(self, detail, search_opts): # noqa + @api_versions.wraps("3.33") + def get_pools(self, detail, search_opts): # noqa: F811 """Show pool information for backends.""" # pylint: disable=function-redefined options = {'detail': detail} diff --git a/test-requirements.txt b/test-requirements.txt index c66025919..9e9500238 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -4,6 +4,8 @@ # Hacking already pins down pep8, pyflakes and flake8 hacking>=4.0.0,<4.1.0 # Apache-2.0 +flake8-import-order # LGPLv3 + docutils>=0.15.2 coverage>=5.2.1 # Apache-2.0 ddt>=1.4.1 # MIT diff --git a/tools/colorizer.py b/tools/colorizer.py index 2a667b41f..cf89535b5 100755 --- a/tools/colorizer.py +++ b/tools/colorizer.py @@ -42,10 +42,10 @@ """Display a subunit stream through a colorized unittest test runner.""" import heapq -import subunit import sys import unittest +import subunit import testtools diff --git a/tox.ini b/tox.ini index a12307095..d66d486ee 100644 --- a/tox.ini +++ b/tox.ini @@ -109,7 +109,9 @@ commands = {[testenv:functional]commands} [flake8] show-source = True ignore = H404,H405,E122,E123,E128,E251,W504 -exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build +exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build +application-import-names = cinderclient +import-order-style = pep8 [doc8] ignore-path=.tox,*.egg-info,doc/src/api,doc/source/drivers.rst,doc/build,.eggs/*/EGG-INFO/*.txt,doc/source/configuration/tables,./*.txt,releasenotes/build,doc/source/cli/details.rst