You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by ro...@apache.org on 2020/12/29 13:37:37 UTC

[buildstream] branch bschubert/isort created (now 2833a6a)

This is an automated email from the ASF dual-hosted git repository.

root pushed a change to branch bschubert/isort
in repository https://gitbox.apache.org/repos/asf/buildstream.git.


      at 2833a6a  setup.cfg: Use isort to sort our imports

This branch includes the following new commits:

     new 2833a6a  setup.cfg: Use isort to sort our imports

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[buildstream] 01/01: setup.cfg: Use isort to sort our imports

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

root pushed a commit to branch bschubert/isort
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 2833a6abd562a628f4039e74a1dadf12661d2b6d
Author: Benjamin Schubert <co...@benschubert.me>
AuthorDate: Fri Jul 3 11:33:17 2020 +0100

    setup.cfg: Use isort to sort our imports
---
 .pylintrc                                          |  5 +++
 doc/source/conf.py                                 |  1 +
 setup.cfg                                          | 10 ++++++
 setup.py                                           |  4 +--
 src/buildstream/_artifact.py                       |  5 ++-
 src/buildstream/_artifactcache.py                  |  8 ++---
 src/buildstream/_artifactelement.py                |  3 +-
 src/buildstream/_basecache.py                      |  6 ++--
 src/buildstream/_cachekey.py                       |  1 -
 src/buildstream/_cas/cascache.py                   | 16 ++++-----
 src/buildstream/_cas/casdprocessmanager.py         |  9 +++--
 src/buildstream/_cas/casremote.py                  |  5 ++-
 src/buildstream/_cas/casserver.py                  | 21 +++++-------
 src/buildstream/_context.py                        | 17 +++++-----
 src/buildstream/_frontend/__init__.py              |  1 +
 src/buildstream/_frontend/app.py                   | 17 ++++------
 src/buildstream/_frontend/cli.py                   | 10 +++---
 src/buildstream/_frontend/complete.py              |  2 +-
 src/buildstream/_frontend/linuxapp.py              |  1 +
 src/buildstream/_frontend/profile.py               |  3 +-
 src/buildstream/_frontend/status.py                |  3 +-
 src/buildstream/_frontend/widget.py                | 11 +++---
 src/buildstream/_gitsourcebase.py                  | 10 +++---
 src/buildstream/_includes.py                       |  3 +-
 src/buildstream/_loader/__init__.py                |  4 +--
 src/buildstream/_loader/loader.py                  | 17 +++++-----
 src/buildstream/_messenger.py                      |  6 ++--
 src/buildstream/_options/optionarch.py             |  2 +-
 src/buildstream/_options/optionbool.py             |  2 +-
 src/buildstream/_options/optionenum.py             |  2 +-
 src/buildstream/_options/optionflags.py            |  2 +-
 src/buildstream/_options/optionos.py               |  1 +
 src/buildstream/_options/optionpool.py             |  5 ++-
 src/buildstream/_pipeline.py                       |  8 ++---
 src/buildstream/_platform/platform.py              |  4 +--
 src/buildstream/_pluginfactory/__init__.py         |  4 +--
 src/buildstream/_pluginfactory/pluginfactory.py    | 17 +++++-----
 src/buildstream/_pluginfactory/pluginorigin.py     |  4 +--
 .../_pluginfactory/pluginoriginjunction.py         |  3 +-
 src/buildstream/_pluginfactory/pluginoriginpip.py  |  3 +-
 src/buildstream/_pluginfactory/sourcefactory.py    |  1 +
 src/buildstream/_profile.py                        |  5 +--
 src/buildstream/_project.py                        | 29 ++++++++--------
 src/buildstream/_projectrefs.py                    |  2 +-
 .../_protos/buildstream/v2/artifact_pb2.py         |  8 +++--
 .../_protos/buildstream/v2/buildstream_pb2.py      |  8 +++--
 .../_protos/buildstream/v2/source_pb2.py           |  8 +++--
 .../_protos/google/api/annotations_pb2.py          |  6 ++--
 .../_protos/google/api/annotations_pb2_grpc.py     |  1 -
 src/buildstream/_protos/google/api/http_pb2.py     |  1 +
 .../_protos/google/api/http_pb2_grpc.py            |  1 -
 .../_protos/google/bytestream/bytestream_pb2.py    |  6 ++--
 .../_protos/google/longrunning/operations_pb2.py   | 10 +++---
 .../google/longrunning/operations_pb2_grpc.py      |  2 +-
 src/buildstream/_protos/google/rpc/code_pb2.py     |  3 +-
 .../_protos/google/rpc/code_pb2_grpc.py            |  1 -
 src/buildstream/_protos/google/rpc/status_pb2.py   |  3 +-
 .../_protos/google/rpc/status_pb2_grpc.py          |  1 -
 src/buildstream/_remote.py                         |  2 +-
 src/buildstream/_scheduler/__init__.py             | 12 +++----
 src/buildstream/_scheduler/jobs/elementjob.py      |  3 +-
 src/buildstream/_scheduler/jobs/job.py             |  4 +--
 .../_scheduler/queues/artifactpushqueue.py         |  4 +--
 src/buildstream/_scheduler/queues/buildqueue.py    |  4 +--
 src/buildstream/_scheduler/queues/fetchqueue.py    |  4 +--
 src/buildstream/_scheduler/queues/pullqueue.py     |  6 ++--
 src/buildstream/_scheduler/queues/queue.py         | 11 +++---
 .../_scheduler/queues/sourcepushqueue.py           |  4 +--
 src/buildstream/_scheduler/queues/trackqueue.py    |  5 ++-
 src/buildstream/_scheduler/scheduler.py            | 17 +++++-----
 src/buildstream/_signals.py                        |  3 +-
 src/buildstream/_sourcecache.py                    | 11 +++---
 src/buildstream/_stream.py                         | 39 +++++++++++-----------
 src/buildstream/_workspaces.py                     |  4 +--
 src/buildstream/buildelement.py                    |  1 -
 src/buildstream/downloadablefilesource.py          | 10 +++---
 src/buildstream/element.py                         | 29 +++++++---------
 src/buildstream/plugin.py                          |  4 +--
 src/buildstream/plugins/elements/compose.py        |  1 +
 src/buildstream/plugins/elements/import.py         |  1 +
 src/buildstream/plugins/sources/bzr.py             |  5 ++-
 src/buildstream/plugins/sources/local.py           |  3 +-
 src/buildstream/plugins/sources/patch.py           |  4 +--
 src/buildstream/plugins/sources/remote.py          |  1 +
 src/buildstream/plugins/sources/tar.py             |  3 +-
 src/buildstream/plugins/sources/workspace.py       |  4 +--
 src/buildstream/plugins/sources/zip.py             |  5 ++-
 src/buildstream/sandbox/__init__.py                |  4 +--
 src/buildstream/sandbox/_sandboxbuildboxrun.py     |  4 +--
 src/buildstream/sandbox/_sandboxreapi.py           |  2 +-
 src/buildstream/sandbox/_sandboxremote.py          | 16 ++++-----
 src/buildstream/sandbox/sandbox.py                 |  8 ++---
 src/buildstream/scriptelement.py                   |  2 +-
 src/buildstream/source.py                          | 17 +++++-----
 src/buildstream/storage/__init__.py                |  2 +-
 src/buildstream/storage/_casbaseddirectory.py      |  5 +--
 src/buildstream/storage/_filebaseddirectory.py     | 15 ++++++---
 src/buildstream/storage/directory.py               |  2 +-
 src/buildstream/testing/__init__.py                | 10 +++---
 src/buildstream/testing/_fixtures.py               |  1 +
 .../testing/_sourcetests/build_checkout.py         |  6 ++--
 src/buildstream/testing/_sourcetests/conftest.py   |  3 +-
 src/buildstream/testing/_sourcetests/fetch.py      |  9 ++---
 src/buildstream/testing/_sourcetests/mirror.py     |  6 ++--
 .../testing/_sourcetests/source_determinism.py     |  6 ++--
 src/buildstream/testing/_sourcetests/track.py      |  9 ++---
 .../testing/_sourcetests/track_cross_junction.py   |  6 ++--
 src/buildstream/testing/_sourcetests/utils.py      |  7 ++--
 src/buildstream/testing/_sourcetests/workspace.py  |  4 ++-
 src/buildstream/testing/_update_cachekeys.py       |  2 +-
 src/buildstream/testing/_utils/junction.py         |  4 ++-
 src/buildstream/testing/_utils/site.py             |  3 +-
 src/buildstream/testing/runcli.py                  | 19 +++++------
 src/buildstream/utils.py                           | 15 ++++-----
 tests/artifactcache/artifactservice.py             |  4 +--
 tests/artifactcache/capabilities.py                |  5 ++-
 tests/artifactcache/config.py                      |  8 ++---
 tests/artifactcache/expiry.py                      |  1 -
 tests/artifactcache/junctions.py                   |  4 +--
 tests/artifactcache/pull.py                        |  1 -
 tests/artifactcache/push.py                        |  3 +-
 tests/cachekey/cachekey.py                         | 11 +++---
 tests/conftest.py                                  |  4 +--
 tests/elements/filter.py                           |  6 ++--
 tests/examples/autotools.py                        |  3 +-
 tests/examples/developing.py                       |  4 ++-
 tests/examples/first-project.py                    |  4 +--
 tests/examples/flatpak-autotools.py                |  4 +--
 tests/examples/integration-commands.py             |  4 +--
 tests/examples/junctions.py                        |  3 +-
 tests/examples/running-commands.py                 |  4 +--
 tests/format/assertion.py                          |  2 ++
 tests/format/dependencies.py                       |  1 +
 tests/format/include.py                            |  4 ++-
 tests/format/include_composition.py                |  5 ++-
 tests/format/invalid_keys.py                       |  2 ++
 tests/format/junctions.py                          |  1 -
 tests/format/link.py                               |  3 +-
 tests/format/listdirectiveerrors.py                |  2 ++
 tests/format/option-list-directive.py              |  2 ++
 tests/format/optionbool.py                         |  2 ++
 tests/format/optioneltmask.py                      |  2 ++
 tests/format/optionenum.py                         |  2 ++
 tests/format/optionexports.py                      |  2 ++
 tests/format/optionflags.py                        |  2 ++
 tests/format/optionoverrides.py                    |  2 ++
 tests/format/options.py                            |  2 ++
 tests/format/project.py                            |  3 +-
 tests/format/projectoverrides.py                   |  2 ++
 tests/format/substitutions.py                      |  3 +-
 tests/format/variables.py                          |  1 -
 tests/frontend/__init__.py                         |  1 +
 tests/frontend/artifact_delete.py                  |  3 +-
 tests/frontend/artifact_list_contents.py           |  2 +-
 tests/frontend/artifact_log.py                     |  2 +-
 tests/frontend/artifact_show.py                    |  3 +-
 tests/frontend/buildcheckout.py                    | 13 ++++----
 tests/frontend/completions.py                      |  2 ++
 tests/frontend/compose_splits.py                   |  2 ++
 tests/frontend/configurable_warnings.py            |  4 +--
 tests/frontend/cross_junction_workspace.py         |  3 +-
 tests/frontend/default_target.py                   |  1 +
 tests/frontend/fetch.py                            |  5 +--
 tests/frontend/help.py                             |  1 +
 tests/frontend/init.py                             |  6 ++--
 tests/frontend/interactive_init.py                 |  4 +--
 tests/frontend/large_directory.py                  |  6 ++--
 tests/frontend/logging.py                          |  3 +-
 tests/frontend/mirror.py                           |  4 +--
 tests/frontend/order.py                            |  5 +--
 tests/frontend/overlaps.py                         |  7 ++--
 tests/frontend/progress.py                         |  3 +-
 tests/frontend/pull.py                             | 10 +++---
 tests/frontend/push.py                             |  7 ++--
 tests/frontend/rebuild.py                          |  2 ++
 tests/frontend/remote-caches.py                    |  3 +-
 tests/frontend/show.py                             |  8 +++--
 tests/frontend/source_checkout.py                  |  3 +-
 tests/frontend/track.py                            | 11 +++---
 tests/frontend/version.py                          |  4 +--
 tests/frontend/workspace.py                        |  8 ++---
 tests/integration/artifact.py                      |  1 -
 tests/integration/autotools.py                     |  4 +--
 tests/integration/build-uid.py                     |  4 +--
 tests/integration/cachedfail.py                    |  4 +--
 tests/integration/compose-symlinks.py              |  2 +-
 tests/integration/compose.py                       |  5 ++-
 tests/integration/filter.py                        |  4 +--
 tests/integration/import.py                        |  3 +-
 tests/integration/interactive_build.py             |  3 +-
 tests/integration/manual.py                        |  3 +-
 tests/integration/messages.py                      |  2 +-
 tests/integration/pip_source.py                    |  5 ++-
 tests/integration/pullbuildtrees.py                |  6 ++--
 tests/integration/sandbox.py                       |  2 +-
 tests/integration/script.py                        |  4 +--
 tests/integration/shell.py                         |  8 ++---
 tests/integration/shellbuildtrees.py               |  3 +-
 tests/integration/sockets.py                       |  2 +-
 tests/integration/source-determinism.py            |  4 +--
 tests/integration/stack.py                         |  2 +-
 tests/integration/symlinks.py                      |  2 +-
 tests/integration/workspace.py                     |  4 +--
 tests/internals/context.py                         |  3 +-
 tests/internals/loader.py                          |  8 ++---
 tests/internals/pluginloading.py                   |  5 +--
 tests/internals/storage.py                         |  8 ++---
 tests/internals/storage_vdir_import.py             |  7 ++--
 tests/internals/utils_move_atomic.py               |  4 +--
 tests/internals/utils_save_atomic.py               |  1 +
 tests/internals/yaml.py                            |  5 ++-
 tests/plugins/loading.py                           |  4 +--
 tests/plugins/sample-plugins/setup.py              |  2 +-
 tests/remoteexecution/buildfail.py                 |  3 +-
 tests/remoteexecution/buildtree.py                 |  1 +
 tests/remoteexecution/junction.py                  |  5 ++-
 tests/remoteexecution/partial.py                   |  2 +-
 tests/remoteexecution/simple.py                    |  2 +-
 tests/remoteexecution/workspace.py                 |  1 +
 tests/sandboxes/missing-command.py                 |  3 +-
 tests/sandboxes/missing_dependencies.py            |  5 ++-
 tests/sandboxes/selection.py                       |  3 +-
 tests/sourcecache/cache.py                         |  3 +-
 tests/sourcecache/capabilities.py                  |  5 ++-
 tests/sourcecache/config.py                        |  2 +-
 tests/sourcecache/fetch.py                         |  7 ++--
 .../project/plugins/elements/always_fail.py        |  2 +-
 tests/sourcecache/push.py                          |  7 ++--
 tests/sourcecache/staging.py                       |  3 +-
 tests/sourcecache/workspace.py                     |  1 -
 tests/sources/bzr.py                               |  4 +--
 tests/sources/git.py                               |  5 ++-
 tests/sources/keytest.py                           |  3 +-
 tests/sources/local.py                             |  2 ++
 tests/sources/no_fetch_cached.py                   |  4 +--
 tests/sources/patch.py                             |  2 ++
 tests/sources/pip.py                               |  1 +
 tests/sources/previous_source_access.py            |  3 +-
 .../plugins/sources/foo_transform.py               |  2 +-
 tests/sources/remote.py                            |  5 +--
 tests/sources/tar.py                               |  6 ++--
 tests/sources/variables.py                         |  1 -
 tests/sources/zip.py                               |  4 ++-
 tests/testutils/__init__.py                        |  6 ++--
 tests/testutils/artifactshare.py                   |  2 +-
 tests/testutils/context.py                         |  3 +-
 tests/testutils/element_generators.py              |  3 +-
 tests/testutils/http_server.py                     |  6 ++--
 tests/testutils/platform.py                        |  2 +-
 tests/testutils/python_repo.py                     |  1 -
 tests/testutils/repo/bzr.py                        |  1 +
 tests/testutils/repo/tar.py                        |  3 +-
 tests/testutils/repo/zip.py                        |  3 +-
 tests/testutils/setuptools.py                      |  3 +-
 tox.ini                                            |  6 +++-
 255 files changed, 664 insertions(+), 593 deletions(-)

diff --git a/.pylintrc b/.pylintrc
index 25d5647..397b293 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -125,6 +125,11 @@ disable=#####################################
         line-too-long,
         superfluous-parens,
 
+        ##################################################
+        # Formatting-related messages, enforced by isort #
+        ##################################################
+
+        wrong-import-position,
 
 # Enable the message, report, category or checker with the given id(s). You can
 # either give multiple identifier separated by comma (,) or put this option
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 0234d39..091bb95 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -19,6 +19,7 @@
 #
 import os
 import sys
+
 from buildstream import __version__
 
 sys.path.insert(0, os.path.abspath(".."))
diff --git a/setup.cfg b/setup.cfg
index 5a3a75d..c6ea8ba 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -20,6 +20,16 @@ markers =
     remoteexecution: run test only if --remote-execution option is specified
 xfail_strict=True
 
+[tool:isort]
+line_length = 119
+multi_line_output = 3
+include_trailing_comma = true
+use_parentheses = true
+default_section: THIRDPARTY
+known_first_party = buildstream
+known_tests = tests
+sections = FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,TESTS,LOCALFOLDER
+
 [mypy]
 files = src
 warn_unused_configs = True
diff --git a/setup.py b/setup.py
index c300d33..f09539f 100755
--- a/setup.py
+++ b/setup.py
@@ -20,13 +20,13 @@
 #        Benjamin Schubert <bs...@bloomberg.net>
 
 import os
-from pathlib import Path
 import re
 import sys
+from pathlib import Path
 
 # Add local directory to the path, in order to be able to import versioneer
 sys.path.append(os.path.dirname(__file__))
-import versioneer  # pylint: disable=wrong-import-position
+import versioneer  # isort:skip
 
 
 ##################################################################
diff --git a/src/buildstream/_artifact.py b/src/buildstream/_artifact.py
index cf82a16..28dfaa4 100644
--- a/src/buildstream/_artifact.py
+++ b/src/buildstream/_artifact.py
@@ -30,12 +30,11 @@ artifact composite interaction away from Element class
 
 import os
 
+from . import _yaml, utils
 from ._exceptions import ArtifactError
 from ._protos.buildstream.v2.artifact_pb2 import Artifact as ArtifactProto
-from . import _yaml
-from . import utils
-from .types import Scope
 from .storage._casbaseddirectory import CasBasedDirectory
+from .types import Scope
 
 
 # An Artifact class to abstract artifact operations
diff --git a/src/buildstream/_artifactcache.py b/src/buildstream/_artifactcache.py
index 46fc5fb..b7bd824 100644
--- a/src/buildstream/_artifactcache.py
+++ b/src/buildstream/_artifactcache.py
@@ -19,15 +19,15 @@
 #        Tristan Maat <tr...@codethink.co.uk>
 
 import os
+
 import grpc
 
+from . import utils
 from ._basecache import BaseCache
 from ._cas.casremote import BlobNotFound
-from ._exceptions import ArtifactError, CASError, CacheError, CASRemoteError, RemoteError
-from ._protos.buildstream.v2 import buildstream_pb2, buildstream_pb2_grpc, artifact_pb2, artifact_pb2_grpc
-
+from ._exceptions import ArtifactError, CacheError, CASError, CASRemoteError, RemoteError
+from ._protos.buildstream.v2 import artifact_pb2, artifact_pb2_grpc, buildstream_pb2, buildstream_pb2_grpc
 from ._remote import BaseRemote
-from . import utils
 
 
 # ArtifactRemote():
