Repository: OpenAssetIO/OpenAssetIO (language: python)

Issue:
[Lint] `pylint` does not check tests due to fatal error
## What

`pylint` aborts with a fatal error when checking the `tests ` directory due to missing `__init__.py`.  This is reproducible locally.  

This does not fail the CI run. 

Linter errors in the main sources still get reported and will fail the CI run. 

Adding the missing `__init__.py` and re-running reveals many linter errors (mostly stuff we just forgot to explicitly ignore).

From [a recent CI run](https://github.com/OpenAssetIO/OpenAssetIO/actions/runs/4055787830/jobs/6979402597)
```
/opt/hostedtoolcache/Python/3.9.16/x64/bin/pylint --disable=fixme --ignore-paths=src/openassetio-python/tests/package/pluginSystem/resources/symlinkPath --rcfile=src/openassetio-python/pyproject.toml --output-format=json src/openassetio-python/package/openassetio src/openassetio-python/tests/package
[
    {
        "type": "fatal",
        "module": "package",
        "obj": "",
        "line": 1,
        "column": 0,
        "endLine": null,
        "endColumn": null,
        "path": "src/openassetio-python/tests/package/__init__.py",
        "symbol": "parse-error",
        "message": "error while code parsing: Unable to load file src/openassetio-python/tests/package/__init__.py:\n[Errno 2] No such file or directory: 'src/openassetio-python/tests/package/__init__.py'",
        "message-id": "F0010"
    }
]
```
[Lint] `pylint` does not check tests due to fatal error
## What

`pylint` aborts with a fatal error when checking the `tests ` directory due to missing `__init__.py`.  This is reproducible locally.  

This does not fail the CI run. 

Linter errors in the main sources still get reported and will fail the CI run. 

Adding the missing `__init__.py` and re-running reveals many linter errors (mostly stuff we just forgot to explicitly ignore).

From [a recent CI run](https://github.com/OpenAssetIO/OpenAssetIO/actions/runs/4055787830/jobs/6979402597)
```
/opt/hostedtoolcache/Python/3.9.16/x64/bin/pylint --disable=fixme --ignore-paths=src/openassetio-python/tests/package/pluginSystem/resources/symlinkPath --rcfile=src/openassetio-python/pyproject.toml --output-format=json src/openassetio-python/package/openassetio src/openassetio-python/tests/package
[
    {
        "type": "fatal",
        "module": "package",
        "obj": "",
        "line": 1,
        "column": 0,
        "endLine": null,
        "endColumn": null,
        "path": "src/openassetio-python/tests/package/__init__.py",
        "symbol": "parse-error",
        "message": "error while code parsing: Unable to load file src/openassetio-python/tests/package/__init__.py:\n[Errno 2] No such file or directory: 'src/openassetio-python/tests/package/__init__.py'",
        "message-id": "F0010"
    }
]
```


Discussion / hints:
This may be something we need to fix in `fn-pylint-action`.
Possible workaround: https://stackoverflow.com/a/54963445/535103
Also, `fn-pylint-action` doesn't fail if pylint is not installed :roll_eyes: 
This may be something we need to fix in `fn-pylint-action`.
Possible workaround: https://stackoverflow.com/a/54963445/535103
Also, `fn-pylint-action` doesn't fail if pylint is not installed :roll_eyes: 

Fix patch:
diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml
index d774ebd1d..f3c4f992e 100644
--- a/.github/workflows/code-quality.yml
+++ b/.github/workflows/code-quality.yml
@@ -32,11 +32,11 @@ jobs:
           CMAKE_TOOLCHAIN_FILE: ${{ github.workspace }}/.conan/conan_paths.cmake
 
       - name: Lint
-        uses: TheFoundryVisionmongers/fn-pylint-action@v1.1
+        uses: TheFoundryVisionmongers/fn-pylint-action@v2
         with:
-          pylint-disable: fixme # We track 'todo's through other means
-          pylint-rcfile: src/openassetio-python/pyproject.toml
-          pylint-paths: >
+          pylint-args: >
+            --recursive=y --disable=fixme
+            --rcfile=src/openassetio-python/pyproject.toml
             src/openassetio-python/package/openassetio
             src/openassetio-python/tests/package
 
diff --git a/resources/build/linter-requirements.txt b/resources/build/linter-requirements.txt
index 7d790c710..4d47d1696 100644
--- a/resources/build/linter-requirements.txt
+++ b/resources/build/linter-requirements.txt
@@ -1,3 +1,3 @@
 cpplint==1.5.5
 black==22.8.0
-pylint==2.12.2
+pylint==2.17.6
diff --git a/src/openassetio-python/package/openassetio/__init__.py b/src/openassetio-python/package/openassetio/__init__.py
index 2aff1502a..d0ad4b3b9 100644
--- a/src/openassetio-python/package/openassetio/__init__.py
+++ b/src/openassetio-python/package/openassetio/__init__.py
@@ -72,7 +72,6 @@
 """
 
 # pylint: disable=wrong-import-position,import-error
-
 from ._openassetio import (
     constants,
     Context,
diff --git a/src/openassetio-python/pyproject.toml b/src/openassetio-python/pyproject.toml
index d8cb07741..e895f17ea 100644
--- a/src/openassetio-python/pyproject.toml
+++ b/src/openassetio-python/pyproject.toml
@@ -125,6 +125,9 @@ function-rgx = "(_|test_)?[a-z0-9]+([A-Z][a-z0-9]*)*"
 const-rgx = "k([A-Z0-9]+[a-z0-9]*)+_?([A-Z0-9]+[a-z0-9]*)*"
 class-const-rgx = "k([A-Z0-9]+[a-z0-9]*)+_?([A-Z0-9]+[a-z0-9]*)*"
 
+# TODO(DF): Fails on submodules: https://github.com/pylint-dev/pylint/issues/2556
+# extension-pkg-allow-list = ["openassetio._openassetio"]
+
 [tool.pylint.similarities]
 # Ignore imports when computing similarities.
 ignore-imports = true


Test patch:
diff --git a/src/openassetio-python/package/openassetio/test/manager/_implementation.py b/src/openassetio-python/package/openassetio/test/manager/_implementation.py
index 9128846b2..956fac285 100644
--- a/src/openassetio-python/package/openassetio/test/manager/_implementation.py
+++ b/src/openassetio-python/package/openassetio/test/manager/_implementation.py
@@ -193,7 +193,7 @@ class _ValidatorHarnessHostInterface(hostApi.HostInterface):
     @private
     """
 
-    # pylint: disable=missing-function-docstring,no-self-use
+    # pylint: disable=missing-function-docstring
     def identifier(self):
         return "org.openassetio.test.manager.harness"
 
diff --git a/src/openassetio-python/tests/package/_core/test_audit.py b/src/openassetio-python/tests/package/_core/test_audit.py
index d2854e4bb..c17270129 100644
--- a/src/openassetio-python/tests/package/_core/test_audit.py
+++ b/src/openassetio-python/tests/package/_core/test_audit.py
@@ -26,7 +26,6 @@
 import pytest
 
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name
 # pylint: disable=import-outside-toplevel
 # pylint: disable=missing-class-docstring,missing-function-docstring
diff --git a/src/openassetio-python/tests/package/hostApi/test_entityreferencepager.py b/src/openassetio-python/tests/package/hostApi/test_entityreferencepager.py
index ffa79e581..86c94b6ab 100644
--- a/src/openassetio-python/tests/package/hostApi/test_entityreferencepager.py
+++ b/src/openassetio-python/tests/package/hostApi/test_entityreferencepager.py
@@ -17,16 +17,14 @@
 Tests that cover the openassetio.hostApi.EntityReferencePager wrapper class.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
-from unittest import mock
+import weakref
 
 import pytest
-import weakref
 
 from openassetio import EntityReference
-from openassetio.hostApi import Manager, EntityReferencePager
+from openassetio.hostApi import EntityReferencePager
 from openassetio.log import LoggerInterface
 from openassetio.managerApi import EntityReferencePagerInterface
 
@@ -40,7 +38,8 @@ def test_when_constructed_with_EntityReferencePagerInterface_as_None_then_raises
         # described correctly.
         matchExpr = (
             r".+The following argument types are supported:[^(]+"
-            r"EntityReferencePager\([^,]+managerApi.EntityReferencePagerInterface,[^,]+managerApi.HostSession.+"
+            r"EntityReferencePager\([^,]+managerApi.EntityReferencePagerInterface,[^,]+"
+            r"managerApi.HostSession.+"
         )
 
         with pytest.raises(TypeError, match=matchExpr):
@@ -106,13 +105,13 @@ class FakeEntityReferencePagerInterface(EntityReferencePagerInterface):
     def __init__(self):
         EntityReferencePagerInterface.__init__(self)
 
-    def hasNext(self, hostSession):
+    def hasNext(self, _hostSession):
         return False
 
-    def get(self, hostSession):
+    def get(self, _hostSession):
         return []
 
-    def next(self, hostSession):
+    def next(self, _hostSession):
         pass
 
 
@@ -128,7 +127,7 @@ def makePagerInScope():
             nonlocal weak_interface_ref
             weak_interface_ref = weakref.ref(pagerInterface)
 
-            pager = EntityReferencePager(pagerInterface, a_host_session)
+            _pager = EntityReferencePager(pagerInterface, a_host_session)
             del pagerInterface
             assert weak_interface_ref() is not None
             # The pager is still in scope until this method exits
@@ -136,7 +135,7 @@ def makePagerInScope():
         makePagerInScope()
         # Once method exits, pager falls out of scope, and interface is
         # destroyed.
-        assert weak_interface_ref() is None
+        assert weak_interface_ref() is None  # pylint: disable=not-callable
 
     def test_when_EntityReferencePager_destructed_close_is_called(
         self, a_host_session, mock_entity_reference_pager_interface
@@ -151,6 +150,7 @@ def test_when_exception_thrown_in_close_exception_is_caught_and_logged(
         exception_what = "Mocked exception"
 
         def raise_exception(self):
+            # pylint: disable=broad-exception-raised
             raise Exception(exception_what)
 
         mock_entity_reference_pager_interface.mock.close.side_effect = raise_exception
@@ -158,7 +158,7 @@ def raise_exception(self):
         pager = EntityReferencePager(mock_entity_reference_pager_interface, a_host_session)
         del pager
         mock_entity_reference_pager_interface.mock.close.assert_called_once_with(a_host_session)
-        args, kwargs = mock_logger.mock.log.call_args
+        args, _kwargs = mock_logger.mock.log.call_args
 
         # The .what() of the exception comes with a lot of additional
         # text about call location that would be overly verbose to check
diff --git a/src/openassetio-python/tests/package/hostApi/test_manager.py b/src/openassetio-python/tests/package/hostApi/test_manager.py
index e8d831eff..4be185002 100644
--- a/src/openassetio-python/tests/package/hostApi/test_manager.py
+++ b/src/openassetio-python/tests/package/hostApi/test_manager.py
@@ -21,9 +21,9 @@
 # pylint: disable=too-many-lines,too-many-locals
 # pylint: disable=missing-class-docstring,missing-function-docstring
 from unittest import mock
+import re
 
 import pytest
-import re
 
 from openassetio import (
     Context,
@@ -173,7 +173,7 @@ def test_input_not_modified(self, manager, mock_manager_interface, a_host_sessio
         method = mock_manager_interface.mock.updateTerminology
         method.return_value = {"k": "v", "l": "b"}
 
-        ret = manager.updateTerminology(input_dict)
+        _ret = manager.updateTerminology(input_dict)
         assert input_dict == {"k": "v"}
 
 
@@ -2792,7 +2792,10 @@ def make_expected_err_msg(batch_element_error, index, access, entityRef):
     error_type_name = batch_element_error_codes_names[
         batch_element_error_codes.index(batch_element_error.code)
     ]
-    return f"{error_type_name}: {batch_element_error.message} [index={index}] [access={kAccessNames[access]}] [entity={entityRef}]"
+    return (
+        f"{error_type_name}: {batch_element_error.message} [index={index}]"
+        f" [access={kAccessNames[access]}] [entity={entityRef}]"
+    )
 
 
 # Conveniences to allow us to paramaterize singular and batch
diff --git a/src/openassetio-python/tests/package/hostApi/test_managerfactory.py b/src/openassetio-python/tests/package/hostApi/test_managerfactory.py
index 0d2db7dad..eb192ff66 100644
--- a/src/openassetio-python/tests/package/hostApi/test_managerfactory.py
+++ b/src/openassetio-python/tests/package/hostApi/test_managerfactory.py
@@ -17,7 +17,6 @@
 Tests that cover the openassetio.hostApi.ManagerFactory class.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 import os
diff --git a/src/openassetio-python/tests/package/hostApi/test_managerimplementationfactoryinterface.py b/src/openassetio-python/tests/package/hostApi/test_managerimplementationfactoryinterface.py
index 4dda12c6e..291b1382f 100644
--- a/src/openassetio-python/tests/package/hostApi/test_managerimplementationfactoryinterface.py
+++ b/src/openassetio-python/tests/package/hostApi/test_managerimplementationfactoryinterface.py
@@ -18,7 +18,6 @@
 ManagerImplementationFactoryIntreface methods.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/hostApi/test_terminology.py b/src/openassetio-python/tests/package/hostApi/test_terminology.py
index 3fc16a0c3..27d65c37f 100644
--- a/src/openassetio-python/tests/package/hostApi/test_terminology.py
+++ b/src/openassetio-python/tests/package/hostApi/test_terminology.py
@@ -17,7 +17,6 @@
 Tests that cover the openassetio.hostApi.terminology module.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/managerApi/test_host.py b/src/openassetio-python/tests/package/managerApi/test_host.py
index 7a621e123..b57738d43 100644
--- a/src/openassetio-python/tests/package/managerApi/test_host.py
+++ b/src/openassetio-python/tests/package/managerApi/test_host.py
@@ -17,7 +17,6 @@
 Tests that cover the openassetio.managerApi.host class.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/managerApi/test_hostsession.py b/src/openassetio-python/tests/package/managerApi/test_hostsession.py
index 2521c38f7..5e245b551 100644
--- a/src/openassetio-python/tests/package/managerApi/test_hostsession.py
+++ b/src/openassetio-python/tests/package/managerApi/test_hostsession.py
@@ -17,7 +17,6 @@
 Tests that cover the openassetio.managerApi.HostSession class.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/managerApi/test_managerinterface.py b/src/openassetio-python/tests/package/managerApi/test_managerinterface.py
index e6c20d71f..fbdcc8c90 100644
--- a/src/openassetio-python/tests/package/managerApi/test_managerinterface.py
+++ b/src/openassetio-python/tests/package/managerApi/test_managerinterface.py
@@ -17,7 +17,6 @@
 Tests for the default implementations of ManagerInterface methods.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
@@ -276,7 +275,7 @@ def test_returns_dummy_pager_for_each_input(self, manager_interface, a_host_sess
 
             # The default pager behaviour is to return no data and
             # report no new pages.
-            for idx, x in enumerate(refs):
+            for idx, _ in enumerate(refs):
                 pager = success_callback.call_args_list[idx][0][1]
                 assert_is_default_pager(a_host_session, pager)
 
@@ -315,7 +314,7 @@ def test_returns_dummy_pager_for_each_input(self, manager_interface, a_host_sess
 
             error_callback.assert_not_called()
 
-            for idx, x in enumerate(rels):
+            for idx, _ in enumerate(rels):
                 pager = success_callback.call_args_list[idx][0][1]
                 assert_is_default_pager(a_host_session, pager)
 
@@ -326,10 +325,10 @@ def assert_is_default_pager(a_host_session, pager):
     # The default pager behaviour is to return no data and
     # report no new pages.
     assert isinstance(pager, EntityReferencePagerInterface)
-    assert pager.hasNext(a_host_session) == False
+    assert pager.hasNext(a_host_session) is False
     assert pager.get(a_host_session) == []
     pager.next(a_host_session)
-    assert pager.hasNext(a_host_session) == False
+    assert pager.hasNext(a_host_session) is False
     assert pager.get(a_host_session) == []
 
 
diff --git a/src/openassetio-python/tests/package/managerApi/test_managestatebase.py b/src/openassetio-python/tests/package/managerApi/test_managestatebase.py
index 944a42bc6..9698e5b24 100644
--- a/src/openassetio-python/tests/package/managerApi/test_managestatebase.py
+++ b/src/openassetio-python/tests/package/managerApi/test_managestatebase.py
@@ -17,7 +17,6 @@
 Tests that cover the openassetio.managerApi.ManagerStateBase class.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystem.py b/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystem.py
index 315ef4b0a..3925a4cb9 100644
--- a/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystem.py
+++ b/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystem.py
@@ -17,7 +17,6 @@
 These tests check the functionality of the PythonPluginSystem class.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystemmanagerimplementationfactory.py b/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystemmanagerimplementationfactory.py
index 9ba1119b0..ca70a8d55 100644
--- a/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystemmanagerimplementationfactory.py
+++ b/src/openassetio-python/tests/package/pluginSystem/test_pythonpluginsystemmanagerimplementationfactory.py
@@ -18,7 +18,7 @@
 ManagerImplementationFactoryInterface implementation.
 """
 
-# pylint: disable=no-self-use, unused-argument
+# pylint: disable=unused-argument
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 # pylint: disable=use-implicit-booleaness-not-comparison
diff --git a/src/openassetio-python/tests/package/test/manager/conftest.py b/src/openassetio-python/tests/package/test/manager/conftest.py
index 47cf42c8b..c8b97cfc4 100644
--- a/src/openassetio-python/tests/package/test/manager/conftest.py
+++ b/src/openassetio-python/tests/package/test/manager/conftest.py
@@ -25,7 +25,7 @@
 
 import pytest
 
-from openassetio import hostApi, EntityReference
+from openassetio import hostApi
 from openassetio.trait import TraitsData
 
 
diff --git a/src/openassetio-python/tests/package/test/manager/test__implementation.py b/src/openassetio-python/tests/package/test/manager/test__implementation.py
index 329718e1d..307ce3f84 100644
--- a/src/openassetio-python/tests/package/test/manager/test__implementation.py
+++ b/src/openassetio-python/tests/package/test/manager/test__implementation.py
@@ -17,7 +17,6 @@
 Unit tests for the _implementation module of the manager test harness.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 # pylint: disable=too-many-arguments,too-few-public-methods
@@ -166,9 +165,10 @@ def test_when_shareManager_false_then_unique_uninitialized_manager_set(
         test_case_one_locale,
         test_case_two_locale,
     ):
+        # pylint: disable=unused-argument
         # setup
 
-        def create_manager(initialize=True):
+        def create_manager(initialize=True):  # pylint: disable=unused-argument
             return Mock()
 
         manager_create_fn = Mock(wraps=create_manager)
@@ -180,7 +180,7 @@ def create_manager(initialize=True):
 
         # action
 
-        suite = loader.loadTestsFromTestCase(mock_test_case_class)
+        _suite = loader.loadTestsFromTestCase(mock_test_case_class)
 
         # confirm
 
diff --git a/src/openassetio-python/tests/package/test/manager/test_harness.py b/src/openassetio-python/tests/package/test/manager/test_harness.py
index 57f79dfea..82f065c1e 100644
--- a/src/openassetio-python/tests/package/test/manager/test_harness.py
+++ b/src/openassetio-python/tests/package/test/manager/test_harness.py
@@ -17,7 +17,6 @@
 Tests for public API of the manager test harness.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
@@ -32,7 +31,7 @@
 import uuid
 import pytest
 
-from openassetio import constants, Context, EntityReference, errors
+from openassetio import constants, EntityReference, errors
 from openassetio.test.manager.harness import (
     executeSuite,
     fixturesFromPyFile,
diff --git a/src/openassetio-python/tests/package/test/manager/test_main.py b/src/openassetio-python/tests/package/test/manager/test_main.py
index f7dbcc2eb..50702cb02 100644
--- a/src/openassetio-python/tests/package/test/manager/test_main.py
+++ b/src/openassetio-python/tests/package/test/manager/test_main.py
@@ -17,7 +17,6 @@
 Integration tests for CLI operation of the manager test harness.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/test_batchelementerror.py b/src/openassetio-python/tests/package/test_batchelementerror.py
index 07e65e087..0a0e69800 100644
--- a/src/openassetio-python/tests/package/test_batchelementerror.py
+++ b/src/openassetio-python/tests/package/test_batchelementerror.py
@@ -17,12 +17,12 @@
 Tests for the BatchElementError type.
 """
 
-# pylint: disable=no-self-use, too-few-public-methods
+# pylint: disable=too-few-public-methods
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
+import re
 
 import pytest
-import re
 
 from openassetio.errors import BatchElementError, BatchElementException, OpenAssetIOException
 
diff --git a/src/openassetio-python/tests/package/test_context.py b/src/openassetio-python/tests/package/test_context.py
index e3ba202bc..14aad5a2c 100644
--- a/src/openassetio-python/tests/package/test_context.py
+++ b/src/openassetio-python/tests/package/test_context.py
@@ -17,7 +17,7 @@
 Tests that cover the openassetio.Context class.
 """
 
-# pylint: disable=invalid-name,no-self-use,redefined-outer-name
+# pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 import pytest
 
diff --git a/src/openassetio-python/tests/package/test_entityreference.py b/src/openassetio-python/tests/package/test_entityreference.py
index 12434a9d9..a842aea62 100644
--- a/src/openassetio-python/tests/package/test_entityreference.py
+++ b/src/openassetio-python/tests/package/test_entityreference.py
@@ -17,7 +17,7 @@
 Tests for the EntityReference type.
 """
 
-# pylint: disable=no-self-use, too-few-public-methods
+# pylint: disable=too-few-public-methods
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/test_imports.py b/src/openassetio-python/tests/package/test_imports.py
index b1e4dd8fe..98482a3b8 100644
--- a/src/openassetio-python/tests/package/test_imports.py
+++ b/src/openassetio-python/tests/package/test_imports.py
@@ -27,7 +27,6 @@
 import pytest
 
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name
 # pylint: disable=unused-import,import-outside-toplevel
 # pylint: disable=missing-class-docstring,missing-function-docstring
diff --git a/src/openassetio-python/tests/package/test_log.py b/src/openassetio-python/tests/package/test_log.py
index 85139e7ec..67b408bf2 100644
--- a/src/openassetio-python/tests/package/test_log.py
+++ b/src/openassetio-python/tests/package/test_log.py
@@ -17,7 +17,6 @@
 Tests that cover the openassetio.log module.
 """
 
-# pylint: disable=no-self-use
 # pylint: disable=invalid-name,redefined-outer-name
 # pylint: disable=missing-class-docstring,missing-function-docstring
 
diff --git a/src/openassetio-python/tests/package/test_traitsdata.py b/src/openassetio-python/tests/package/test_traitsdata.py
index 5556042ae..bf5d0f13e 100644
--- a/src/openassetio-python/tests/package/test_traitsdata.py
+++ b/src/openassetio-python/tests/package/test_traitsdata.py
@@ -2,7 +2,7 @@
 Tests for the traits data container
 """
 # pylint: disable=invalid-name,missing-class-docstring
-# pylint: disable=redefined-outer-name,no-self-use
+# pylint: disable=redefined-outer-name
 # pylint: disable=missing-function-docstring
 import pytest