diff --git a/src/buildstream/_artifactelement.py b/src/buildstream/_artifactelement.py
index 4066cef..ad42cba 100644
--- a/src/buildstream/_artifactelement.py
+++ b/src/buildstream/_artifactelement.py
@@ -19,8 +19,7 @@
 
 from typing import TYPE_CHECKING
 
-from . import Element
-from . import _cachekey
+from . import Element, _cachekey
 from ._exceptions import ArtifactElementError
 from ._loader.metaelement import MetaElement
 from .types import Scope
diff --git a/src/buildstream/_basecache.py b/src/buildstream/_basecache.py
index 91eae6a..d4166df 100644
--- a/src/buildstream/_basecache.py
+++ b/src/buildstream/_basecache.py
@@ -21,14 +21,12 @@ from fnmatch import fnmatch
 from itertools import chain
 from typing import TYPE_CHECKING
 
-from . import utils
-from . import _yaml
+from . import _yaml, utils
 from ._cas import CASRemote
+from ._exceptions import CacheError, LoadError, RemoteError
 from ._message import Message, MessageType
-from ._exceptions import LoadError, RemoteError, CacheError
 from ._remote import RemoteSpec, RemoteType
 
-
 if TYPE_CHECKING:
     from typing import Optional, Type
     from ._exceptions import BstError
diff --git a/src/buildstream/_cachekey.py b/src/buildstream/_cachekey.py
index dd92075..5bf11e5 100644
--- a/src/buildstream/_cachekey.py
+++ b/src/buildstream/_cachekey.py
@@ -22,7 +22,6 @@ import hashlib
 
 import ujson
 
-
 # Internal record of the size of a cache key
 _CACHEKEY_SIZE = len(hashlib.sha256().hexdigest())
 
diff --git a/src/buildstream/_cas/cascache.py b/src/buildstream/_cas/cascache.py
index 7936121..a5757f1 100644
--- a/src/buildstream/_cas/cascache.py
+++ b/src/buildstream/_cas/cascache.py
@@ -18,26 +18,24 @@
 #  Authors:
 #        Jürg Billeter <ju...@codethink.co.uk>
 
-import itertools
-import os
-import stat
 import contextlib
 import ctypes
+import itertools
 import multiprocessing
+import os
 import signal
+import stat
 import time
-from typing import Optional, List
+from typing import List, Optional
 
 import grpc
 
-from .._protos.google.rpc import code_pb2
+from .. import _signals, utils
+from .._exceptions import CASCacheError
 from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
 from .._protos.build.buildgrid import local_cas_pb2
-
-from .. import _signals, utils
+from .._protos.google.rpc import code_pb2
 from ..types import FastEnum, SourceRef
-from .._exceptions import CASCacheError
-
 from .casdprocessmanager import CASDProcessManager
 from .casremote import _CASBatchRead, _CASBatchUpdate
 
diff --git a/src/buildstream/_cas/casdprocessmanager.py b/src/buildstream/_cas/casdprocessmanager.py
index 637c4e0..55121b4 100644
--- a/src/buildstream/_cas/casdprocessmanager.py
+++ b/src/buildstream/_cas/casdprocessmanager.py
@@ -25,17 +25,16 @@ import stat
 import subprocess
 import tempfile
 import time
-import psutil
 
 import grpc
-
-from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2_grpc
-from .._protos.build.buildgrid import local_cas_pb2_grpc
-from .._protos.google.bytestream import bytestream_pb2_grpc
+import psutil
 
 from .. import _signals, utils
 from .._exceptions import CASCacheError
 from .._message import Message, MessageType
+from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2_grpc
+from .._protos.build.buildgrid import local_cas_pb2_grpc
+from .._protos.google.bytestream import bytestream_pb2_grpc
 
 _CASD_MAX_LOGFILES = 10
 _CASD_TIMEOUT = 300  # in seconds
diff --git a/src/buildstream/_cas/casremote.py b/src/buildstream/_cas/casremote.py
index 93f4e50..16a5d8d 100644
--- a/src/buildstream/_cas/casremote.py
+++ b/src/buildstream/_cas/casremote.py
@@ -15,11 +15,10 @@
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 #
 
-from .._protos.google.rpc import code_pb2
+from .._exceptions import CASRemoteError
 from .._protos.build.buildgrid import local_cas_pb2
-
+from .._protos.google.rpc import code_pb2
 from .._remote import BaseRemote
-from .._exceptions import CASRemoteError
 
 # The default limit for gRPC messages is 4 MiB.
 # Limit payload to 1 MiB to leave sufficient headroom for metadata.
diff --git a/src/buildstream/_cas/casserver.py b/src/buildstream/_cas/casserver.py
index 71d7d90..c90a98c 100644
--- a/src/buildstream/_cas/casserver.py
+++ b/src/buildstream/_cas/casserver.py
@@ -17,33 +17,29 @@
 #  Authors:
 #        Jürg Billeter <ju...@codethink.co.uk>
 
-from concurrent import futures
-from enum import Enum
 import contextlib
 import logging
 import os
 import signal
 import sys
+from concurrent import futures
+from enum import Enum
 
+import click
 import grpc
 from google.protobuf.message import DecodeError
-import click
 
-from .._protos.build.bazel.remote.execution.v2 import (
-    remote_execution_pb2,
-    remote_execution_pb2_grpc,
-)
-from .._protos.google.bytestream import bytestream_pb2_grpc
+from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2, remote_execution_pb2_grpc
 from .._protos.build.buildgrid import local_cas_pb2
 from .._protos.buildstream.v2 import (
-    buildstream_pb2,
-    buildstream_pb2_grpc,
     artifact_pb2,
     artifact_pb2_grpc,
+    buildstream_pb2,
+    buildstream_pb2_grpc,
     source_pb2,
     source_pb2_grpc,
 )
-
+from .._protos.google.bytestream import bytestream_pb2_grpc
 # Note: We'd ideally like to avoid imports from the core codebase as
 # much as possible, since we're expecting to eventually split this
 # module off into its own project.
@@ -51,10 +47,9 @@ from .._protos.buildstream.v2 import (
 # Not enough that we'd like to duplicate code, but enough that we want
 # to make it very obvious what we're using, so in this case we import
 # the specific methods we'll be using.
-from ..utils import save_file_atomic, _remove_path_with_parents
+from ..utils import _remove_path_with_parents, save_file_atomic
 from .casdprocessmanager import CASDProcessManager
 
-
 # The default limit for gRPC messages is 4 MiB.
 # Limit payload to 1 MiB to leave sufficient headroom for metadata.
 _MAX_PAYLOAD_BYTES = 1024 * 1024
diff --git a/src/buildstream/_context.py b/src/buildstream/_context.py
index c0e92b9..6f7629e 100644
--- a/src/buildstream/_context.py
+++ b/src/buildstream/_context.py
@@ -19,21 +19,20 @@
 
 import os
 import shutil
-from . import utils
-from . import _site
-from . import _yaml
+
+from . import _site, _yaml, utils
+from ._artifactcache import ArtifactCache
+from ._cas import CASCache, CASLogLevel
 from ._exceptions import LoadError
-from .exceptions import LoadErrorReason
 from ._messenger import Messenger
-from ._profile import Topics, PROFILER
 from ._platform import Platform
-from ._artifactcache import ArtifactCache
+from ._profile import PROFILER, Topics
 from ._sourcecache import SourceCache
-from ._cas import CASCache, CASLogLevel
-from .types import _CacheBuildTrees, _PipelineSelection, _SchedulerErrorAction
-from ._workspaces import Workspaces, WorkspaceProjectCache
+from ._workspaces import WorkspaceProjectCache, Workspaces
+from .exceptions import LoadErrorReason
 from .node import Node
 from .sandbox import SandboxRemote
+from .types import _CacheBuildTrees, _PipelineSelection, _SchedulerErrorAction
 
 
 # Context()
diff --git a/src/buildstream/_frontend/__init__.py b/src/buildstream/_frontend/__init__.py
index febd497..0744b81 100644
--- a/src/buildstream/_frontend/__init__.py
+++ b/src/buildstream/_frontend/__init__.py
@@ -17,6 +17,7 @@
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 import os
+
 from .cli import cli
 
 if "_BST_COMPLETION" not in os.environ:
diff --git a/src/buildstream/_frontend/app.py b/src/buildstream/_frontend/app.py
index b77cfc1..df840de 100644
--- a/src/buildstream/_frontend/app.py
+++ b/src/buildstream/_frontend/app.py
@@ -17,30 +17,27 @@
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 
-from contextlib import contextmanager
+import datetime
 import os
 import sys
 import traceback
-import datetime
+from contextlib import contextmanager
 from textwrap import TextWrapper
+
 import click
 from click import UsageError
 
 # Import buildstream public symbols
-from .. import Scope
-
+from .. import Scope, node, utils
 # Import various buildstream internals
 from .._context import Context
-from .._project import Project
-from .._exceptions import BstError, StreamError, LoadError, AppError
-from ..exceptions import LoadErrorReason
+from .._exceptions import AppError, BstError, LoadError, StreamError
 from .._message import Message, MessageType, unconditional_messages
+from .._project import Project
 from .._stream import Stream
+from ..exceptions import LoadErrorReason
 from ..types import _SchedulerErrorAction
-from .. import node
-from .. import utils
 from ..utils import UtilError
-
 # Import frontend assets
 from .profile import Profile
 from .status import Status
diff --git a/src/buildstream/_frontend/cli.py b/src/buildstream/_frontend/cli.py
index d5fa470..26dc6ec 100644
--- a/src/buildstream/_frontend/cli.py
+++ b/src/buildstream/_frontend/cli.py
@@ -1,15 +1,15 @@
 import os
+import shutil
 import sys
 from functools import partial
 
-import shutil
 import click
+
 from .. import _yaml
-from .._exceptions import BstError, LoadError, AppError
-from .complete import main_bashcomplete, complete_path, CompleteUnhandled
-from ..types import _CacheBuildTrees, _SchedulerErrorAction, _PipelineSelection
+from .._exceptions import AppError, BstError, LoadError
+from ..types import _CacheBuildTrees, _PipelineSelection, _SchedulerErrorAction
 from ..utils import UtilError
-
+from .complete import CompleteUnhandled, complete_path, main_bashcomplete
 
 ##################################################################
 #              Helper classes and methods for Click              #
diff --git a/src/buildstream/_frontend/complete.py b/src/buildstream/_frontend/complete.py
index 45e857e..4afd75c 100644
--- a/src/buildstream/_frontend/complete.py
+++ b/src/buildstream/_frontend/complete.py
@@ -36,7 +36,7 @@ import copy
 import os
 
 import click
-from click.core import MultiCommand, Option, Argument
+from click.core import Argument, MultiCommand, Option
 from click.parser import split_arg_string
 
 WORDBREAK = "="
diff --git a/src/buildstream/_frontend/linuxapp.py b/src/buildstream/_frontend/linuxapp.py
index 987b023..2cb8e2e 100644
--- a/src/buildstream/_frontend/linuxapp.py
+++ b/src/buildstream/_frontend/linuxapp.py
@@ -17,6 +17,7 @@
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 import os
+
 import click
 
 from .app import App
diff --git a/src/buildstream/_frontend/profile.py b/src/buildstream/_frontend/profile.py
index 02b601c..b5e41cc 100644
--- a/src/buildstream/_frontend/profile.py
+++ b/src/buildstream/_frontend/profile.py
@@ -16,8 +16,9 @@
 #
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
-import re
 import copy
+import re
+
 import click
 
 
diff --git a/src/buildstream/_frontend/status.py b/src/buildstream/_frontend/status.py
index a3f0d8a..953f72b 100644
--- a/src/buildstream/_frontend/status.py
+++ b/src/buildstream/_frontend/status.py
@@ -16,10 +16,11 @@
 #
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
+import curses
 import os
 import sys
-import curses
 from collections import OrderedDict
+
 import click
 
 # Import a widget internal for formatting time codes
diff --git a/src/buildstream/_frontend/widget.py b/src/buildstream/_frontend/widget.py
index f07e3db..2f18aeb 100644
--- a/src/buildstream/_frontend/widget.py
+++ b/src/buildstream/_frontend/widget.py
@@ -18,20 +18,21 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 import datetime
 import os
-from collections import defaultdict, OrderedDict
-from contextlib import ExitStack
-from mmap import mmap
 import re
 import textwrap
-from ruamel import yaml
+from collections import OrderedDict, defaultdict
+from contextlib import ExitStack
+from mmap import mmap
+
 import click
+from ruamel import yaml
 
-from .profile import Profile
 from .. import Scope
 from .. import __version__ as bst_version
 from .._exceptions import ImplError
 from .._message import MessageType
 from ..storage.directory import _FileType
+from .profile import Profile
 
 # These messages are printed a bit differently
 ERROR_MESSAGES = [MessageType.FAIL, MessageType.ERROR, MessageType.BUG]
diff --git a/src/buildstream/_gitsourcebase.py b/src/buildstream/_gitsourcebase.py
index e3b2466..6f4c04d 100644
--- a/src/buildstream/_gitsourcebase.py
+++ b/src/buildstream/_gitsourcebase.py
@@ -25,16 +25,14 @@
 import os
 import re
 import shutil
+from configparser import RawConfigParser
 from io import StringIO
 from tempfile import TemporaryFile
 
-from configparser import RawConfigParser
-
-from .source import Source, SourceError, SourceFetcher
-from .types import CoreWarnings
 from . import utils
-from .types import FastEnum
-from .utils import move_atomic, DirectoryExistsError
+from .source import Source, SourceError, SourceFetcher
+from .types import CoreWarnings, FastEnum
+from .utils import DirectoryExistsError, move_atomic
 
 GIT_MODULES = ".gitmodules"
 EXACT_TAG_PATTERN = r"(?P<tag>.*)-0-g(?P<commit>.*)"
diff --git a/src/buildstream/_includes.py b/src/buildstream/_includes.py
index 1556bc6..24f7ed8 100644
--- a/src/buildstream/_includes.py
+++ b/src/buildstream/_includes.py
@@ -1,8 +1,9 @@
 import os
+
 from . import _yaml
-from .node import MappingNode, ScalarNode, SequenceNode
 from ._exceptions import LoadError
 from .exceptions import LoadErrorReason
+from .node import MappingNode, ScalarNode, SequenceNode
 
 
 # Includes()
diff --git a/src/buildstream/_loader/__init__.py b/src/buildstream/_loader/__init__.py
index fd5cac2..7980e77 100644
--- a/src/buildstream/_loader/__init__.py
+++ b/src/buildstream/_loader/__init__.py
@@ -17,7 +17,7 @@
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 
-from .metasource import MetaSource
-from .metaelement import MetaElement
 from .loadcontext import LoadContext
 from .loader import Loader
+from .metaelement import MetaElement
+from .metasource import MetaSource
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py
index 81e5fb0..019aed1 100644
--- a/src/buildstream/_loader/loader.py
+++ b/src/buildstream/_loader/loader.py
@@ -20,22 +20,21 @@
 import os
 from contextlib import suppress
 
-from .._exceptions import LoadError
-from ..exceptions import LoadErrorReason
 from .. import _yaml
+from .._exceptions import LoadError
+from .._includes import Includes
+from .._message import Message, MessageType
+from .._profile import PROFILER, Topics
 from ..element import Element
+from ..exceptions import LoadErrorReason
 from ..node import Node
-from .._profile import Topics, PROFILER
-from .._includes import Includes
-
-from ._loader import valid_chars_name
-from .types import Symbol, extract_depends_from_node
+from ..types import CoreWarnings, _KeyStrength
 from . import loadelement
+from ._loader import valid_chars_name
 from .loadelement import Dependency, LoadElement
 from .metaelement import MetaElement
 from .metasource import MetaSource
-from ..types import CoreWarnings, _KeyStrength
-from .._message import Message, MessageType
+from .types import Symbol, extract_depends_from_node
 
 
 # Loader():
diff --git a/src/buildstream/_messenger.py b/src/buildstream/_messenger.py
index 3a32a24..24c9973 100644
--- a/src/buildstream/_messenger.py
+++ b/src/buildstream/_messenger.py
@@ -17,16 +17,14 @@
 #  Authors:
 #        Angelos Evripiotis <je...@bloomberg.net>
 
-import os
 import datetime
+import os
 from contextlib import contextmanager
 
-from . import _signals
-from . import utils
+from . import _signals, utils
 from ._exceptions import BstError
 from ._message import Message, MessageType
 
-
 _RENDER_INTERVAL = datetime.timedelta(seconds=1)
 
 
diff --git a/src/buildstream/_options/optionarch.py b/src/buildstream/_options/optionarch.py
index 651afbe..e3d1355 100644
--- a/src/buildstream/_options/optionarch.py
+++ b/src/buildstream/_options/optionarch.py
@@ -18,8 +18,8 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 
 from .._exceptions import LoadError, PlatformError
-from ..exceptions import LoadErrorReason
 from .._platform import Platform
+from ..exceptions import LoadErrorReason
 from .optionenum import OptionEnum
 
 
diff --git a/src/buildstream/_options/optionbool.py b/src/buildstream/_options/optionbool.py
index 57dbd16..97e8d8e 100644
--- a/src/buildstream/_options/optionbool.py
+++ b/src/buildstream/_options/optionbool.py
@@ -19,7 +19,7 @@
 
 from .._exceptions import LoadError
 from ..exceptions import LoadErrorReason
-from .option import Option, OPTION_SYMBOLS
+from .option import OPTION_SYMBOLS, Option
 
 
 # OptionBool
diff --git a/src/buildstream/_options/optionenum.py b/src/buildstream/_options/optionenum.py
index da3a7dc..24d85ce 100644
--- a/src/buildstream/_options/optionenum.py
+++ b/src/buildstream/_options/optionenum.py
@@ -19,7 +19,7 @@
 
 from .._exceptions import LoadError
 from ..exceptions import LoadErrorReason
-from .option import Option, OPTION_SYMBOLS
+from .option import OPTION_SYMBOLS, Option
 
 
 # OptionEnum
diff --git a/src/buildstream/_options/optionflags.py b/src/buildstream/_options/optionflags.py
index 042ef64..835c1ef 100644
--- a/src/buildstream/_options/optionflags.py
+++ b/src/buildstream/_options/optionflags.py
@@ -19,7 +19,7 @@
 
 from .._exceptions import LoadError
 from ..exceptions import LoadErrorReason
-from .option import Option, OPTION_SYMBOLS
+from .option import OPTION_SYMBOLS, Option
 
 
 # OptionFlags
diff --git a/src/buildstream/_options/optionos.py b/src/buildstream/_options/optionos.py
index 3f4e902..cc1cff2 100644
--- a/src/buildstream/_options/optionos.py
+++ b/src/buildstream/_options/optionos.py
@@ -18,6 +18,7 @@
 #        Raoul Hidalgo Charman <ra...@codethink.co.uk>
 
 import platform
+
 from .optionenum import OptionEnum
 
 
diff --git a/src/buildstream/_options/optionpool.py b/src/buildstream/_options/optionpool.py
index b30d1f0..00c9d34 100644
--- a/src/buildstream/_options/optionpool.py
+++ b/src/buildstream/_options/optionpool.py
@@ -24,14 +24,13 @@ from .._exceptions import LoadError
 from ..exceptions import LoadErrorReason
 from ..node import MappingNode, SequenceNode, _assert_symbol_name
 from ..types import FastEnum
+from .optionarch import OptionArch
 from .optionbool import OptionBool
+from .optioneltmask import OptionEltMask
 from .optionenum import OptionEnum
 from .optionflags import OptionFlags
-from .optioneltmask import OptionEltMask
-from .optionarch import OptionArch
 from .optionos import OptionOS
 
-
 _OPTION_TYPES = {
     OptionBool.OPTION_TYPE: OptionBool,
     OptionEnum.OPTION_TYPE: OptionEnum,
diff --git a/src/buildstream/_pipeline.py b/src/buildstream/_pipeline.py
index 9edc6f5..5afced0 100644
--- a/src/buildstream/_pipeline.py
+++ b/src/buildstream/_pipeline.py
@@ -19,17 +19,17 @@
 #        Jürg Billeter <ju...@codethink.co.uk>
 #        Tristan Maat <tr...@codethink.co.uk>
 
-import os
 import itertools
-from operator import itemgetter
+import os
 from collections import OrderedDict
+from operator import itemgetter
 
 from pyroaring import BitMap  # pylint: disable=no-name-in-module
 
+from . import Scope
 from ._exceptions import PipelineError
 from ._message import Message, MessageType
-from ._profile import Topics, PROFILER
-from . import Scope
+from ._profile import PROFILER, Topics
 from ._project import ProjectRefStorage
 from .types import _PipelineSelection
 
diff --git a/src/buildstream/_platform/platform.py b/src/buildstream/_platform/platform.py
index 50a1d8e..29b4455 100644
--- a/src/buildstream/_platform/platform.py
+++ b/src/buildstream/_platform/platform.py
@@ -23,9 +23,9 @@ import platform
 
 import psutil
 
-from .._exceptions import PlatformError, ImplError, SandboxError
-from ..sandbox import SandboxDummy
 from .. import utils
+from .._exceptions import ImplError, PlatformError, SandboxError
+from ..sandbox import SandboxDummy
 
 
 class Platform:
diff --git a/src/buildstream/_pluginfactory/__init__.py b/src/buildstream/_pluginfactory/__init__.py
index cd41723..9af2e1d 100644
--- a/src/buildstream/_pluginfactory/__init__.py
+++ b/src/buildstream/_pluginfactory/__init__.py
@@ -15,12 +15,12 @@
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 #
 
+from .elementfactory import ElementFactory
 from .pluginorigin import PluginOrigin, PluginOriginType, PluginType
+from .pluginoriginjunction import PluginOriginJunction
 from .pluginoriginlocal import PluginOriginLocal
 from .pluginoriginpip import PluginOriginPip
-from .pluginoriginjunction import PluginOriginJunction
 from .sourcefactory import SourceFactory
-from .elementfactory import ElementFactory
 
 
 # load_plugin_origin()
diff --git a/src/buildstream/_pluginfactory/pluginfactory.py b/src/buildstream/_pluginfactory/pluginfactory.py
index df950ab..b7171c4 100644
--- a/src/buildstream/_pluginfactory/pluginfactory.py
+++ b/src/buildstream/_pluginfactory/pluginfactory.py
@@ -18,20 +18,19 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 
 import os
-from typing import Tuple, Type, Iterator
+from typing import Iterator, Tuple, Type
+
 from pluginbase import PluginSource
 
-from .. import utils
-from .. import _site
-from ..plugin import Plugin
-from ..source import Source
+from .. import _site, utils
+from .._exceptions import PluginError
+from .._message import Message, MessageType
+from .._messenger import Messenger
 from ..element import Element
 from ..node import ProvenanceInformation
+from ..plugin import Plugin
+from ..source import Source
 from ..utils import UtilError
-from .._exceptions import PluginError
-from .._messenger import Messenger
-from .._message import Message, MessageType
-
 from .pluginorigin import PluginOrigin, PluginType
 
 
diff --git a/src/buildstream/_pluginfactory/pluginorigin.py b/src/buildstream/_pluginfactory/pluginorigin.py
index bd98717..40c4ab5 100644
--- a/src/buildstream/_pluginfactory/pluginorigin.py
+++ b/src/buildstream/_pluginfactory/pluginorigin.py
@@ -15,10 +15,10 @@
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 #
 
-from ..types import FastEnum
-from ..node import ScalarNode, MappingNode
 from .._exceptions import LoadError
 from ..exceptions import LoadErrorReason
+from ..node import MappingNode, ScalarNode
+from ..types import FastEnum
 
 
 # PluginType()
diff --git a/src/buildstream/_pluginfactory/pluginoriginjunction.py b/src/buildstream/_pluginfactory/pluginoriginjunction.py
index 4e0a53c..1ed69cf 100644
--- a/src/buildstream/_pluginfactory/pluginoriginjunction.py
+++ b/src/buildstream/_pluginfactory/pluginoriginjunction.py
@@ -15,8 +15,7 @@
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 #
 from .._exceptions import PluginError
-
-from .pluginorigin import PluginType, PluginOrigin, PluginOriginType
+from .pluginorigin import PluginOrigin, PluginOriginType, PluginType
 
 
 # PluginOriginJunction
diff --git a/src/buildstream/_pluginfactory/pluginoriginpip.py b/src/buildstream/_pluginfactory/pluginoriginpip.py
index 3a9c63f..650cf18 100644
--- a/src/buildstream/_pluginfactory/pluginoriginpip.py
+++ b/src/buildstream/_pluginfactory/pluginoriginpip.py
@@ -17,8 +17,7 @@
 import os
 
 from .._exceptions import PluginError
-
-from .pluginorigin import PluginType, PluginOrigin, PluginOriginType
+from .pluginorigin import PluginOrigin, PluginOriginType, PluginType
 
 
 # PluginOriginPip
diff --git a/src/buildstream/_pluginfactory/sourcefactory.py b/src/buildstream/_pluginfactory/sourcefactory.py
index 2ed78f8..ad08e25 100644
--- a/src/buildstream/_pluginfactory/sourcefactory.py
+++ b/src/buildstream/_pluginfactory/sourcefactory.py
@@ -20,6 +20,7 @@
 from .pluginfactory import PluginFactory
 from .pluginorigin import PluginType
 
+
 # A SourceFactory creates Source instances
 # in the context of a given factory
 #
diff --git a/src/buildstream/_profile.py b/src/buildstream/_profile.py
index 0219e83..55d1250 100644
--- a/src/buildstream/_profile.py
+++ b/src/buildstream/_profile.py
@@ -23,10 +23,11 @@
 
 import contextlib
 import cProfile
-import pstats
-import os
 import datetime
+import os
+import pstats
 import time
+
 from ._exceptions import ProfileError
 
 
diff --git a/src/buildstream/_project.py b/src/buildstream/_project.py
index 21dc2b9..fb688c2 100644
--- a/src/buildstream/_project.py
+++ b/src/buildstream/_project.py
@@ -22,29 +22,28 @@ import os
 import sys
 from collections import OrderedDict
 from pathlib import Path
+
 from pluginbase import PluginBase
-from . import utils
-from . import _site
-from . import _yaml
-from .utils import UtilError
+
+from . import _site, _yaml, utils
+from ._artifactcache import ArtifactCache
 from ._artifactelement import ArtifactElement
-from ._profile import Topics, PROFILER
 from ._exceptions import LoadError
-from .exceptions import LoadErrorReason
+from ._includes import Includes
+from ._loader import LoadContext, Loader
+from ._message import Message, MessageType
 from ._options import OptionPool
-from ._artifactcache import ArtifactCache
+from ._pluginfactory import ElementFactory, SourceFactory, load_plugin_origin
+from ._profile import PROFILER, Topics
+from ._projectrefs import ProjectRefs, ProjectRefStorage
 from ._sourcecache import SourceCache
+from ._workspaces import WORKSPACE_PROJECT_FILE
+from .element import Element
+from .exceptions import LoadErrorReason
 from .node import ScalarNode, SequenceNode, _assert_symbol_name
 from .sandbox import SandboxRemote
-from ._pluginfactory import ElementFactory, SourceFactory, load_plugin_origin
 from .types import CoreWarnings
-from ._projectrefs import ProjectRefs, ProjectRefStorage
-from ._loader import Loader, LoadContext
-from .element import Element
-from ._message import Message, MessageType
-from ._includes import Includes
-from ._workspaces import WORKSPACE_PROJECT_FILE
-
+from .utils import UtilError
 
 # Project Configuration file
 _PROJECT_CONF_FILE = "project.conf"
diff --git a/src/buildstream/_projectrefs.py b/src/buildstream/_projectrefs.py
index 6af4708..e16de28 100644
--- a/src/buildstream/_projectrefs.py
+++ b/src/buildstream/_projectrefs.py
@@ -19,9 +19,9 @@
 import os
 
 from . import _yaml
-from .node import _new_synthetic_file
 from ._exceptions import LoadError
 from .exceptions import LoadErrorReason
+from .node import _new_synthetic_file
 
 
 # ProjectRefStorage()
diff --git a/src/buildstream/_protos/buildstream/v2/artifact_pb2.py b/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
index 8c34ef8..e5955e0 100644
--- a/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
@@ -6,13 +6,17 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
+from buildstream._protos.build.bazel.remote.execution.v2 import (
+    remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2,
+)
+from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
-from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py b/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py
index 0780c9f..7adce4e 100644
--- a/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py
@@ -6,13 +6,17 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
+from buildstream._protos.build.bazel.remote.execution.v2 import (
+    remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2,
+)
+from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
-from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/buildstream/v2/source_pb2.py b/src/buildstream/_protos/buildstream/v2/source_pb2.py
index 136c4cb..e9ade64 100644
--- a/src/buildstream/_protos/buildstream/v2/source_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/source_pb2.py
@@ -6,13 +6,17 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
+from buildstream._protos.build.bazel.remote.execution.v2 import (
+    remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2,
+)
+from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
-from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/google/api/annotations_pb2.py b/src/buildstream/_protos/google/api/annotations_pb2.py
index 35585c7..3aaa130 100644
--- a/src/buildstream/_protos/google/api/annotations_pb2.py
+++ b/src/buildstream/_protos/google/api/annotations_pb2.py
@@ -3,16 +3,18 @@
 # source: google/api/annotations.proto
 
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
+from buildstream._protos.google.api import http_pb2 as google_dot_api_dot_http__pb2
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from buildstream._protos.google.api import http_pb2 as google_dot_api_dot_http__pb2
-from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/google/api/annotations_pb2_grpc.py b/src/buildstream/_protos/google/api/annotations_pb2_grpc.py
index a894352..07cb78f 100644
--- a/src/buildstream/_protos/google/api/annotations_pb2_grpc.py
+++ b/src/buildstream/_protos/google/api/annotations_pb2_grpc.py
@@ -1,3 +1,2 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 import grpc
-
diff --git a/src/buildstream/_protos/google/api/http_pb2.py b/src/buildstream/_protos/google/api/http_pb2.py
index cf4ce32..df98dd8 100644
--- a/src/buildstream/_protos/google/api/http_pb2.py
+++ b/src/buildstream/_protos/google/api/http_pb2.py
@@ -6,6 +6,7 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
diff --git a/src/buildstream/_protos/google/api/http_pb2_grpc.py b/src/buildstream/_protos/google/api/http_pb2_grpc.py
index a894352..07cb78f 100644
--- a/src/buildstream/_protos/google/api/http_pb2_grpc.py
+++ b/src/buildstream/_protos/google/api/http_pb2_grpc.py
@@ -1,3 +1,2 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 import grpc
-
diff --git a/src/buildstream/_protos/google/bytestream/bytestream_pb2.py b/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
index d8627d4..893703f 100644
--- a/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
+++ b/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
@@ -6,13 +6,15 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
+
+from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/google/longrunning/operations_pb2.py b/src/buildstream/_protos/google/longrunning/operations_pb2.py
index 7798de3..46faf03 100644
--- a/src/buildstream/_protos/google/longrunning/operations_pb2.py
+++ b/src/buildstream/_protos/google/longrunning/operations_pb2.py
@@ -2,19 +2,21 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/longrunning/operations.proto
 
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
+from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
-from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
-from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py b/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
index 8f89862..c9f4363 100644
--- a/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
+++ b/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
@@ -1,8 +1,8 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 import grpc
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 from buildstream._protos.google.longrunning import operations_pb2 as google_dot_longrunning_dot_operations__pb2
-from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 class OperationsStub(object):
diff --git a/src/buildstream/_protos/google/rpc/code_pb2.py b/src/buildstream/_protos/google/rpc/code_pb2.py
index 85a6b2d..1c33cd3 100644
--- a/src/buildstream/_protos/google/rpc/code_pb2.py
+++ b/src/buildstream/_protos/google/rpc/code_pb2.py
@@ -2,11 +2,12 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/rpc/code.proto
 
-from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import enum_type_wrapper
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
diff --git a/src/buildstream/_protos/google/rpc/code_pb2_grpc.py b/src/buildstream/_protos/google/rpc/code_pb2_grpc.py
index a894352..07cb78f 100644
--- a/src/buildstream/_protos/google/rpc/code_pb2_grpc.py
+++ b/src/buildstream/_protos/google/rpc/code_pb2_grpc.py
@@ -1,3 +1,2 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 import grpc
-
diff --git a/src/buildstream/_protos/google/rpc/status_pb2.py b/src/buildstream/_protos/google/rpc/status_pb2.py
index ae0be7d..04d8a81 100644
--- a/src/buildstream/_protos/google/rpc/status_pb2.py
+++ b/src/buildstream/_protos/google/rpc/status_pb2.py
@@ -2,16 +2,17 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/rpc/status.proto
 
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
 
-from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/buildstream/_protos/google/rpc/status_pb2_grpc.py b/src/buildstream/_protos/google/rpc/status_pb2_grpc.py
index a894352..07cb78f 100644
--- a/src/buildstream/_protos/google/rpc/status_pb2_grpc.py
+++ b/src/buildstream/_protos/google/rpc/status_pb2_grpc.py
@@ -1,3 +1,2 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 import grpc
-
diff --git a/src/buildstream/_remote.py b/src/buildstream/_remote.py
index d8b8e68..9fafc14 100644
--- a/src/buildstream/_remote.py
+++ b/src/buildstream/_remote.py
@@ -21,7 +21,7 @@ from urllib.parse import urlparse
 
 import grpc
 
-from ._exceptions import LoadError, ImplError, RemoteError
+from ._exceptions import ImplError, LoadError, RemoteError
 from .exceptions import LoadErrorReason
 from .types import FastEnum
 
diff --git a/src/buildstream/_scheduler/__init__.py b/src/buildstream/_scheduler/__init__.py
index d689d6e..a40adec 100644
--- a/src/buildstream/_scheduler/__init__.py
+++ b/src/buildstream/_scheduler/__init__.py
@@ -17,14 +17,12 @@
 #  Authors:
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 
+from .jobs import ElementJob, JobStatus
 from .queues import Queue, QueueStatus
-
+from .queues.artifactpushqueue import ArtifactPushQueue
+from .queues.buildqueue import BuildQueue
 from .queues.fetchqueue import FetchQueue
+from .queues.pullqueue import PullQueue
 from .queues.sourcepushqueue import SourcePushQueue
 from .queues.trackqueue import TrackQueue
-from .queues.buildqueue import BuildQueue
-from .queues.artifactpushqueue import ArtifactPushQueue
-from .queues.pullqueue import PullQueue
-
-from .scheduler import Scheduler, SchedStatus, Notification, NotificationType
-from .jobs import ElementJob, JobStatus
+from .scheduler import Notification, NotificationType, SchedStatus, Scheduler
diff --git a/src/buildstream/_scheduler/jobs/elementjob.py b/src/buildstream/_scheduler/jobs/elementjob.py
index 6e035be..e102db1 100644
--- a/src/buildstream/_scheduler/jobs/elementjob.py
+++ b/src/buildstream/_scheduler/jobs/elementjob.py
@@ -19,8 +19,7 @@
 from ruamel import yaml
 
 from ..._message import MessageType
-
-from .job import Job, ChildJob
+from .job import ChildJob, Job
 
 
 # ElementJob()
diff --git a/src/buildstream/_scheduler/jobs/job.py b/src/buildstream/_scheduler/jobs/job.py
index 78a375f..d9a39b0 100644
--- a/src/buildstream/_scheduler/jobs/job.py
+++ b/src/buildstream/_scheduler/jobs/job.py
@@ -29,11 +29,11 @@ import signal
 import sys
 import traceback
 
+from ... import _signals, utils
 # BuildStream toplevel imports
-from ..._exceptions import ImplError, BstError, set_last_task_error, SkipJob
+from ..._exceptions import BstError, ImplError, SkipJob, set_last_task_error
 from ..._message import Message, MessageType, unconditional_messages
 from ...types import FastEnum
-from ... import _signals, utils
 from .. import _multiprocessing
 
 
diff --git a/src/buildstream/_scheduler/queues/artifactpushqueue.py b/src/buildstream/_scheduler/queues/artifactpushqueue.py
index 071c6fe..1733960 100644
--- a/src/buildstream/_scheduler/queues/artifactpushqueue.py
+++ b/src/buildstream/_scheduler/queues/artifactpushqueue.py
@@ -18,10 +18,10 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 #        Jürg Billeter <ju...@codethink.co.uk>
 
+from ..._exceptions import SkipJob
+from ..resources import ResourceType
 # Local imports
 from . import Queue, QueueStatus
-from ..resources import ResourceType
-from ..._exceptions import SkipJob
 
 
 # A queue which pushes element artifacts
diff --git a/src/buildstream/_scheduler/queues/buildqueue.py b/src/buildstream/_scheduler/queues/buildqueue.py
index 5cbd5af..95cce9d 100644
--- a/src/buildstream/_scheduler/queues/buildqueue.py
+++ b/src/buildstream/_scheduler/queues/buildqueue.py
@@ -20,10 +20,10 @@
 
 from datetime import timedelta
 
-from . import Queue, QueueStatus
-from ..resources import ResourceType
 from ..._message import MessageType
 from ..jobs import JobStatus
+from ..resources import ResourceType
+from . import Queue, QueueStatus
 
 
 # A queue which assembles elements
diff --git a/src/buildstream/_scheduler/queues/fetchqueue.py b/src/buildstream/_scheduler/queues/fetchqueue.py
index 18bf392..0af00dc 100644
--- a/src/buildstream/_scheduler/queues/fetchqueue.py
+++ b/src/buildstream/_scheduler/queues/fetchqueue.py
@@ -18,10 +18,10 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 #        Jürg Billeter <ju...@codethink.co.uk>
 
+from ..jobs import JobStatus
+from ..resources import ResourceType
 # Local imports
 from . import Queue, QueueStatus
-from ..resources import ResourceType
-from ..jobs import JobStatus
 
 
 # A queue which fetches element sources
diff --git a/src/buildstream/_scheduler/queues/pullqueue.py b/src/buildstream/_scheduler/queues/pullqueue.py
index e1d6959..757619a 100644
--- a/src/buildstream/_scheduler/queues/pullqueue.py
+++ b/src/buildstream/_scheduler/queues/pullqueue.py
@@ -18,11 +18,11 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 #        Jürg Billeter <ju...@codethink.co.uk>
 
+from ..._exceptions import SkipJob
+from ..jobs import JobStatus
+from ..resources import ResourceType
 # Local imports
 from . import Queue, QueueStatus
-from ..resources import ResourceType
-from ..jobs import JobStatus
-from ..._exceptions import SkipJob
 
 
 # A queue which pulls element artifacts
diff --git a/src/buildstream/_scheduler/queues/queue.py b/src/buildstream/_scheduler/queues/queue.py
index 986ac6c..f9848fc 100644
--- a/src/buildstream/_scheduler/queues/queue.py
+++ b/src/buildstream/_scheduler/queues/queue.py
@@ -18,21 +18,20 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 #        Jürg Billeter <ju...@codethink.co.uk>
 
+import heapq
 # System imports
 import os
-from collections import deque
-import heapq
 import traceback
+from collections import deque
 from typing import TYPE_CHECKING
 
-# Local imports
-from ..jobs import ElementJob, JobStatus
-from ..resources import ResourceType
-
 # BuildStream toplevel imports
 from ..._exceptions import BstError, ImplError, set_last_task_error
 from ..._message import Message, MessageType
 from ...types import FastEnum
+# Local imports
+from ..jobs import ElementJob, JobStatus
+from ..resources import ResourceType
 
 if TYPE_CHECKING:
     from typing import List, Optional
diff --git a/src/buildstream/_scheduler/queues/sourcepushqueue.py b/src/buildstream/_scheduler/queues/sourcepushqueue.py
index 8971221..c1cc267 100644
--- a/src/buildstream/_scheduler/queues/sourcepushqueue.py
+++ b/src/buildstream/_scheduler/queues/sourcepushqueue.py
@@ -17,9 +17,9 @@
 #  Authors:
 #        Raoul Hidalgo Charman <ra...@codethink.co.uk>
 
-from . import Queue, QueueStatus
-from ..resources import ResourceType
 from ..._exceptions import SkipJob
+from ..resources import ResourceType
+from . import Queue, QueueStatus
 
 
 # A queue which pushes staged sources
diff --git a/src/buildstream/_scheduler/queues/trackqueue.py b/src/buildstream/_scheduler/queues/trackqueue.py
index d9c31ac..6657ce6 100644
--- a/src/buildstream/_scheduler/queues/trackqueue.py
+++ b/src/buildstream/_scheduler/queues/trackqueue.py
@@ -20,11 +20,10 @@
 
 # BuildStream toplevel imports
 from ...plugin import Plugin
-
+from ..jobs import JobStatus
+from ..resources import ResourceType
 # Local imports
 from . import Queue, QueueStatus
-from ..resources import ResourceType
-from ..jobs import JobStatus
 
 
 # A queue which tracks sources
diff --git a/src/buildstream/_scheduler/scheduler.py b/src/buildstream/_scheduler/scheduler.py
index 66174ad..60a6843 100644
--- a/src/buildstream/_scheduler/scheduler.py
+++ b/src/buildstream/_scheduler/scheduler.py
@@ -19,22 +19,21 @@
 #        Tristan Van Berkom <tr...@codethink.co.uk>
 #        Jürg Billeter <ju...@codethink.co.uk>
 
+import asyncio
+import datetime
 # System imports
 import os
-import asyncio
-from itertools import chain
 import signal
-import datetime
 import sys
+from itertools import chain
 
-# Local imports
-from .resources import Resources
-from .jobs import JobStatus
-from ..types import FastEnum
-from .._profile import Topics, PROFILER
 from .._message import Message, MessageType
+from .._profile import PROFILER, Topics
 from ..plugin import Plugin
-
+from ..types import FastEnum
+from .jobs import JobStatus
+# Local imports
+from .resources import Resources
 
 _MAX_TIMEOUT_TO_KILL_CHILDREN = 20  # in seconds
 
diff --git a/src/buildstream/_signals.py b/src/buildstream/_signals.py
index 03b55b0..d760aaf 100644
--- a/src/buildstream/_signals.py
+++ b/src/buildstream/_signals.py
@@ -21,11 +21,10 @@ import signal
 import sys
 import threading
 import traceback
-from contextlib import contextmanager, ExitStack
 from collections import deque
+from contextlib import ExitStack, contextmanager
 from typing import Callable, Deque
 
-
 # Global per process state for handling of sigterm/sigtstp/sigcont,
 # note that it is expected that this only ever be used by new processes
 # the scheduler starts, not the main process.
diff --git a/src/buildstream/_sourcecache.py b/src/buildstream/_sourcecache.py
index dcde0b4..cd485ce 100644
--- a/src/buildstream/_sourcecache.py
+++ b/src/buildstream/_sourcecache.py
@@ -18,15 +18,16 @@
 #        Raoul Hidalgo Charman <ra...@codethink.co.uk>
 #
 import os
+
 import grpc
 
-from ._remote import BaseRemote
-from ._cas.casremote import BlobNotFound
-from .storage._casbaseddirectory import CasBasedDirectory
-from ._basecache import BaseCache
-from ._exceptions import CASError, CASRemoteError, SourceCacheError, RemoteError
 from . import utils
+from ._basecache import BaseCache
+from ._cas.casremote import BlobNotFound
+from ._exceptions import CASError, CASRemoteError, RemoteError, SourceCacheError
 from ._protos.buildstream.v2 import buildstream_pb2, buildstream_pb2_grpc, source_pb2, source_pb2_grpc
+from ._remote import BaseRemote
+from .storage._casbaseddirectory import CasBasedDirectory
 
 
 class SourceRemote(BaseRemote):
diff --git a/src/buildstream/_stream.py b/src/buildstream/_stream.py
index 3d646a7..ffe2b63 100644
--- a/src/buildstream/_stream.py
+++ b/src/buildstream/_stream.py
@@ -20,41 +20,40 @@
 #        Tristan Maat <tr...@codethink.co.uk>
 
 import os
-import sys
-import stat
 import shlex
 import shutil
+import stat
+import sys
 import tarfile
 import tempfile
+from collections import deque
 from contextlib import contextmanager, suppress
 from fnmatch import fnmatch
-from collections import deque
 from typing import List, Tuple
 
-from ._artifactelement import verify_artifact_ref, ArtifactElement
-from ._exceptions import StreamError, ImplError, BstError, ArtifactElementError, ArtifactError
+from . import Scope, _site, _yaml, utils
+from ._artifactelement import ArtifactElement, verify_artifact_ref
+from ._exceptions import ArtifactElementError, ArtifactError, BstError, ImplError, StreamError
 from ._message import Message, MessageType
+from ._pipeline import Pipeline
+from ._profile import PROFILER, Topics
 from ._scheduler import (
-    Scheduler,
-    SchedStatus,
-    TrackQueue,
-    FetchQueue,
-    SourcePushQueue,
-    BuildQueue,
-    PullQueue,
     ArtifactPushQueue,
-    NotificationType,
-    Notification,
+    BuildQueue,
+    FetchQueue,
     JobStatus,
+    Notification,
+    NotificationType,
+    PullQueue,
+    SchedStatus,
+    Scheduler,
+    SourcePushQueue,
+    TrackQueue,
 )
-from .element import Element
-from ._pipeline import Pipeline
-from ._profile import Topics, PROFILER
 from ._state import State
-from .types import _KeyStrength, _PipelineSelection, _SchedulerErrorAction
+from .element import Element
 from .plugin import Plugin
-from . import utils, _yaml, _site
-from . import Scope
+from .types import _KeyStrength, _PipelineSelection, _SchedulerErrorAction
 
 
 # Stream()
diff --git a/src/buildstream/_workspaces.py b/src/buildstream/_workspaces.py
index a54a17f..f79f2ee 100644
--- a/src/buildstream/_workspaces.py
+++ b/src/buildstream/_workspaces.py
@@ -18,13 +18,11 @@
 #        Tristan Maat <tr...@codethink.co.uk>
 
 import os
-from . import utils
-from . import _yaml
 
+from . import _yaml, utils
 from ._exceptions import LoadError
 from .exceptions import LoadErrorReason
 
-
 BST_WORKSPACE_FORMAT_VERSION = 4
 BST_WORKSPACE_PROJECT_FORMAT_VERSION = 1
 WORKSPACE_PROJECT_FILE = ".bstproject.yaml"
diff --git a/src/buildstream/buildelement.py b/src/buildstream/buildelement.py
index aa42706..4c30b02 100644
--- a/src/buildstream/buildelement.py
+++ b/src/buildstream/buildelement.py
@@ -141,7 +141,6 @@ from .element import Element
 from .sandbox import SandboxFlags
 from .types import Scope
 
-
 # This list is preserved because of an unfortunate situation, we
 # need to remove these older commands which were secret and never
 # documented, but without breaking the cache keys.
diff --git a/src/buildstream/downloadablefilesource.py b/src/buildstream/downloadablefilesource.py
index 7c2da1c..40164ca 100644
--- a/src/buildstream/downloadablefilesource.py
+++ b/src/buildstream/downloadablefilesource.py
@@ -32,15 +32,15 @@ implementation.
 """
 
 
-import os
-import urllib.request
-import urllib.error
 import contextlib
-import shutil
 import netrc
+import os
+import shutil
+import urllib.error
+import urllib.request
 
-from .source import Source, SourceError
 from . import utils
+from .source import Source, SourceError
 
 
 class _NetrcFTPOpener(urllib.request.FTPHandler):
diff --git a/src/buildstream/element.py b/src/buildstream/element.py
index 6a0fa5f..2fb3965 100644
--- a/src/buildstream/element.py
+++ b/src/buildstream/element.py
@@ -72,42 +72,37 @@ Class Reference
 ---------------
 """
 
+import contextlib
+import copy
 import os
 import re
 import stat
-import copy
+import string
 import warnings
 from collections import OrderedDict
-import contextlib
 from contextlib import contextmanager
 from functools import partial
 from itertools import chain
-import string
-from typing import cast, TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Set
+from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Set, cast
 
 from pyroaring import BitMap  # pylint: disable=no-name-in-module
 
-from . import _yaml
+from . import _cachekey, _site, _yaml, utils
+from ._artifact import Artifact
+from ._exceptions import BstError, ImplError, LoadError, SourceCacheError
 from ._variables import Variables
 from ._versions import BST_CORE_ARTIFACT_VERSION
-from ._exceptions import BstError, LoadError, ImplError, SourceCacheError
 from .exceptions import ErrorDomain, LoadErrorReason
-from .utils import FileListResult, BST_ARBITRARY_TIMESTAMP
-from . import utils
-from . import _cachekey
-from . import _site
 from .node import Node
 from .plugin import Plugin
-from .sandbox import SandboxFlags, SandboxCommandError
+from .sandbox import SandboxCommandError, SandboxFlags
 from .sandbox._config import SandboxConfig
 from .sandbox._sandboxremote import SandboxRemote
-from .types import CoreWarnings, Scope, _CacheBuildTrees, _KeyStrength
-from ._artifact import Artifact
-
-from .storage.directory import Directory
-from .storage._filebaseddirectory import FileBasedDirectory
 from .storage._casbaseddirectory import CasBasedDirectory
-from .storage.directory import VirtualDirectoryError
+from .storage._filebaseddirectory import FileBasedDirectory
+from .storage.directory import Directory, VirtualDirectoryError
+from .types import CoreWarnings, Scope, _CacheBuildTrees, _KeyStrength
+from .utils import BST_ARBITRARY_TIMESTAMP, FileListResult
 
 if TYPE_CHECKING:
     from .node import MappingNode, ScalarNode, SequenceNode
diff --git a/src/buildstream/plugin.py b/src/buildstream/plugin.py
index 14e22e5..e2b1331 100644
--- a/src/buildstream/plugin.py
+++ b/src/buildstream/plugin.py
@@ -114,11 +114,11 @@ import os
 import subprocess
 import sys
 from contextlib import contextmanager
-from typing import Generator, Optional, Tuple, TYPE_CHECKING
+from typing import TYPE_CHECKING, Generator, Optional, Tuple
 from weakref import WeakValueDictionary
 
 from . import utils
-from ._exceptions import PluginError, ImplError
+from ._exceptions import ImplError, PluginError
 from ._message import Message, MessageType
 from .node import MappingNode, ProvenanceInformation
 from .types import CoreWarnings, SourceRef
diff --git a/src/buildstream/plugins/elements/compose.py b/src/buildstream/plugins/elements/compose.py
index 9c136df..86d3393 100644
--- a/src/buildstream/plugins/elements/compose.py
+++ b/src/buildstream/plugins/elements/compose.py
@@ -34,6 +34,7 @@ The default configuration and possible options are as such:
 """
 
 import os
+
 from buildstream import Element, Scope
 
 
diff --git a/src/buildstream/plugins/elements/import.py b/src/buildstream/plugins/elements/import.py
index de7ee8a..133edad 100644
--- a/src/buildstream/plugins/elements/import.py
+++ b/src/buildstream/plugins/elements/import.py
@@ -31,6 +31,7 @@ The empty configuration is as such:
 """
 
 import os
+
 from buildstream import Element, ElementError
 
 
diff --git a/src/buildstream/plugins/sources/bzr.py b/src/buildstream/plugins/sources/bzr.py
index 93b5544..e8e000d 100644
--- a/src/buildstream/plugins/sources/bzr.py
+++ b/src/buildstream/plugins/sources/bzr.py
@@ -54,13 +54,12 @@ See :ref:`built-in functionality doumentation <core_source_builtins>` for
 details on common configuration options for sources.
 """
 
+import fcntl
 import os
 import shutil
-import fcntl
 from contextlib import contextmanager
 
-from buildstream import Source, SourceError
-from buildstream import utils
+from buildstream import Source, SourceError, utils
 
 
 class BzrSource(Source):
diff --git a/src/buildstream/plugins/sources/local.py b/src/buildstream/plugins/sources/local.py
index ffcae49..7b4f559 100644
--- a/src/buildstream/plugins/sources/local.py
+++ b/src/buildstream/plugins/sources/local.py
@@ -37,8 +37,9 @@ details on common configuration options for sources.
 """
 
 import os
-from buildstream.storage.directory import Directory
+
 from buildstream import Source, SourceError
+from buildstream.storage.directory import Directory
 
 
 class LocalSource(Source):
diff --git a/src/buildstream/plugins/sources/patch.py b/src/buildstream/plugins/sources/patch.py
index 18672df..62a79fb 100644
--- a/src/buildstream/plugins/sources/patch.py
+++ b/src/buildstream/plugins/sources/patch.py
@@ -45,8 +45,8 @@ details on common configuration options for sources.
 """
 
 import os
-from buildstream import Source, SourceError
-from buildstream import utils
+
+from buildstream import Source, SourceError, utils
 
 
 class PatchSource(Source):
diff --git a/src/buildstream/plugins/sources/remote.py b/src/buildstream/plugins/sources/remote.py
index 9ed3099..ab89bb1 100644
--- a/src/buildstream/plugins/sources/remote.py
+++ b/src/buildstream/plugins/sources/remote.py
@@ -48,6 +48,7 @@ See :ref:`built-in functionality doumentation <core_source_builtins>` for
 details on common configuration options for sources.
 """
 import os
+
 from buildstream import DownloadableFileSource, SourceError, utils
 
 
diff --git a/src/buildstream/plugins/sources/tar.py b/src/buildstream/plugins/sources/tar.py
index aba927b..3f455b4 100644
--- a/src/buildstream/plugins/sources/tar.py
+++ b/src/buildstream/plugins/sources/tar.py
@@ -60,8 +60,7 @@ import tarfile
 from contextlib import contextmanager
 from tempfile import TemporaryFile
 
-from buildstream import DownloadableFileSource, SourceError
-from buildstream import utils
+from buildstream import DownloadableFileSource, SourceError, utils
 
 
 class ReadableTarInfo(tarfile.TarInfo):
diff --git a/src/buildstream/plugins/sources/workspace.py b/src/buildstream/plugins/sources/workspace.py
index 44d0889..129df21 100644
--- a/src/buildstream/plugins/sources/workspace.py
+++ b/src/buildstream/plugins/sources/workspace.py
@@ -37,10 +37,10 @@ workspace. The node constructed would be specified as follows:
 
 import os
 
-from buildstream.storage.directory import Directory
 from buildstream import Source, SourceError
-from buildstream.types import SourceRef
 from buildstream.node import MappingNode
+from buildstream.storage.directory import Directory
+from buildstream.types import SourceRef
 
 
 class WorkspaceSource(Source):
diff --git a/src/buildstream/plugins/sources/zip.py b/src/buildstream/plugins/sources/zip.py
index 1164259..3e5a273 100644
--- a/src/buildstream/plugins/sources/zip.py
+++ b/src/buildstream/plugins/sources/zip.py
@@ -57,11 +57,10 @@ details on common configuration options for sources.
 """
 
 import os
-import zipfile
 import stat
+import zipfile
 
-from buildstream import DownloadableFileSource, SourceError
-from buildstream import utils
+from buildstream import DownloadableFileSource, SourceError, utils
 
 
 class ZipSource(DownloadableFileSource):
diff --git a/src/buildstream/sandbox/__init__.py b/src/buildstream/sandbox/__init__.py
index 5966d19..35846fe 100644
--- a/src/buildstream/sandbox/__init__.py
+++ b/src/buildstream/sandbox/__init__.py
@@ -17,6 +17,6 @@
 #  Authors:
 #        Tristan Maat <tr...@codethink.co.uk>
 
-from .sandbox import Sandbox, SandboxFlags, SandboxCommandError
-from ._sandboxremote import SandboxRemote
 from ._sandboxdummy import SandboxDummy
+from ._sandboxremote import SandboxRemote
+from .sandbox import Sandbox, SandboxCommandError, SandboxFlags
diff --git a/src/buildstream/sandbox/_sandboxbuildboxrun.py b/src/buildstream/sandbox/_sandboxbuildboxrun.py
index 3d71b74..607c2d1 100644
--- a/src/buildstream/sandbox/_sandboxbuildboxrun.py
+++ b/src/buildstream/sandbox/_sandboxbuildboxrun.py
@@ -22,12 +22,12 @@ from contextlib import ExitStack
 
 import psutil
 
-from .. import utils, _signals
-from . import SandboxFlags
+from .. import _signals, utils
 from .._exceptions import SandboxError
 from .._message import Message, MessageType
 from .._platform import Platform
 from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
+from . import SandboxFlags
 from ._sandboxreapi import SandboxREAPI
 
 
diff --git a/src/buildstream/sandbox/_sandboxreapi.py b/src/buildstream/sandbox/_sandboxreapi.py
index 5c28515..2e3e29a 100644
--- a/src/buildstream/sandbox/_sandboxreapi.py
+++ b/src/buildstream/sandbox/_sandboxreapi.py
@@ -17,10 +17,10 @@
 import os
 import shlex
 
-from .sandbox import Sandbox, SandboxFlags, SandboxCommandError, _SandboxBatch
 from .. import utils
 from .._exceptions import ImplError, SandboxError
 from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
+from .sandbox import Sandbox, SandboxCommandError, SandboxFlags, _SandboxBatch
 
 
 # SandboxREAPI()
diff --git a/src/buildstream/sandbox/_sandboxremote.py b/src/buildstream/sandbox/_sandboxremote.py
index 41fb9e1..abcb482 100644
--- a/src/buildstream/sandbox/_sandboxremote.py
+++ b/src/buildstream/sandbox/_sandboxremote.py
@@ -21,23 +21,21 @@
 import os
 import shutil
 from collections import namedtuple
-from urllib.parse import urlparse
 from functools import partial
+from urllib.parse import urlparse
 
 import grpc
 
-from .. import utils
-from ..node import Node
+from .. import _signals, _yaml, utils
+from .._cas import CASRemote
+from .._exceptions import BstError, SandboxError
 from .._message import Message, MessageType
-from ._sandboxreapi import SandboxREAPI
-from .. import _signals
 from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2, remote_execution_pb2_grpc
-from .._protos.google.rpc import code_pb2
-from .._exceptions import BstError, SandboxError
-from .. import _yaml
 from .._protos.google.longrunning import operations_pb2, operations_pb2_grpc
-from .._cas import CASRemote
+from .._protos.google.rpc import code_pb2
 from .._remote import RemoteSpec
+from ..node import Node
+from ._sandboxreapi import SandboxREAPI
 
 
 class RemoteExecutionSpec(namedtuple("RemoteExecutionSpec", "exec_service storage_service action_service")):
diff --git a/src/buildstream/sandbox/sandbox.py b/src/buildstream/sandbox/sandbox.py
index 592866d..3465e5e 100644
--- a/src/buildstream/sandbox/sandbox.py
+++ b/src/buildstream/sandbox/sandbox.py
@@ -29,16 +29,16 @@ conform to this interface.
 See also: :ref:`sandboxing`.
 """
 
+import contextlib
 import os
 import shlex
-import contextlib
 from contextlib import contextmanager
-from typing import Dict, Generator, List, Optional, TYPE_CHECKING
+from typing import TYPE_CHECKING, Dict, Generator, List, Optional
 
-from .._exceptions import ImplError, BstError, SandboxError
+from .._exceptions import BstError, ImplError, SandboxError
 from .._message import Message, MessageType
-from ..storage.directory import Directory
 from ..storage._casbaseddirectory import CasBasedDirectory
+from ..storage.directory import Directory
 
 if TYPE_CHECKING:
     from typing import Union
diff --git a/src/buildstream/scriptelement.py b/src/buildstream/scriptelement.py
index f8deff2..270328c 100644
--- a/src/buildstream/scriptelement.py
+++ b/src/buildstream/scriptelement.py
@@ -34,7 +34,7 @@ implementations.
 
 import os
 from collections import OrderedDict
-from typing import List, Optional, TYPE_CHECKING
+from typing import TYPE_CHECKING, List, Optional
 
 from .element import Element, ElementError
 from .sandbox import SandboxFlags
diff --git a/src/buildstream/source.py b/src/buildstream/source.py
index f15d5a6..9726d25 100644
--- a/src/buildstream/source.py
+++ b/src/buildstream/source.py
@@ -159,21 +159,20 @@ Class Reference
 
 import os
 from contextlib import contextmanager
-from typing import Iterable, Iterator, Optional, Tuple, TYPE_CHECKING
+from typing import TYPE_CHECKING, Iterable, Iterator, Optional, Tuple
 
 from . import _yaml, utils
-from .node import MappingNode
-from .plugin import Plugin
-from .types import SourceRef, Union, List
+from ._cachekey import generate_key
 from ._exceptions import BstError, ImplError, PluginError
-from .exceptions import ErrorDomain
 from ._loader.metasource import MetaSource
 from ._projectrefs import ProjectRefStorage
-from ._cachekey import generate_key
-from .storage import CasBasedDirectory
-from .storage import FileBasedDirectory
-from .storage.directory import Directory, VirtualDirectoryError
 from ._variables import Variables
+from .exceptions import ErrorDomain
+from .node import MappingNode
+from .plugin import Plugin
+from .storage import CasBasedDirectory, FileBasedDirectory
+from .storage.directory import Directory, VirtualDirectoryError
+from .types import List, SourceRef, Union
 
 if TYPE_CHECKING:
     from typing import Any, Dict, Set
diff --git a/src/buildstream/storage/__init__.py b/src/buildstream/storage/__init__.py
index 5571cd8..d1fabe4 100644
--- a/src/buildstream/storage/__init__.py
+++ b/src/buildstream/storage/__init__.py
@@ -18,6 +18,6 @@
 #  Authors:
 #        Jim MacArthur <ji...@codethink.co.uk>
 
-from ._filebaseddirectory import FileBasedDirectory
 from ._casbaseddirectory import CasBasedDirectory
+from ._filebaseddirectory import FileBasedDirectory
 from .directory import Directory
diff --git a/src/buildstream/storage/_casbaseddirectory.py b/src/buildstream/storage/_casbaseddirectory.py
index 72a6bee..6a55ad6 100644
--- a/src/buildstream/storage/_casbaseddirectory.py
+++ b/src/buildstream/storage/_casbaseddirectory.py
@@ -32,13 +32,14 @@ import stat
 import tarfile as tarfilelib
 from contextlib import contextmanager
 from io import StringIO
+
 from google.protobuf import timestamp_pb2
 
 from .. import utils
 from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
-from .directory import Directory, VirtualDirectoryError, _FileType
+from ..utils import BST_ARBITRARY_TIMESTAMP, FileListResult
 from ._filebaseddirectory import FileBasedDirectory
-from ..utils import FileListResult, BST_ARBITRARY_TIMESTAMP
+from .directory import Directory, VirtualDirectoryError, _FileType
 
 
 class IndexEntry:
diff --git a/src/buildstream/storage/_filebaseddirectory.py b/src/buildstream/storage/_filebaseddirectory.py
index 3f1fc59..ad3befa 100644
--- a/src/buildstream/storage/_filebaseddirectory.py
+++ b/src/buildstream/storage/_filebaseddirectory.py
@@ -31,11 +31,18 @@ import os
 import shutil
 import stat
 
-from .directory import Directory, VirtualDirectoryError, _FileType
 from .. import utils
-from ..utils import link_files, copy_files, list_relative_paths, _get_link_mtime, BST_ARBITRARY_TIMESTAMP
-from ..utils import _set_deterministic_user, _set_deterministic_mtime
-from ..utils import FileListResult
+from ..utils import (
+    BST_ARBITRARY_TIMESTAMP,
+    FileListResult,
+    _get_link_mtime,
+    _set_deterministic_mtime,
+    _set_deterministic_user,
+    copy_files,
+    link_files,
+    list_relative_paths,
+)
+from .directory import Directory, VirtualDirectoryError, _FileType
 
 # FileBasedDirectory intentionally doesn't call its superclass constuctor,
 # which is meant to be unimplemented.
diff --git a/src/buildstream/storage/directory.py b/src/buildstream/storage/directory.py
index f9ea404..5aed774 100644
--- a/src/buildstream/storage/directory.py
+++ b/src/buildstream/storage/directory.py
@@ -34,7 +34,7 @@ See also: :ref:`sandboxing`.
 
 import os
 import stat
-from typing import Callable, Optional, Union, List
+from typing import Callable, List, Optional, Union
 
 from .._exceptions import BstError
 from ..exceptions import ErrorDomain
diff --git a/src/buildstream/testing/__init__.py b/src/buildstream/testing/__init__.py
index f09c5bd..65b7b07 100644
--- a/src/buildstream/testing/__init__.py
+++ b/src/buildstream/testing/__init__.py
@@ -21,13 +21,15 @@ This package contains various utilities which make it easier to test plugins.
 
 import os
 from collections import OrderedDict
-from buildstream.exceptions import ErrorDomain, LoadErrorReason
+
 from buildstream._yaml import load as load_yaml  # type: ignore
-from ._yaml import generate_project, generate_element
+from buildstream.exceptions import ErrorDomain, LoadErrorReason
+
+from ._cachekeys import check_cache_key_stability
+from ._yaml import generate_element, generate_project
+from .integration import integration_cache
 from .repo import Repo
 from .runcli import cli, cli_integration, cli_remote_execution
-from .integration import integration_cache
-from ._cachekeys import check_cache_key_stability
 
 __all__ = [
     "check_cache_key_stability",
diff --git a/src/buildstream/testing/_fixtures.py b/src/buildstream/testing/_fixtures.py
index 5da51bb..dd7c5e9 100644
--- a/src/buildstream/testing/_fixtures.py
+++ b/src/buildstream/testing/_fixtures.py
@@ -19,6 +19,7 @@ import pytest
 
 from buildstream import node, utils
 
+
 # Catch tests that don't shut down background threads, which could then lead
 # to other tests hanging when BuildStream uses fork().
 @pytest.fixture(autouse=True)
diff --git a/src/buildstream/testing/_sourcetests/build_checkout.py b/src/buildstream/testing/_sourcetests/build_checkout.py
index 782d998..76b97ab 100644
--- a/src/buildstream/testing/_sourcetests/build_checkout.py
+++ b/src/buildstream/testing/_sourcetests/build_checkout.py
@@ -20,11 +20,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.testing import create_repo
-from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream import _yaml
+from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import create_repo
+
 from .utils import kind  # pylint: disable=unused-import
 
 # Project directory
diff --git a/src/buildstream/testing/_sourcetests/conftest.py b/src/buildstream/testing/_sourcetests/conftest.py
index 64dd404..88b623d 100644
--- a/src/buildstream/testing/_sourcetests/conftest.py
+++ b/src/buildstream/testing/_sourcetests/conftest.py
@@ -14,4 +14,5 @@
 #  You should have received a copy of the GNU Lesser General Public
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 
-from .._fixtures import reset_global_node_state, thread_check  # pylint: disable=unused-import
+from .._fixtures import reset_global_node_state  # pylint: disable=unused-import
+from .._fixtures import thread_check
diff --git a/src/buildstream/testing/_sourcetests/fetch.py b/src/buildstream/testing/_sourcetests/fetch.py
index 05b43d7..fbc0df0 100644
--- a/src/buildstream/testing/_sourcetests/fetch.py
+++ b/src/buildstream/testing/_sourcetests/fetch.py
@@ -20,15 +20,16 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
-from .._utils import generate_junction
-from .. import create_repo
+
 from .. import cli  # pylint: disable=unused-import
-from .utils import update_project_configuration
+from .. import create_repo
+from .._utils import generate_junction
 from .utils import kind  # pylint: disable=unused-import
-
+from .utils import update_project_configuration
 
 # Project directory
 TOP_DIR = os.path.dirname(os.path.realpath(__file__))
diff --git a/src/buildstream/testing/_sourcetests/mirror.py b/src/buildstream/testing/_sourcetests/mirror.py
index 6904274..fd07612 100644
--- a/src/buildstream/testing/_sourcetests/mirror.py
+++ b/src/buildstream/testing/_sourcetests/mirror.py
@@ -20,13 +20,15 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain
-from .._utils import generate_junction
-from .. import create_repo
+
 from .. import cli  # pylint: disable=unused-import
+from .. import create_repo
+from .._utils import generate_junction
 from .utils import kind  # pylint: disable=unused-import
 
 # Project directory
diff --git a/src/buildstream/testing/_sourcetests/source_determinism.py b/src/buildstream/testing/_sourcetests/source_determinism.py
index b834f32..e7f3080 100644
--- a/src/buildstream/testing/_sourcetests/source_determinism.py
+++ b/src/buildstream/testing/_sourcetests/source_determinism.py
@@ -20,12 +20,14 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
-from .._utils.site import HAVE_SANDBOX, CASD_SEPARATE_USER
-from .. import create_repo
+
 from .. import cli  # pylint: disable=unused-import
+from .. import create_repo
+from .._utils.site import CASD_SEPARATE_USER, HAVE_SANDBOX
 from .utils import kind  # pylint: disable=unused-import
 
 # Project directory
diff --git a/src/buildstream/testing/_sourcetests/track.py b/src/buildstream/testing/_sourcetests/track.py
index ecb508b..25a2b91 100644
--- a/src/buildstream/testing/_sourcetests/track.py
+++ b/src/buildstream/testing/_sourcetests/track.py
@@ -20,16 +20,17 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain
-from .._utils import generate_junction
-from .. import create_repo
+
 from .. import cli  # pylint: disable=unused-import
-from .utils import update_project_configuration
+from .. import create_repo
+from .._utils import generate_junction
 from .utils import kind  # pylint: disable=unused-import
-
+from .utils import update_project_configuration
 
 # Project directory
 TOP_DIR = os.path.dirname(os.path.realpath(__file__))
diff --git a/src/buildstream/testing/_sourcetests/track_cross_junction.py b/src/buildstream/testing/_sourcetests/track_cross_junction.py
index 2c41419..89917ac 100644
--- a/src/buildstream/testing/_sourcetests/track_cross_junction.py
+++ b/src/buildstream/testing/_sourcetests/track_cross_junction.py
@@ -24,12 +24,12 @@ import os
 import pytest
 
 from buildstream import _yaml
-from .._utils import generate_junction
-from .. import create_repo, ALL_REPO_KINDS
+
 from .. import cli  # pylint: disable=unused-import
+from .. import ALL_REPO_KINDS, create_repo
+from .._utils import generate_junction
 from .utils import add_plugins_conf
 
-
 # Project directory
 TOP_DIR = os.path.dirname(os.path.realpath(__file__))
 DATA_DIR = os.path.join(TOP_DIR, "project")
diff --git a/src/buildstream/testing/_sourcetests/utils.py b/src/buildstream/testing/_sourcetests/utils.py
index 4cfb696..1331ae1 100644
--- a/src/buildstream/testing/_sourcetests/utils.py
+++ b/src/buildstream/testing/_sourcetests/utils.py
@@ -21,6 +21,10 @@
 
 import os
 
+from buildstream import _yaml
+
+from .. import ALL_REPO_KINDS
+
 # To make use of these test utilities it is necessary to have pytest
 # available. However, we don't want to have a hard dependency on
 # pytest.
@@ -31,9 +35,6 @@ except ImportError:
     msg = "Could not import pytest:\n" "To use the {} module, you must have pytest installed.".format(module_name)
     raise ImportError(msg)
 
-from buildstream import _yaml
-from .. import ALL_REPO_KINDS
-
 
 # kind()
 #
diff --git a/src/buildstream/testing/_sourcetests/workspace.py b/src/buildstream/testing/_sourcetests/workspace.py
index 3520a8c..35418af 100644
--- a/src/buildstream/testing/_sourcetests/workspace.py
+++ b/src/buildstream/testing/_sourcetests/workspace.py
@@ -21,11 +21,13 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream import _yaml
-from .. import create_repo
+
 from .. import cli  # pylint: disable=unused-import
+from .. import create_repo
 from .utils import kind  # pylint: disable=unused-import
 
 # Project directory
diff --git a/src/buildstream/testing/_update_cachekeys.py b/src/buildstream/testing/_update_cachekeys.py
index 219e17f..e588f98 100755
--- a/src/buildstream/testing/_update_cachekeys.py
+++ b/src/buildstream/testing/_update_cachekeys.py
@@ -32,7 +32,7 @@ import os
 import tempfile
 from unittest import mock
 
-from buildstream.testing._cachekeys import _element_filename, _parse_output_keys, _load_expected_keys
+from buildstream.testing._cachekeys import _element_filename, _load_expected_keys, _parse_output_keys
 from buildstream.testing.runcli import Cli
 
 
diff --git a/src/buildstream/testing/_utils/junction.py b/src/buildstream/testing/_utils/junction.py
index 8f80ed6..8e48254 100644
--- a/src/buildstream/testing/_utils/junction.py
+++ b/src/buildstream/testing/_utils/junction.py
@@ -1,9 +1,11 @@
 import subprocess
+
 import pytest
 
 from buildstream import _yaml
+
 from .. import Repo
-from .site import HAVE_GIT, GIT, GIT_ENV
+from .site import GIT, GIT_ENV, HAVE_GIT
 
 
 # generate_junction()
diff --git a/src/buildstream/testing/_utils/site.py b/src/buildstream/testing/_utils/site.py
index d8ace85..a9b2f53 100644
--- a/src/buildstream/testing/_utils/site.py
+++ b/src/buildstream/testing/_utils/site.py
@@ -7,10 +7,9 @@ import subprocess
 import sys
 from typing import Optional  # pylint: disable=unused-import
 
-from buildstream import utils, ProgramNotFoundError
+from buildstream import ProgramNotFoundError, utils
 from buildstream._platform import Platform
 
-
 try:
     GIT = utils.get_host_tool("git")  # type: Optional[str]
     HAVE_GIT = True
diff --git a/src/buildstream/testing/runcli.py b/src/buildstream/testing/runcli.py
index 1e86860..9cb2667 100644
--- a/src/buildstream/testing/runcli.py
+++ b/src/buildstream/testing/runcli.py
@@ -29,17 +29,16 @@ runcli - Test fixtures used for running BuildStream commands
 """
 
 
+import itertools
 import os
 import re
-import sys
 import shutil
+import sys
 import tempfile
-import itertools
 import traceback
-from contextlib import contextmanager, ExitStack
-from ruamel import yaml
-import pytest
+from contextlib import ExitStack, contextmanager
 
+import pytest
 # XXX Using pytest private internals here
 #
 # We use pytest internals to capture the stdout/stderr during
@@ -47,17 +46,17 @@ import pytest
 # CliRunner convenience API (click.testing module) does not support
 # separation of stdout/stderr.
 #
-from _pytest.capture import MultiCapture, FDCapture, FDCaptureBinary
+from _pytest.capture import FDCapture, FDCaptureBinary, MultiCapture
+from ruamel import yaml
 
-# Import the main cli entrypoint
-from buildstream._frontend import cli as bst_cli
 from buildstream import _yaml, node
 from buildstream._cas import CASCache
-from buildstream.element import _get_normal_name, _compose_artifact_name
-
 # Special private exception accessor, for test case purposes
 from buildstream._exceptions import BstError, get_last_exception, get_last_task_error
+# Import the main cli entrypoint
+from buildstream._frontend import cli as bst_cli
 from buildstream._protos.buildstream.v2 import artifact_pb2
+from buildstream.element import _compose_artifact_name, _get_normal_name
 
 
 # Wrapper for the click.testing result
diff --git a/src/buildstream/utils.py b/src/buildstream/utils.py
index 9c6761c..0d3d842 100644
--- a/src/buildstream/utils.py
+++ b/src/buildstream/utils.py
@@ -22,36 +22,35 @@ Utilities
 """
 
 import calendar
+import datetime
 import errno
 import hashlib
+import itertools
 import math
 import os
 import re
 import shutil
 import signal
 import stat
-from stat import S_ISDIR
 import subprocess
 import tempfile
 import time
-import datetime
-import itertools
 from contextlib import contextmanager
 from pathlib import Path
-from typing import Callable, IO, Iterable, Iterator, Optional, Tuple, Union
-from dateutil import parser as dateutil_parser
-from google.protobuf import timestamp_pb2
+from stat import S_ISDIR
+from typing import IO, Callable, Iterable, Iterator, Optional, Tuple, Union
 
 import psutil
+from dateutil import parser as dateutil_parser
+from google.protobuf import timestamp_pb2
 
 from . import _signals
 from ._exceptions import BstError
-from .exceptions import ErrorDomain
 from ._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
-
 # Contains utils that have been rewritten in Cython for speed benefits
 # This makes them available when importing from utils
 from ._utils import url_directory_name  # pylint: disable=unused-import
+from .exceptions import ErrorDomain
 
 # The magic number for timestamps: 2011-11-11 11:11:11
 BST_ARBITRARY_TIMESTAMP = calendar.timegm((2011, 11, 11, 11, 11, 11))
diff --git a/tests/artifactcache/artifactservice.py b/tests/artifactcache/artifactservice.py
index c640665..7da7bd8 100644
--- a/tests/artifactcache/artifactservice.py
+++ b/tests/artifactcache/artifactservice.py
@@ -22,10 +22,10 @@ from urllib.parse import urlparse
 import grpc
 import pytest
 
+from buildstream import utils
+from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as re_pb2
 from buildstream._protos.buildstream.v2.artifact_pb2 import Artifact, GetArtifactRequest, UpdateArtifactRequest
 from buildstream._protos.buildstream.v2.artifact_pb2_grpc import ArtifactServiceStub
-from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as re_pb2
-from buildstream import utils
 
 from tests.testutils.artifactshare import create_artifact_share
 
diff --git a/tests/artifactcache/capabilities.py b/tests/artifactcache/capabilities.py
index c8a49f9..be3541a 100644
--- a/tests/artifactcache/capabilities.py
+++ b/tests/artifactcache/capabilities.py
@@ -4,15 +4,14 @@
 import os
 
 import pytest
-from buildstream._project import Project
 
 from buildstream import _yaml
+from buildstream._project import Project
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
-from tests.testutils import dummy_context
 
+from tests.testutils import dummy_context
 from tests.testutils.artifactshare import create_dummy_artifact_share
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
 
diff --git a/tests/artifactcache/config.py b/tests/artifactcache/config.py
index 24d5558..57e167a 100644
--- a/tests/artifactcache/config.py
+++ b/tests/artifactcache/config.py
@@ -6,18 +6,16 @@ import os
 
 import pytest
 
-from buildstream._remote import RemoteSpec, RemoteType
+from buildstream import _yaml
 from buildstream._artifactcache import ArtifactCache
 from buildstream._project import Project
-from buildstream.utils import _deduplicate
-from buildstream import _yaml
+from buildstream._remote import RemoteSpec, RemoteType
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
-
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
+from buildstream.utils import _deduplicate
 
 from tests.testutils import dummy_context
 
-
 DATA_DIR = os.path.dirname(os.path.realpath(__file__))
 cache1 = RemoteSpec(url="https://example.com/cache1", push=True)
 cache2 = RemoteSpec(url="https://example.com/cache2", push=False)
diff --git a/tests/artifactcache/expiry.py b/tests/artifactcache/expiry.py
index f2be797..d33f367 100644
--- a/tests/artifactcache/expiry.py
+++ b/tests/artifactcache/expiry.py
@@ -31,7 +31,6 @@ from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import create_element_size, wait_for_cache_granularity
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "expiry")
 
 
diff --git a/tests/artifactcache/junctions.py b/tests/artifactcache/junctions.py
index df7ee94..14a700b 100644
--- a/tests/artifactcache/junctions.py
+++ b/tests/artifactcache/junctions.py
@@ -3,13 +3,13 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.testing import cli  # pylint: disable=unused-import
 
-from tests.testutils import create_artifact_share, assert_shared, assert_not_shared
-
+from tests.testutils import assert_not_shared, assert_shared, create_artifact_share
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "junctions",)
 
diff --git a/tests/artifactcache/pull.py b/tests/artifactcache/pull.py
index e6eaec9..8617257 100644
--- a/tests/artifactcache/pull.py
+++ b/tests/artifactcache/pull.py
@@ -12,7 +12,6 @@ from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import create_artifact_share, dummy_context
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/artifactcache/push.py b/tests/artifactcache/push.py
index 7160e05..7628766 100644
--- a/tests/artifactcache/push.py
+++ b/tests/artifactcache/push.py
@@ -5,14 +5,13 @@ import os
 
 import pytest
 
-from buildstream import _yaml, Scope
+from buildstream import Scope, _yaml
 from buildstream._project import Project
 from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
 from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import create_artifact_share, create_split_share, dummy_context
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/cachekey/cachekey.py b/tests/cachekey/cachekey.py
index 9519722..84f1dcc 100644
--- a/tests/cachekey/cachekey.py
+++ b/tests/cachekey/cachekey.py
@@ -39,17 +39,16 @@
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
 
-from collections import OrderedDict
 import os
+from collections import OrderedDict
 
 import pytest
 
-from buildstream.testing._cachekeys import check_cache_key_stability, _parse_output_keys
-from buildstream.testing.runcli import cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import HAVE_BZR, HAVE_GIT, IS_LINUX, MACHINE_ARCH
-from buildstream.plugin import CoreWarnings
 from buildstream import _yaml
-
+from buildstream.plugin import CoreWarnings
+from buildstream.testing._cachekeys import _parse_output_keys, check_cache_key_stability
+from buildstream.testing._utils.site import HAVE_BZR, HAVE_GIT, IS_LINUX, MACHINE_ARCH
+from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
diff --git a/tests/conftest.py b/tests/conftest.py
index bb4611a..14c5d0d 100755
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -28,13 +28,11 @@ from buildstream.testing import register_repo_kind, sourcetests_collection_hook
 from buildstream.testing._fixtures import reset_global_node_state, thread_check  # pylint: disable=unused-import
 from buildstream.testing.integration import integration_cache  # pylint: disable=unused-import
 
-
-from tests.testutils.repo.git import Git
 from tests.testutils.repo.bzr import Bzr
+from tests.testutils.repo.git import Git
 from tests.testutils.repo.tar import Tar
 from tests.testutils.repo.zip import Zip
 
-
 #
 # This file is loaded by pytest, we use it to add a custom
 # `--integration` option to our test suite, and to install
diff --git a/tests/elements/filter.py b/tests/elements/filter.py
index 3bc24c2..ee0d726 100644
--- a/tests/elements/filter.py
+++ b/tests/elements/filter.py
@@ -6,10 +6,10 @@ import shutil
 
 import pytest
 
-from buildstream.testing import create_repo
-from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream.exceptions import ErrorDomain
 from buildstream import _yaml
+from buildstream.exceptions import ErrorDomain
+from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import create_repo
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "filter",)
 
diff --git a/tests/examples/autotools.py b/tests/examples/autotools.py
index c2cd054..9dcb6e2 100644
--- a/tests/examples/autotools.py
+++ b/tests/examples/autotools.py
@@ -2,11 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
+from buildstream.testing._utils.site import HAVE_SANDBOX, IS_LINUX, MACHINE_ARCH
 from buildstream.testing.integration import assert_contains
-from buildstream.testing._utils.site import IS_LINUX, MACHINE_ARCH, HAVE_SANDBOX
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/examples/developing.py b/tests/examples/developing.py
index 90d33bf..5c69dbe 100644
--- a/tests/examples/developing.py
+++ b/tests/examples/developing.py
@@ -2,11 +2,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
+from buildstream.testing._utils.site import HAVE_SANDBOX, IS_LINUX, MACHINE_ARCH
 from buildstream.testing.integration import assert_contains
-from buildstream.testing._utils.site import IS_LINUX, MACHINE_ARCH, HAVE_SANDBOX
+
 import tests.testutils.patch as patch
 
 pytestmark = pytest.mark.integration
diff --git a/tests/examples/first-project.py b/tests/examples/first-project.py
index 8783c4a..259f019 100644
--- a/tests/examples/first-project.py
+++ b/tests/examples/first-project.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing.integration import assert_contains
 from buildstream.testing._utils.site import IS_LINUX
-
+from buildstream.testing.integration import assert_contains
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/examples/flatpak-autotools.py b/tests/examples/flatpak-autotools.py
index d20c7e1..29a8bb7 100644
--- a/tests/examples/flatpak-autotools.py
+++ b/tests/examples/flatpak-autotools.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing.integration import assert_contains
 from buildstream.testing._utils.site import IS_LINUX, MACHINE_ARCH
-
+from buildstream.testing.integration import assert_contains
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/examples/integration-commands.py b/tests/examples/integration-commands.py
index ad270d0..7e3bd7a 100644
--- a/tests/examples/integration-commands.py
+++ b/tests/examples/integration-commands.py
@@ -2,11 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import IS_LINUX, MACHINE_ARCH, HAVE_SANDBOX
-
+from buildstream.testing._utils.site import HAVE_SANDBOX, IS_LINUX, MACHINE_ARCH
 
 pytestmark = pytest.mark.integration
 DATA_DIR = os.path.join(
diff --git a/tests/examples/junctions.py b/tests/examples/junctions.py
index 1bfc9cd..3fc5749 100644
--- a/tests/examples/junctions.py
+++ b/tests/examples/junctions.py
@@ -2,10 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import IS_LINUX, MACHINE_ARCH, HAVE_SANDBOX
+from buildstream.testing._utils.site import HAVE_SANDBOX, IS_LINUX, MACHINE_ARCH
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/examples/running-commands.py b/tests/examples/running-commands.py
index 9f60b72..9929d32 100644
--- a/tests/examples/running-commands.py
+++ b/tests/examples/running-commands.py
@@ -2,11 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import IS_LINUX, MACHINE_ARCH, HAVE_SANDBOX
-
+from buildstream.testing._utils.site import HAVE_SANDBOX, IS_LINUX, MACHINE_ARCH
 
 pytestmark = pytest.mark.integration
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "..", "doc", "examples", "running-commands")
diff --git a/tests/format/assertion.py b/tests/format/assertion.py
index 3ca5072..44330b8 100644
--- a/tests/format/assertion.py
+++ b/tests/format/assertion.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
diff --git a/tests/format/dependencies.py b/tests/format/dependencies.py
index b1a6840..ada120b 100644
--- a/tests/format/dependencies.py
+++ b/tests/format/dependencies.py
@@ -2,6 +2,7 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
diff --git a/tests/format/include.py b/tests/format/include.py
index d57dd8c..f78ee83 100644
--- a/tests/format/include.py
+++ b/tests/format/include.py
@@ -3,13 +3,15 @@
 
 import os
 import textwrap
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
-from tests.testutils import generate_junction
 
+from tests.testutils import generate_junction
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "include")
diff --git a/tests/format/include_composition.py b/tests/format/include_composition.py
index 3224822..d87d807 100644
--- a/tests/format/include_composition.py
+++ b/tests/format/include_composition.py
@@ -1,10 +1,9 @@
 import os
-
 from contextlib import contextmanager
 
-from buildstream._project import Project
-from buildstream._includes import Includes
 from buildstream import _yaml
+from buildstream._includes import Includes
+from buildstream._project import Project
 
 from tests.testutils import dummy_context
 
diff --git a/tests/format/invalid_keys.py b/tests/format/invalid_keys.py
index b2bab19..cc12c08 100644
--- a/tests/format/invalid_keys.py
+++ b/tests/format/invalid_keys.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
diff --git a/tests/format/junctions.py b/tests/format/junctions.py
index f5858f7..099c7aa 100644
--- a/tests/format/junctions.py
+++ b/tests/format/junctions.py
@@ -10,7 +10,6 @@ from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "junctions",)
 
 
diff --git a/tests/format/link.py b/tests/format/link.py
index e2c9e0b..2be5861 100644
--- a/tests/format/link.py
+++ b/tests/format/link.py
@@ -5,9 +5,8 @@ import os
 
 import pytest
 
-from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
-
+from buildstream.testing import cli  # pylint: disable=unused-import
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "link",)
 
diff --git a/tests/format/listdirectiveerrors.py b/tests/format/listdirectiveerrors.py
index 77d9b3f..9e4fdae 100644
--- a/tests/format/listdirectiveerrors.py
+++ b/tests/format/listdirectiveerrors.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
diff --git a/tests/format/option-list-directive.py b/tests/format/option-list-directive.py
index 2df5b6f..313741a 100644
--- a/tests/format/option-list-directive.py
+++ b/tests/format/option-list-directive.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 # Project directory
diff --git a/tests/format/optionbool.py b/tests/format/optionbool.py
index 6f56249..75e2ebd 100644
--- a/tests/format/optionbool.py
+++ b/tests/format/optionbool.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
diff --git a/tests/format/optioneltmask.py b/tests/format/optioneltmask.py
index c5b32d1..52deebe 100644
--- a/tests/format/optioneltmask.py
+++ b/tests/format/optioneltmask.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
diff --git a/tests/format/optionenum.py b/tests/format/optionenum.py
index b525347..5dc336e 100644
--- a/tests/format/optionenum.py
+++ b/tests/format/optionenum.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
diff --git a/tests/format/optionexports.py b/tests/format/optionexports.py
index 4f95dc1..8731b90 100644
--- a/tests/format/optionexports.py
+++ b/tests/format/optionexports.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
diff --git a/tests/format/optionflags.py b/tests/format/optionflags.py
index a3c310f..9f87572 100644
--- a/tests/format/optionflags.py
+++ b/tests/format/optionflags.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
diff --git a/tests/format/optionoverrides.py b/tests/format/optionoverrides.py
index ba12e75..dc99908 100644
--- a/tests/format/optionoverrides.py
+++ b/tests/format/optionoverrides.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
diff --git a/tests/format/options.py b/tests/format/options.py
index 4af3495..8920da8 100644
--- a/tests/format/options.py
+++ b/tests/format/options.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
diff --git a/tests/format/project.py b/tests/format/project.py
index d3de672..83063a3 100644
--- a/tests/format/project.py
+++ b/tests/format/project.py
@@ -2,14 +2,15 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import filetypegenerator
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
 
diff --git a/tests/format/projectoverrides.py b/tests/format/projectoverrides.py
index 16aad2c..d25725c 100644
--- a/tests/format/projectoverrides.py
+++ b/tests/format/projectoverrides.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream import _yaml
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
diff --git a/tests/format/substitutions.py b/tests/format/substitutions.py
index 265f13e..0266195 100644
--- a/tests/format/substitutions.py
+++ b/tests/format/substitutions.py
@@ -2,9 +2,10 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
-from buildstream.testing import cli  # pylint: disable=unused-import
 
+from buildstream.testing import cli  # pylint: disable=unused-import
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project", "default")
 
diff --git a/tests/format/variables.py b/tests/format/variables.py
index c5e8eeb..eb77aab 100644
--- a/tests/format/variables.py
+++ b/tests/format/variables.py
@@ -10,7 +10,6 @@ from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "variables")
 
diff --git a/tests/frontend/__init__.py b/tests/frontend/__init__.py
index 65ecda3..dbaf956 100644
--- a/tests/frontend/__init__.py
+++ b/tests/frontend/__init__.py
@@ -1,4 +1,5 @@
 import os
+
 from buildstream import _yaml
 
 
diff --git a/tests/frontend/artifact_delete.py b/tests/frontend/artifact_delete.py
index 2651f56..ecaea35 100644
--- a/tests/frontend/artifact_delete.py
+++ b/tests/frontend/artifact_delete.py
@@ -19,13 +19,14 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.element import _get_normal_name
 from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
-from tests.testutils import create_artifact_share
 
+from tests.testutils import create_artifact_share
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
diff --git a/tests/frontend/artifact_list_contents.py b/tests/frontend/artifact_list_contents.py
index 8bd7bde..aec3953 100644
--- a/tests/frontend/artifact_list_contents.py
+++ b/tests/frontend/artifact_list_contents.py
@@ -19,11 +19,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli  # pylint: disable=unused-import
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/frontend/artifact_log.py b/tests/frontend/artifact_log.py
index 6ea610a..0bc07bc 100644
--- a/tests/frontend/artifact_log.py
+++ b/tests/frontend/artifact_log.py
@@ -19,11 +19,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli  # pylint: disable=unused-import
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/frontend/artifact_show.py b/tests/frontend/artifact_show.py
index de9b78c..fa3f09a 100644
--- a/tests/frontend/artifact_show.py
+++ b/tests/frontend/artifact_show.py
@@ -19,12 +19,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
-from tests.testutils import create_artifact_share
 
+from tests.testutils import create_artifact_share
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py
index ca88a13..5830fc8 100644
--- a/tests/frontend/buildcheckout.py
+++ b/tests/frontend/buildcheckout.py
@@ -1,21 +1,20 @@
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
 
-import os
-import tarfile
 import hashlib
+import os
 import re
+import tarfile
 
 import pytest
 
+from buildstream import _yaml, utils
+from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
-from buildstream.testing._utils.site import IS_WINDOWS, CASD_SEPARATE_USER
-from buildstream import _yaml
-from buildstream.exceptions import ErrorDomain, LoadErrorReason
-from buildstream import utils
+from buildstream.testing._utils.site import CASD_SEPARATE_USER, IS_WINDOWS
 
-from tests.testutils import generate_junction, create_artifact_share
+from tests.testutils import create_artifact_share, generate_junction
 
 from . import configure_project
 
diff --git a/tests/frontend/completions.py b/tests/frontend/completions.py
index a5e3c8e..af26a98 100644
--- a/tests/frontend/completions.py
+++ b/tests/frontend/completions.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.testing import cli  # pylint: disable=unused-import
 
 # Project directory
diff --git a/tests/frontend/compose_splits.py b/tests/frontend/compose_splits.py
index d333b03..33af86d 100644
--- a/tests/frontend/compose_splits.py
+++ b/tests/frontend/compose_splits.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 # Project directory
diff --git a/tests/frontend/configurable_warnings.py b/tests/frontend/configurable_warnings.py
index 53409a5..2002691 100644
--- a/tests/frontend/configurable_warnings.py
+++ b/tests/frontend/configurable_warnings.py
@@ -5,9 +5,9 @@ import os
 
 import pytest
 
-from buildstream.plugin import CoreWarnings
-from buildstream.exceptions import ErrorDomain
 from buildstream import _yaml
+from buildstream.exceptions import ErrorDomain
+from buildstream.plugin import CoreWarnings
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 TOP_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "configuredwarning")
diff --git a/tests/frontend/cross_junction_workspace.py b/tests/frontend/cross_junction_workspace.py
index 5e25d1f..ac7746e 100644
--- a/tests/frontend/cross_junction_workspace.py
+++ b/tests/frontend/cross_junction_workspace.py
@@ -2,9 +2,10 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
+from buildstream import _yaml
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
-from buildstream import _yaml
 
 
 def prepare_junction_project(cli, tmpdir):
diff --git a/tests/frontend/default_target.py b/tests/frontend/default_target.py
index bb7a495..540c254 100644
--- a/tests/frontend/default_target.py
+++ b/tests/frontend/default_target.py
@@ -7,6 +7,7 @@ import pytest
 
 from buildstream import _yaml
 from buildstream.testing import cli, create_repo  # pylint: disable=unused-import
+
 from tests.testutils import create_artifact_share
 
 # project directory
diff --git a/tests/frontend/fetch.py b/tests/frontend/fetch.py
index b2c9d64..1d498d0 100644
--- a/tests/frontend/fetch.py
+++ b/tests/frontend/fetch.py
@@ -2,12 +2,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream.testing import generate_project
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import generate_project
 
 from tests.testutils import generate_junction
 
diff --git a/tests/frontend/help.py b/tests/frontend/help.py
index 20a9316..cc21c6b 100644
--- a/tests/frontend/help.py
+++ b/tests/frontend/help.py
@@ -2,6 +2,7 @@
 # pylint: disable=redefined-outer-name
 
 import pytest
+
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 
diff --git a/tests/frontend/init.py b/tests/frontend/init.py
index 3f897fb..a4716b1 100644
--- a/tests/frontend/init.py
+++ b/tests/frontend/init.py
@@ -2,13 +2,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
-from buildstream.testing import cli  # pylint: disable=unused-import
 
-from buildstream import _yaml
-from buildstream import utils
+from buildstream import _yaml, utils
 from buildstream._frontend.app import App
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli  # pylint: disable=unused-import
 
 
 def get_default_min_version():
diff --git a/tests/frontend/interactive_init.py b/tests/frontend/interactive_init.py
index b8cbe52..0865d5f 100644
--- a/tests/frontend/interactive_init.py
+++ b/tests/frontend/interactive_init.py
@@ -2,8 +2,8 @@ import os
 
 import pexpect
 
-from buildstream import _yaml
-from buildstream import utils
+from buildstream import _yaml, utils
+
 from tests.testutils.constants import PEXPECT_TIMEOUT_SHORT
 
 
diff --git a/tests/frontend/large_directory.py b/tests/frontend/large_directory.py
index ea29fd1..47e2fc7 100644
--- a/tests/frontend/large_directory.py
+++ b/tests/frontend/large_directory.py
@@ -18,15 +18,15 @@
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
 
-from contextlib import contextmanager
 import os
-import pytest
+from contextlib import contextmanager
 
 import grpc
+import pytest
 
 from buildstream.testing import cli  # pylint: disable=unused-import
-from tests.testutils import create_artifact_share, assert_shared
 
+from tests.testutils import assert_shared, create_artifact_share
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
diff --git a/tests/frontend/logging.py b/tests/frontend/logging.py
index 6eb0589..da8c4fe 100644
--- a/tests/frontend/logging.py
+++ b/tests/frontend/logging.py
@@ -6,11 +6,10 @@ import re
 
 import pytest
 
-from buildstream.testing import create_repo
-
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import create_repo
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
diff --git a/tests/frontend/mirror.py b/tests/frontend/mirror.py
index bffc754..3bb0a93 100644
--- a/tests/frontend/mirror.py
+++ b/tests/frontend/mirror.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
-from buildstream.testing import create_repo
 from buildstream.testing import cli  # pylint: disable=unused-import
-
+from buildstream.testing import create_repo
 
 # Project directory
 TOP_DIR = os.path.dirname(os.path.realpath(__file__))
diff --git a/tests/frontend/order.py b/tests/frontend/order.py
index fbeb7c3..9c71a4e 100644
--- a/tests/frontend/order.py
+++ b/tests/frontend/order.py
@@ -4,9 +4,10 @@
 import os
 
 import pytest
-from buildstream.testing import create_repo
-from buildstream.testing import cli  # pylint: disable=unused-import
+
 from buildstream import _yaml
+from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import create_repo
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
diff --git a/tests/frontend/overlaps.py b/tests/frontend/overlaps.py
index a45fc70..0887ef0 100644
--- a/tests/frontend/overlaps.py
+++ b/tests/frontend/overlaps.py
@@ -2,11 +2,14 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
-from buildstream.testing.runcli import cli  # pylint: disable=unused-import
-from buildstream.exceptions import ErrorDomain
+
 from buildstream import _yaml
+from buildstream.exceptions import ErrorDomain
 from buildstream.plugin import CoreWarnings
+from buildstream.testing.runcli import cli  # pylint: disable=unused-import
+
 from tests.testutils import generate_junction
 
 # Project directory
diff --git a/tests/frontend/progress.py b/tests/frontend/progress.py
index 5d446bb..e6a736d 100644
--- a/tests/frontend/progress.py
+++ b/tests/frontend/progress.py
@@ -2,11 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import generate_junction
 
diff --git a/tests/frontend/pull.py b/tests/frontend/pull.py
index c1fa76a..f54ab45 100644
--- a/tests/frontend/pull.py
+++ b/tests/frontend/pull.py
@@ -4,19 +4,21 @@
 import os
 import shutil
 import stat
+
 import pytest
-from buildstream import utils, _yaml
+
+from buildstream import _yaml, utils
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
+
 from tests.testutils import (
+    assert_not_shared,
+    assert_shared,
     create_artifact_share,
     create_split_share,
     generate_junction,
-    assert_shared,
-    assert_not_shared,
 )
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/frontend/push.py b/tests/frontend/push.py
index 50e3546..a648184 100644
--- a/tests/frontend/push.py
+++ b/tests/frontend/push.py
@@ -25,20 +25,21 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli, generate_project  # pylint: disable=unused-import
+
 from tests.testutils import (
+    assert_not_shared,
+    assert_shared,
     create_artifact_share,
     create_element_size,
     generate_junction,
     wait_for_cache_granularity,
-    assert_shared,
-    assert_not_shared,
 )
 
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/frontend/rebuild.py b/tests/frontend/rebuild.py
index 1aef8e4..0d2100b 100644
--- a/tests/frontend/rebuild.py
+++ b/tests/frontend/rebuild.py
@@ -2,7 +2,9 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
 from buildstream.testing import cli  # pylint: disable=unused-import
 
 # Project directory
diff --git a/tests/frontend/remote-caches.py b/tests/frontend/remote-caches.py
index b112e08..2e66bc5 100644
--- a/tests/frontend/remote-caches.py
+++ b/tests/frontend/remote-caches.py
@@ -21,10 +21,11 @@
 # pylint: disable=redefined-outer-name
 import os
 import shutil
+
 import pytest
 
-from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream import _yaml
+from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import create_artifact_share, create_element_size
 
diff --git a/tests/frontend/show.py b/tests/frontend/show.py
index 4be4b72..8468ca5 100644
--- a/tests/frontend/show.py
+++ b/tests/frontend/show.py
@@ -1,14 +1,16 @@
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
 
+import itertools
 import os
-import sys
 import shutil
-import itertools
+import sys
+
 import pytest
-from buildstream.testing import cli  # pylint: disable=unused-import
+
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli  # pylint: disable=unused-import
 
 from tests.testutils import generate_junction
 
diff --git a/tests/frontend/source_checkout.py b/tests/frontend/source_checkout.py
index 58c59ec..d123089 100644
--- a/tests/frontend/source_checkout.py
+++ b/tests/frontend/source_checkout.py
@@ -6,10 +6,9 @@ import tarfile
 
 import pytest
 
+from buildstream import _yaml, utils
 from buildstream.testing import cli  # pylint: disable=unused-import
 
-from buildstream import utils, _yaml
-
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
diff --git a/tests/frontend/track.py b/tests/frontend/track.py
index 2ebaae8..9de0a29 100644
--- a/tests/frontend/track.py
+++ b/tests/frontend/track.py
@@ -1,15 +1,18 @@
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
 
-import stat
 import os
+import stat
+
 import pytest
 
-from buildstream.testing import create_repo
-from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream import _yaml
+from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import create_repo
+
 from tests.testutils import generate_junction
+
 from . import configure_project
 
 # Project directory
diff --git a/tests/frontend/version.py b/tests/frontend/version.py
index 279a517..74ed9a5 100644
--- a/tests/frontend/version.py
+++ b/tests/frontend/version.py
@@ -1,11 +1,9 @@
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
 
-from buildstream.testing.runcli import cli  # pylint: disable=unused-import
-
-
 # For utils.get_bst_version()
 from buildstream import utils
+from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 
 def assert_version(cli_version_output):
diff --git a/tests/frontend/workspace.py b/tests/frontend/workspace.py
index 4aae61a..d73f200 100644
--- a/tests/frontend/workspace.py
+++ b/tests/frontend/workspace.py
@@ -28,17 +28,17 @@
 # pylint: disable=redefined-outer-name
 
 import os
-import stat
 import shutil
+import stat
 import subprocess
 
 import pytest
 
-from buildstream.testing import create_repo, ALL_REPO_KINDS
-from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream import _yaml
-from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream._workspaces import BST_WORKSPACE_FORMAT_VERSION
+from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import ALL_REPO_KINDS, create_repo
 
 from tests.testutils import create_artifact_share, create_element_size, wait_for_cache_granularity
 
diff --git a/tests/integration/artifact.py b/tests/integration/artifact.py
index e21dd42..36a76f2 100644
--- a/tests/integration/artifact.py
+++ b/tests/integration/artifact.py
@@ -31,7 +31,6 @@ from buildstream.testing._utils.site import HAVE_SANDBOX
 
 from tests.testutils import create_artifact_share
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/autotools.py b/tests/integration/autotools.py
index d1ab82e..e6b1464 100644
--- a/tests/integration/autotools.py
+++ b/tests/integration/autotools.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing.integration import assert_contains
 from buildstream.testing._utils.site import HAVE_SANDBOX
-
+from buildstream.testing.integration import assert_contains
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/integration/build-uid.py b/tests/integration/build-uid.py
index a0cc20d..2eb79a1 100644
--- a/tests/integration/build-uid.py
+++ b/tests/integration/build-uid.py
@@ -2,11 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import HAVE_SANDBOX, BUILDBOX_RUN
-
+from buildstream.testing._utils.site import BUILDBOX_RUN, HAVE_SANDBOX
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/integration/cachedfail.py b/tests/integration/cachedfail.py
index f72c315..64ad809 100644
--- a/tests/integration/cachedfail.py
+++ b/tests/integration/cachedfail.py
@@ -18,16 +18,16 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream import utils, _yaml
+from buildstream import _yaml, utils
 from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
 from tests.testutils import create_artifact_share
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/compose-symlinks.py b/tests/integration/compose-symlinks.py
index 7b807d1..f9e8987 100644
--- a/tests/integration/compose-symlinks.py
+++ b/tests/integration/compose-symlinks.py
@@ -2,11 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/compose.py b/tests/integration/compose.py
index f08f2e8..5f84b18 100644
--- a/tests/integration/compose.py
+++ b/tests/integration/compose.py
@@ -2,14 +2,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
-
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
+from buildstream.testing._utils.site import BUILDBOX_RUN, HAVE_SANDBOX
 from buildstream.testing.integration import walk_dir
-from buildstream.testing._utils.site import HAVE_SANDBOX, BUILDBOX_RUN
-
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/integration/filter.py b/tests/integration/filter.py
index 12061fe..557bf28 100644
--- a/tests/integration/filter.py
+++ b/tests/integration/filter.py
@@ -3,12 +3,12 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing._utils.site import BUILDBOX_RUN, HAVE_SANDBOX
 from buildstream.testing.integration import assert_contains
-from buildstream.testing._utils.site import HAVE_SANDBOX, BUILDBOX_RUN
-
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/integration/import.py b/tests/integration/import.py
index f7510e2..01bf848 100644
--- a/tests/integration/import.py
+++ b/tests/integration/import.py
@@ -2,14 +2,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
-
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing.integration import walk_dir
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/interactive_build.py b/tests/integration/interactive_build.py
index c0b0871..e43b99e 100644
--- a/tests/integration/interactive_build.py
+++ b/tests/integration/interactive_build.py
@@ -2,13 +2,14 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pexpect
 import pytest
 
 from buildstream.testing import runcli
 from buildstream.testing._utils.site import HAVE_SANDBOX
-from tests.testutils.constants import PEXPECT_TIMEOUT_SHORT, PEXPECT_TIMEOUT_LONG
 
+from tests.testutils.constants import PEXPECT_TIMEOUT_LONG, PEXPECT_TIMEOUT_SHORT
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/integration/manual.py b/tests/integration/manual.py
index defc250..110eac1 100644
--- a/tests/integration/manual.py
+++ b/tests/integration/manual.py
@@ -3,14 +3,13 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream import _yaml
-
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/messages.py b/tests/integration/messages.py
index 1a324a6..8cfa3dd 100644
--- a/tests/integration/messages.py
+++ b/tests/integration/messages.py
@@ -21,6 +21,7 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
@@ -28,7 +29,6 @@ from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/pip_source.py b/tests/integration/pip_source.py
index 5d31497..0255624 100644
--- a/tests/integration/pip_source.py
+++ b/tests/integration/pip_source.py
@@ -2,17 +2,16 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
-
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing.integration import assert_contains
 from buildstream.testing._utils.site import HAVE_SANDBOX
+from buildstream.testing.integration import assert_contains
 
 from tests.testutils.python_repo import setup_pypi_repo  # pylint: disable=unused-import
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/pullbuildtrees.py b/tests/integration/pullbuildtrees.py
index 6d9eefb..3209c36 100644
--- a/tests/integration/pullbuildtrees.py
+++ b/tests/integration/pullbuildtrees.py
@@ -6,13 +6,13 @@ import shutil
 
 import pytest
 
-from buildstream.testing import cli, cli_integration as cli2  # pylint: disable=unused-import
-from buildstream.testing._utils.site import HAVE_SANDBOX
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
+from buildstream.testing import cli
+from buildstream.testing import cli_integration as cli2  # pylint: disable=unused-import
+from buildstream.testing._utils.site import HAVE_SANDBOX
 
 from tests.testutils import create_artifact_share
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/sandbox.py b/tests/integration/sandbox.py
index cfa177e..1de1e3b 100644
--- a/tests/integration/sandbox.py
+++ b/tests/integration/sandbox.py
@@ -19,12 +19,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/script.py b/tests/integration/script.py
index 35a3fdd..5038061 100644
--- a/tests/integration/script.py
+++ b/tests/integration/script.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import HAVE_SANDBOX, BUILDBOX_RUN
-
+from buildstream.testing._utils.site import BUILDBOX_RUN, HAVE_SANDBOX
 
 pytestmark = pytest.mark.integration
 
diff --git a/tests/integration/shell.py b/tests/integration/shell.py
index 42e486b..2b00014 100644
--- a/tests/integration/shell.py
+++ b/tests/integration/shell.py
@@ -6,15 +6,13 @@ import uuid
 
 import pytest
 
-from buildstream import _yaml
-from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import HAVE_SANDBOX, BUILDBOX_RUN
+from buildstream import _yaml, utils
 from buildstream.exceptions import ErrorDomain
-from buildstream import utils
+from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
+from buildstream.testing._utils.site import BUILDBOX_RUN, HAVE_SANDBOX
 
 from tests.testutils import create_artifact_share
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/shellbuildtrees.py b/tests/integration/shellbuildtrees.py
index 0d80c16..b99a754 100644
--- a/tests/integration/shellbuildtrees.py
+++ b/tests/integration/shellbuildtrees.py
@@ -6,13 +6,12 @@ import shutil
 
 import pytest
 
-from buildstream.testing import cli, cli_integration  # pylint: disable=unused-import
 from buildstream.exceptions import ErrorDomain
+from buildstream.testing import cli, cli_integration  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
 from tests.testutils import create_artifact_share
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/sockets.py b/tests/integration/sockets.py
index 3fb656e..32f904b 100644
--- a/tests/integration/sockets.py
+++ b/tests/integration/sockets.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
-
 pytestmark = pytest.mark.integration
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
diff --git a/tests/integration/source-determinism.py b/tests/integration/source-determinism.py
index a69e55a..940de31 100644
--- a/tests/integration/source-determinism.py
+++ b/tests/integration/source-determinism.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
-from buildstream.testing._utils.site import HAVE_SANDBOX, CASD_SEPARATE_USER
-
+from buildstream.testing._utils.site import CASD_SEPARATE_USER, HAVE_SANDBOX
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
 
diff --git a/tests/integration/stack.py b/tests/integration/stack.py
index bad807f..dd0a12a 100644
--- a/tests/integration/stack.py
+++ b/tests/integration/stack.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/symlinks.py b/tests/integration/symlinks.py
index f1d044f..d25a57c 100644
--- a/tests/integration/symlinks.py
+++ b/tests/integration/symlinks.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/integration/workspace.py b/tests/integration/workspace.py
index a2ea484..78e4bc1 100644
--- a/tests/integration/workspace.py
+++ b/tests/integration/workspace.py
@@ -2,17 +2,17 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
+from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli_integration as cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
-from buildstream.exceptions import ErrorDomain
 from buildstream.utils import BST_ARBITRARY_TIMESTAMP
 
 from tests.testutils import wait_for_cache_granularity
 
-
 pytestmark = pytest.mark.integration
 
 
diff --git a/tests/internals/context.py b/tests/internals/context.py
index 9d06a68..2743dfa 100644
--- a/tests/internals/context.py
+++ b/tests/internals/context.py
@@ -2,10 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream._context import Context
 from buildstream import _yaml, utils
+from buildstream._context import Context
 from buildstream._exceptions import LoadError
 from buildstream.exceptions import LoadErrorReason
 
diff --git a/tests/internals/loader.py b/tests/internals/loader.py
index bdce428..17cd278 100644
--- a/tests/internals/loader.py
+++ b/tests/internals/loader.py
@@ -1,15 +1,15 @@
-from contextlib import contextmanager
 import os
+from contextlib import contextmanager
+
 import pytest
 
-from buildstream.exceptions import LoadErrorReason
 from buildstream._exceptions import LoadError
-from buildstream._project import Project
 from buildstream._loader import MetaElement
+from buildstream._project import Project
+from buildstream.exceptions import LoadErrorReason
 
 from tests.testutils import dummy_context
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "loader",)
 
 
diff --git a/tests/internals/pluginloading.py b/tests/internals/pluginloading.py
index 1f44465..284c6ff 100644
--- a/tests/internals/pluginloading.py
+++ b/tests/internals/pluginloading.py
@@ -1,9 +1,10 @@
-from contextlib import contextmanager
 import os
+from contextlib import contextmanager
+
 import pytest
 
-from buildstream._project import Project
 from buildstream._pipeline import Pipeline
+from buildstream._project import Project
 
 from tests.testutils import dummy_context
 
diff --git a/tests/internals/storage.py b/tests/internals/storage.py
index e9932e0..410d5fe 100644
--- a/tests/internals/storage.py
+++ b/tests/internals/storage.py
@@ -1,10 +1,10 @@
-from contextlib import contextmanager
+import glob
+import hashlib
 import os
 import pprint
 import shutil
 import stat
-import glob
-import hashlib
+from contextlib import contextmanager
 from pathlib import Path
 from typing import List, Optional
 
@@ -13,7 +13,7 @@ import pytest
 from buildstream._cas import CASCache
 from buildstream.storage._casbaseddirectory import CasBasedDirectory
 from buildstream.storage._filebaseddirectory import FileBasedDirectory
-from buildstream.storage.directory import _FileType, VirtualDirectoryError
+from buildstream.storage.directory import VirtualDirectoryError, _FileType
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "storage")
 
diff --git a/tests/internals/storage_vdir_import.py b/tests/internals/storage_vdir_import.py
index ffd727f..7088225 100644
--- a/tests/internals/storage_vdir_import.py
+++ b/tests/internals/storage_vdir_import.py
@@ -13,18 +13,17 @@
 #
 #  You should have received a copy of the GNU Lesser General Public
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
-from hashlib import sha256
 import os
 import random
+from hashlib import sha256
 
 import pytest
 
+from buildstream._cas import CASCache
 from buildstream.storage._casbaseddirectory import CasBasedDirectory
 from buildstream.storage._filebaseddirectory import FileBasedDirectory
-from buildstream._cas import CASCache
 from buildstream.storage.directory import VirtualDirectoryError
-from buildstream.utils import _set_file_mtime, _parse_timestamp
-
+from buildstream.utils import _parse_timestamp, _set_file_mtime
 
 # These are comparitive tests that check that FileBasedDirectory and
 # CasBasedDirectory act identically.
diff --git a/tests/internals/utils_move_atomic.py b/tests/internals/utils_move_atomic.py
index dd417cb..9022d83 100644
--- a/tests/internals/utils_move_atomic.py
+++ b/tests/internals/utils_move_atomic.py
@@ -4,11 +4,11 @@
 import pytest
 
 from buildstream.utils import (
-    move_atomic,
     DirectoryExistsError,
     _get_file_mtimestamp,
-    _set_file_mtime,
     _parse_timestamp,
+    _set_file_mtime,
+    move_atomic,
 )
 
 
diff --git a/tests/internals/utils_save_atomic.py b/tests/internals/utils_save_atomic.py
index 8982860..d1d3949 100644
--- a/tests/internals/utils_save_atomic.py
+++ b/tests/internals/utils_save_atomic.py
@@ -1,4 +1,5 @@
 import os
+
 import pytest
 
 from buildstream.utils import save_file_atomic
diff --git a/tests/internals/yaml.py b/tests/internals/yaml.py
index a4f8d08..e6509ce 100644
--- a/tests/internals/yaml.py
+++ b/tests/internals/yaml.py
@@ -3,10 +3,9 @@ from io import StringIO
 
 import pytest
 
-from buildstream import _yaml, Node, ProvenanceInformation, SequenceNode
-from buildstream.exceptions import LoadErrorReason
+from buildstream import Node, ProvenanceInformation, SequenceNode, _yaml
 from buildstream._exceptions import LoadError
-
+from buildstream.exceptions import LoadErrorReason
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "yaml",)
 
diff --git a/tests/plugins/loading.py b/tests/plugins/loading.py
index 7aeb242..e62cd52 100644
--- a/tests/plugins/loading.py
+++ b/tests/plugins/loading.py
@@ -8,12 +8,12 @@
 
 import os
 import shutil
+
 import pytest
 
+from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream import _yaml
-
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "loading")
 
diff --git a/tests/plugins/sample-plugins/setup.py b/tests/plugins/sample-plugins/setup.py
index 8429c7c..920f19f 100755
--- a/tests/plugins/sample-plugins/setup.py
+++ b/tests/plugins/sample-plugins/setup.py
@@ -16,7 +16,7 @@
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 #
 
-from setuptools import setup, find_packages
+from setuptools import find_packages, setup
 
 setup(
     name="sample-plugins",
diff --git a/tests/remoteexecution/buildfail.py b/tests/remoteexecution/buildfail.py
index 37f4dca..f782939 100644
--- a/tests/remoteexecution/buildfail.py
+++ b/tests/remoteexecution/buildfail.py
@@ -19,10 +19,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.exceptions import ErrorDomain
 from buildstream import _yaml
+from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli_remote_execution as cli  # pylint: disable=unused-import
 
 pytestmark = pytest.mark.remoteexecution
diff --git a/tests/remoteexecution/buildtree.py b/tests/remoteexecution/buildtree.py
index 57e25cd..0c805d6 100644
--- a/tests/remoteexecution/buildtree.py
+++ b/tests/remoteexecution/buildtree.py
@@ -19,6 +19,7 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream.testing import cli_remote_execution as cli  # pylint: disable=unused-import
diff --git a/tests/remoteexecution/junction.py b/tests/remoteexecution/junction.py
index 2b02616..7c39b62 100644
--- a/tests/remoteexecution/junction.py
+++ b/tests/remoteexecution/junction.py
@@ -19,10 +19,13 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
+
+from buildstream import _yaml
 from buildstream.testing import cli_remote_execution as cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
-from buildstream import _yaml
+
 from tests.testutils import generate_junction
 
 pytestmark = pytest.mark.remoteexecution
diff --git a/tests/remoteexecution/partial.py b/tests/remoteexecution/partial.py
index ec5fabe..1ea8fea 100644
--- a/tests/remoteexecution/partial.py
+++ b/tests/remoteexecution/partial.py
@@ -2,6 +2,7 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain
@@ -10,7 +11,6 @@ from buildstream.testing.integration import assert_contains
 
 from tests.testutils.artifactshare import create_artifact_share
 
-
 pytestmark = pytest.mark.remoteexecution
 
 
diff --git a/tests/remoteexecution/simple.py b/tests/remoteexecution/simple.py
index cb8f809..791dbc3 100644
--- a/tests/remoteexecution/simple.py
+++ b/tests/remoteexecution/simple.py
@@ -2,12 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli_remote_execution as cli  # pylint: disable=unused-import
 from buildstream.testing.integration import assert_contains
 
-
 pytestmark = pytest.mark.remoteexecution
 
 
diff --git a/tests/remoteexecution/workspace.py b/tests/remoteexecution/workspace.py
index b525cef..1e8d8ec 100644
--- a/tests/remoteexecution/workspace.py
+++ b/tests/remoteexecution/workspace.py
@@ -4,6 +4,7 @@
 import os
 import re
 import shutil
+
 import pytest
 
 from buildstream.testing import cli_remote_execution as cli  # pylint: disable=unused-import
diff --git a/tests/sandboxes/missing-command.py b/tests/sandboxes/missing-command.py
index ec6ba18..780a872 100644
--- a/tests/sandboxes/missing-command.py
+++ b/tests/sandboxes/missing-command.py
@@ -2,13 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain
-
 from buildstream.testing import cli  # pylint: disable=unused-import
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "missing-command")
 
 
diff --git a/tests/sandboxes/missing_dependencies.py b/tests/sandboxes/missing_dependencies.py
index 7ac7d78..84bc78f 100644
--- a/tests/sandboxes/missing_dependencies.py
+++ b/tests/sandboxes/missing_dependencies.py
@@ -5,11 +5,10 @@ import os
 
 import pytest
 
-from buildstream import utils, _yaml
+from buildstream import _yaml, utils
 from buildstream.exceptions import ErrorDomain
-from buildstream.testing._utils.site import IS_LINUX
 from buildstream.testing import cli  # pylint: disable=unused-import
-
+from buildstream.testing._utils.site import IS_LINUX
 
 # Project directory
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "missing-dependencies",)
diff --git a/tests/sandboxes/selection.py b/tests/sandboxes/selection.py
index 0118fb5..a98395f 100644
--- a/tests/sandboxes/selection.py
+++ b/tests/sandboxes/selection.py
@@ -17,9 +17,10 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream import utils, _yaml
+from buildstream import _yaml, utils
 from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
 
diff --git a/tests/sourcecache/cache.py b/tests/sourcecache/cache.py
index bbc3d83..0f38d2f 100644
--- a/tests/sourcecache/cache.py
+++ b/tests/sourcecache/cache.py
@@ -22,10 +22,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 from buildstream import _yaml
+from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
 
diff --git a/tests/sourcecache/capabilities.py b/tests/sourcecache/capabilities.py
index 9d41eba..8c97fd8 100644
--- a/tests/sourcecache/capabilities.py
+++ b/tests/sourcecache/capabilities.py
@@ -4,15 +4,14 @@
 import os
 
 import pytest
-from buildstream._project import Project
 
 from buildstream import _yaml
+from buildstream._project import Project
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
-from tests.testutils import dummy_context
 
+from tests.testutils import dummy_context
 from tests.testutils.artifactshare import create_dummy_artifact_share
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)
 
 
diff --git a/tests/sourcecache/config.py b/tests/sourcecache/config.py
index 0c11a27..514f132 100644
--- a/tests/sourcecache/config.py
+++ b/tests/sourcecache/config.py
@@ -22,11 +22,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
-
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 DATA_DIR = os.path.dirname(os.path.realpath(__file__))
diff --git a/tests/sourcecache/fetch.py b/tests/sourcecache/fetch.py
index 889de62..654fb22 100644
--- a/tests/sourcecache/fetch.py
+++ b/tests/sourcecache/fetch.py
@@ -19,14 +19,15 @@
 #
 # Pylint doesn't play well with fixtures and dependency injection from pytest
 # pylint: disable=redefined-outer-name
-from contextlib import contextmanager
 import os
 import shutil
+from contextlib import contextmanager
+
 import pytest
 
-from buildstream.exceptions import ErrorDomain
-from buildstream._project import Project
 from buildstream import _yaml
+from buildstream._project import Project
+from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
 
diff --git a/tests/sourcecache/project/plugins/elements/always_fail.py b/tests/sourcecache/project/plugins/elements/always_fail.py
index bc3ed57..7dc908e 100644
--- a/tests/sourcecache/project/plugins/elements/always_fail.py
+++ b/tests/sourcecache/project/plugins/elements/always_fail.py
@@ -18,8 +18,8 @@
 #        Raoul Hidalgo Charman <ra...@codethink.co.uk>
 #
 
-from buildstream.element import ElementError
 from buildstream.buildelement import BuildElement
+from buildstream.element import ElementError
 
 
 class AlwaysFail(BuildElement):
diff --git a/tests/sourcecache/push.py b/tests/sourcecache/push.py
index 9f8663a..ff6ef1c 100644
--- a/tests/sourcecache/push.py
+++ b/tests/sourcecache/push.py
@@ -21,15 +21,16 @@
 # pylint: disable=redefined-outer-name
 import os
 import shutil
-from contextlib import contextmanager, ExitStack
+from contextlib import ExitStack, contextmanager
 
 import pytest
 
-from buildstream.exceptions import ErrorDomain
-from buildstream._project import Project
 from buildstream import _yaml
+from buildstream._project import Project
+from buildstream.exceptions import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing import create_repo
+
 from tests.testutils import create_artifact_share, dummy_context
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
diff --git a/tests/sourcecache/staging.py b/tests/sourcecache/staging.py
index dbfc028..fa30c5c 100644
--- a/tests/sourcecache/staging.py
+++ b/tests/sourcecache/staging.py
@@ -23,16 +23,15 @@
 
 import os
 import shutil
+
 import pytest
 
 from buildstream._project import Project
-
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
 from tests.testutils import dummy_context
 from tests.testutils.element_generators import create_element_size
 
-
 DATA_DIR = os.path.dirname(os.path.realpath(__file__))
 
 
diff --git a/tests/sourcecache/workspace.py b/tests/sourcecache/workspace.py
index bb1ea50..c970296 100644
--- a/tests/sourcecache/workspace.py
+++ b/tests/sourcecache/workspace.py
@@ -31,7 +31,6 @@ from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 from tests.testutils.artifactshare import create_artifact_share
 from tests.testutils.element_generators import create_element_size
 
-
 DATA_DIR = os.path.dirname(os.path.realpath(__file__))
 
 
diff --git a/tests/sources/bzr.py b/tests/sources/bzr.py
index 2dcacfe..2bd4c75 100644
--- a/tests/sources/bzr.py
+++ b/tests/sources/bzr.py
@@ -2,11 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream.testing import create_repo
-from buildstream.testing import generate_element
+from buildstream.testing import create_repo, generate_element
 from buildstream.testing._utils.site import HAVE_BZR
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "bzr")
diff --git a/tests/sources/git.py b/tests/sources/git.py
index 033db1b..d6ac46e 100644
--- a/tests/sources/git.py
+++ b/tests/sources/git.py
@@ -24,8 +24,8 @@
 # pylint: disable=redefined-outer-name
 
 import os
-import subprocess
 import shutil
+import subprocess
 
 import pytest
 
@@ -33,8 +33,7 @@ from buildstream import Node
 from buildstream.exceptions import ErrorDomain
 from buildstream.plugin import CoreWarnings
 from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream.testing import generate_project, generate_element, load_yaml
-from buildstream.testing import create_repo
+from buildstream.testing import create_repo, generate_element, generate_project, load_yaml
 from buildstream.testing._utils.site import HAVE_GIT, HAVE_OLD_GIT
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "git",)
diff --git a/tests/sources/keytest.py b/tests/sources/keytest.py
index 70e01f6..3bee771 100644
--- a/tests/sources/keytest.py
+++ b/tests/sources/keytest.py
@@ -22,10 +22,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.testing import ErrorDomain
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import ErrorDomain
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project_key_test")
 
diff --git a/tests/sources/local.py b/tests/sources/local.py
index 2b01551..2b3bc2a 100644
--- a/tests/sources/local.py
+++ b/tests/sources/local.py
@@ -2,12 +2,14 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream import _yaml
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
 from buildstream.testing._utils.site import HAVE_SANDBOX
+
 from tests.testutils import filetypegenerator
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "local",)
diff --git a/tests/sources/no_fetch_cached.py b/tests/sources/no_fetch_cached.py
index 4984f53..96b94e9 100644
--- a/tests/sources/no_fetch_cached.py
+++ b/tests/sources/no_fetch_cached.py
@@ -2,11 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.testing import cli  # pylint: disable=unused-import
-from buildstream.testing import create_repo
-from buildstream.testing import generate_element
+from buildstream.testing import create_repo, generate_element
 from buildstream.testing._utils.site import HAVE_GIT
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "no-fetch-cached")
diff --git a/tests/sources/patch.py b/tests/sources/patch.py
index 5392a64..99068f0 100644
--- a/tests/sources/patch.py
+++ b/tests/sources/patch.py
@@ -2,10 +2,12 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing import cli  # pylint: disable=unused-import
+
 from tests.testutils import filetypegenerator
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "patch",)
diff --git a/tests/sources/pip.py b/tests/sources/pip.py
index 1eacb44..44a5aa4 100644
--- a/tests/sources/pip.py
+++ b/tests/sources/pip.py
@@ -2,6 +2,7 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
 from buildstream.exceptions import ErrorDomain
diff --git a/tests/sources/previous_source_access.py b/tests/sources/previous_source_access.py
index 3c95d77..15d0993 100644
--- a/tests/sources/previous_source_access.py
+++ b/tests/sources/previous_source_access.py
@@ -2,10 +2,11 @@
 # pylint: disable=redefined-outer-name
 
 import os
+
 import pytest
 
-from buildstream.testing import generate_project, load_yaml
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import generate_project, load_yaml
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "previous_source_access")
 
diff --git a/tests/sources/previous_source_access/plugins/sources/foo_transform.py b/tests/sources/previous_source_access/plugins/sources/foo_transform.py
index 15fef43..9b9e1ad 100644
--- a/tests/sources/previous_source_access/plugins/sources/foo_transform.py
+++ b/tests/sources/previous_source_access/plugins/sources/foo_transform.py
@@ -7,8 +7,8 @@ previous sources, and copies its contents to a file called "filetransform".
 
 """
 
-import os
 import hashlib
+import os
 
 from buildstream import Source, SourceError, utils
 
diff --git a/tests/sources/remote.py b/tests/sources/remote.py
index 416d2d5..7dc694f 100644
--- a/tests/sources/remote.py
+++ b/tests/sources/remote.py
@@ -3,12 +3,13 @@
 
 import os
 import stat
+
 import pytest
 
 from buildstream import utils
-from buildstream.testing import ErrorDomain
-from buildstream.testing import generate_project
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import ErrorDomain, generate_project
+
 from tests.testutils.file_server import create_file_server
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "remote",)
diff --git a/tests/sources/tar.py b/tests/sources/tar.py
index ed662dc..9ccedcb 100644
--- a/tests/sources/tar.py
+++ b/tests/sources/tar.py
@@ -2,20 +2,22 @@
 # pylint: disable=redefined-outer-name
 
 import os
-from shutil import copyfile
 import subprocess
 import tarfile
 import tempfile
 import urllib.parse
+from shutil import copyfile
 
 import pytest
 
 from buildstream import utils
 from buildstream.exceptions import ErrorDomain
-from buildstream.testing import generate_project, generate_element
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import generate_element, generate_project
 from buildstream.testing._utils.site import HAVE_LZIP
+
 from tests.testutils.file_server import create_file_server
+
 from . import list_dir_contents
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "tar",)
diff --git a/tests/sources/variables.py b/tests/sources/variables.py
index 3e9a08f..26e9756 100644
--- a/tests/sources/variables.py
+++ b/tests/sources/variables.py
@@ -8,7 +8,6 @@ import pytest
 from buildstream.exceptions import ErrorDomain, LoadErrorReason
 from buildstream.testing.runcli import cli  # pylint: disable=unused-import
 
-
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "variables")
 
 
diff --git a/tests/sources/zip.py b/tests/sources/zip.py
index 201271f..42ff1ac 100644
--- a/tests/sources/zip.py
+++ b/tests/sources/zip.py
@@ -7,9 +7,11 @@ import zipfile
 import pytest
 
 from buildstream.exceptions import ErrorDomain
-from buildstream.testing import generate_project
 from buildstream.testing import cli  # pylint: disable=unused-import
+from buildstream.testing import generate_project
+
 from tests.testutils.file_server import create_file_server
+
 from . import list_dir_contents
 
 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "zip",)
diff --git a/tests/testutils/__init__.py b/tests/testutils/__init__.py
index 9642ddf..f582556 100644
--- a/tests/testutils/__init__.py
+++ b/tests/testutils/__init__.py
@@ -23,10 +23,10 @@
 #           William Salmon <wi...@codethink.co.uk>
 #
 
-from .artifactshare import create_artifact_share, create_split_share, assert_shared, assert_not_shared
+from .artifactshare import assert_not_shared, assert_shared, create_artifact_share, create_split_share
 from .context import dummy_context
 from .element_generators import create_element_size, update_element_size
 from .junction import generate_junction
-from .runner_integration import wait_for_cache_granularity
-from .python_repo import setup_pypi_repo
 from .platform import override_platform_uname
+from .python_repo import setup_pypi_repo
+from .runner_integration import wait_for_cache_granularity
diff --git a/tests/testutils/artifactshare.py b/tests/testutils/artifactshare.py
index a15a7c2..fab2b73 100644
--- a/tests/testutils/artifactshare.py
+++ b/tests/testutils/artifactshare.py
@@ -3,8 +3,8 @@ import shutil
 import signal
 import sys
 from collections import namedtuple
-from contextlib import ExitStack, contextmanager
 from concurrent import futures
+from contextlib import ExitStack, contextmanager
 from multiprocessing import Process, Queue
 
 import grpc
diff --git a/tests/testutils/context.py b/tests/testutils/context.py
index 821adef..69d999e 100644
--- a/tests/testutils/context.py
+++ b/tests/testutils/context.py
@@ -15,9 +15,8 @@
 #  License along with this library. If not, see <http://www.gnu.org/licenses/>.
 
 import os
-
-from types import MethodType
 from contextlib import contextmanager
+from types import MethodType
 
 from buildstream._context import Context
 
diff --git a/tests/testutils/element_generators.py b/tests/testutils/element_generators.py
index 6da465a..441a59f 100644
--- a/tests/testutils/element_generators.py
+++ b/tests/testutils/element_generators.py
@@ -1,7 +1,6 @@
 import os
 
-from buildstream import _yaml
-from buildstream import utils
+from buildstream import _yaml, utils
 from buildstream.testing import create_repo
 
 
diff --git a/tests/testutils/http_server.py b/tests/testutils/http_server.py
index 8591159..d27bfb0 100644
--- a/tests/testutils/http_server.py
+++ b/tests/testutils/http_server.py
@@ -1,9 +1,9 @@
+import base64
+import html
 import multiprocessing
 import os
 import posixpath
-import html
-import base64
-from http.server import SimpleHTTPRequestHandler, HTTPServer, HTTPStatus
+from http.server import HTTPServer, HTTPStatus, SimpleHTTPRequestHandler
 
 
 class Unauthorized(Exception):
diff --git a/tests/testutils/platform.py b/tests/testutils/platform.py
index f8faf28..d42db41 100644
--- a/tests/testutils/platform.py
+++ b/tests/testutils/platform.py
@@ -17,8 +17,8 @@
 #  Authors:
 #        Angelos Evripiotis <je...@bloomberg.net>
 
-from contextlib import contextmanager
 import platform
+from contextlib import contextmanager
 
 
 # override_platform_uname()
diff --git a/tests/testutils/python_repo.py b/tests/testutils/python_repo.py
index 07efa37..3666ffc 100644
--- a/tests/testutils/python_repo.py
+++ b/tests/testutils/python_repo.py
@@ -6,7 +6,6 @@ import sys
 
 import pytest
 
-
 SETUP_TEMPLATE = """\
 from setuptools import setup
 
diff --git a/tests/testutils/repo/bzr.py b/tests/testutils/repo/bzr.py
index b698341..e4f6388 100644
--- a/tests/testutils/repo/bzr.py
+++ b/tests/testutils/repo/bzr.py
@@ -1,5 +1,6 @@
 import os
 import subprocess
+
 import pytest
 
 from buildstream.testing import Repo
diff --git a/tests/testutils/repo/tar.py b/tests/testutils/repo/tar.py
index 3eb9d89..c2228be 100644
--- a/tests/testutils/repo/tar.py
+++ b/tests/testutils/repo/tar.py
@@ -1,9 +1,8 @@
 import os
 import tarfile
 
-from buildstream.utils import sha256sum
-
 from buildstream.testing import Repo
+from buildstream.utils import sha256sum
 
 
 class Tar(Repo):
diff --git a/tests/testutils/repo/zip.py b/tests/testutils/repo/zip.py
index 38419e6..462e9c3 100644
--- a/tests/testutils/repo/zip.py
+++ b/tests/testutils/repo/zip.py
@@ -1,9 +1,8 @@
 import os
 import zipfile
 
-from buildstream.utils import sha256sum
-
 from buildstream.testing import Repo
+from buildstream.utils import sha256sum
 
 
 class Zip(Repo):
diff --git a/tests/testutils/setuptools.py b/tests/testutils/setuptools.py
index 0f7f30f..9c000a0 100644
--- a/tests/testutils/setuptools.py
+++ b/tests/testutils/setuptools.py
@@ -1,6 +1,7 @@
 import os
-import pytest
+
 import pkg_resources
+import pytest
 
 
 # A mock setuptools dist object.
diff --git a/tox.ini b/tox.ini
index f714629..1f4b230 100644
--- a/tox.ini
+++ b/tox.ini
@@ -122,8 +122,10 @@ setenv =
 skip_install = True
 deps =
     black==19.10b0
+    isort
 commands =
-    black {posargs: src tests doc/source/conf.py setup.py}
+    isort --apply --recursive --atomic {posargs: src tests doc/source/conf.py setup.py}
+    #black {posargs: src tests doc/source/conf.py setup.py}
 
 #
 # Code format checkers
@@ -132,7 +134,9 @@ commands =
 skip_install = True
 deps =
     black==19.10b0
+    isort
 commands =
+    isort --check-only --recursive --diff {posargs: src tests doc/source/conf.py setup.py}
     black --check --diff {posargs: src tests doc/source/conf.py setup.py}
 
 #