Switch to ruff for formatting and use codespell and docformatter (#261)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5e5a5fe..c3856aa 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -4,15 +4,23 @@
     hooks:
       - id: end-of-file-fixer
       - id: trailing-whitespace
+  - repo: https://github.com/codespell-project/codespell
+    rev: v2.2.6
+    hooks:
+      - id: codespell
+        additional_dependencies: [ "tomli>=2.0.1" ]
+  - repo: https://github.com/PyCQA/docformatter
+    rev: v1.7.5
+    hooks:
+      - id: docformatter
+        additional_dependencies: [ "tomli>=2.0.1" ]
+        args: [ "--in-place", "--config", "./pyproject.toml" ]
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: "v0.1.14"
+    rev: "v0.1.15"
     hooks:
+      - id: ruff-format
       - id: ruff
-        args: [--fix, --exit-non-zero-on-fix]
-  - repo: https://github.com/psf/black
-    rev: 24.1.1
-    hooks:
-      - id: black
+        args: [ "--fix", "--unsafe-fixes", "--exit-non-zero-on-fix" ]
   - repo: https://github.com/tox-dev/tox-ini-fmt
     rev: "1.3.1"
     hooks:
@@ -22,7 +30,7 @@
     rev: "1.7.0"
     hooks:
       - id: pyproject-fmt
-        additional_dependencies: ["tox>=4.11.4"]
+        additional_dependencies: ["tox>=4.12.1"]
   - repo: meta
     hooks:
       - id: check-hooks-apply
diff --git a/CHANGES.rst b/CHANGES.rst
index 3fa20cc..4377e2f 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -182,7 +182,7 @@
 - [PR #42] AppAuthor is now optional on Windows
 - [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows
   support requires `JNA <https://github.com/twall/jna>`_.
-- [PR #44] Fix incorrect behaviour of the site_config_dir method
+- [PR #44] Fix incorrect behavior of the site_config_dir method
 
 appdirs 1.3.0 (2014-04-22)
 --------------------------
@@ -190,7 +190,7 @@
   everybody
 - [Unix] Removes gratuitous case mangling of the case, since \*nix-es are
   usually case sensitive, so mangling is not wise
-- [Unix] Fixes the utterly wrong behaviour in ``site_data_dir``, return result
+- [Unix] Fixes the utterly wrong behavior in ``site_data_dir``, return result
   based on XDG_DATA_DIRS and make room for respecting the standard which
   specifies XDG_DATA_DIRS is a multiple-value variable
 - [Issue 6] Add ``*_config_dir`` which are distinct on nix-es, according to
@@ -210,7 +210,7 @@
 - [Unix, issue 2, issue 7] appdirs now conforms to `XDG base directory spec
   <https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_.
 - [Mac, issue 5] Fix ``site_data_dir()`` on Mac.
-- [Mac] Drop use of 'Carbon' module in favour of hardcoded paths; supports
+- [Mac] Drop use of 'Carbon' module in favor of hardcoded paths; supports
   Python3 now.
 - [Windows] Append "Cache" to ``user_cache_dir`` on Windows by default. Use
   ``opinion=False`` option to disable this.
@@ -225,10 +225,10 @@
 - [Linux] Change default ``user_cache_dir()`` on Linux to be singular, e.g.
   "~/.superapp/cache".
 - [Windows] Add ``roaming`` option to ``user_data_dir()`` (for use on Windows only)
-  and change the default ``user_data_dir`` behaviour to use a *non*-roaming
+  and change the default ``user_data_dir`` behavior to use a *non*-roaming
   profile dir (``CSIDL_LOCAL_APPDATA`` instead of ``CSIDL_APPDATA``). Why? Because
   a large roaming profile can cause login speed issues. The "only syncs on
-  logout" behaviour can cause surprises in appdata info.
+  logout" behavior can cause surprises in appdata info.
 
 
 appdirs 1.0.1 (never released)
@@ -236,8 +236,5 @@
 
 Started this changelog 27 July 2010. Before that this module originated in the
 `Komodo <https://www.activestate.com/komodo-ide>`_ product as ``applib.py`` and then
-as `applib/location.py
-<https://github.com/ActiveState/applib/blob/master/applib/location.py>`_ (used by
-`PyPM <https://code.activestate.com/pypm/>`_ in `ActivePython
-<https://www.activestate.com/activepython>`_). This is basically a fork of
-applib.py 1.0.1 and applib/location.py 1.0.1.
+as ``applib/location.py`` (used by `PyPM <https://code.activestate.com/pypm/>`_ in `ActivePython
+<https://www.activestate.com/activepython>`_). This is basically a fork of applib.py 1.0.1 and applib/location.py 1.0.1.
diff --git a/docs/conf.py b/docs/conf.py
index 2317c21..eb9b10e 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,5 +1,6 @@
 # noqa: INP001
 """Configuration for Sphinx."""
+
 from __future__ import annotations
 
 from datetime import datetime, timezone
diff --git a/pyproject.toml b/pyproject.toml
index b35c39e..3e051c8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -67,33 +67,47 @@
 build.targets.sdist.include = ["/src", "/tests", "/tox.ini"]
 version.source = "vcs"
 
-[tool.black]
-line-length = 120
-
 [tool.ruff]
 select = ["ALL"]
 line-length = 120
 target-version = "py38"
-isort = {known-first-party = ["platformdirs", "tests"], required-imports = ["from __future__ import annotations"]}
+isort = { known-first-party = ["platformdirs", "tests"], required-imports = ["from __future__ import annotations"] }
 ignore = [
-    "ANN101",  # Missing type annotation for `self` in method
-    "D301",  #  Use `r"""` if any backslashes in a docstring
-    "D205",  # 1 blank line required between summary line and description
-    "D401",  # First line of docstring should be in imperative mood
-    "D203",  # `one-blank-line-before-class` (D203) and `no-blank-line-before-class` (D211) are incompatible
-    "D212",  # `multi-line-summary-first-line` (D212) and `multi-line-summary-second-line` (D213) are incompatible
-    "S104",  # Possible binding to all interface
+  "ANN101", # Missing type annotation for `self` in method
+  "D301",   # Use `r"""` if any backslashes in a docstring
+  "D205",   # 1 blank line required between summary line and description
+  "D401",   # The first line of docstring should be in imperative mood
+  "D203",   # `one-blank-line-before-class` (D203) and `no-blank-line-before-class` (D211) are incompatible
+  "D212",   # `multi-line-summary-first-line` (D212) and `multi-line-summary-second-line` (D213) are incompatible
+  "S104",   # Possible binding to all interfaces
+  "CPY",    # no copyright notices
 ]
+format.preview = true
+lint.preview = true
 [tool.ruff.per-file-ignores]
 "tests/**/*.py" = [
-    "S101",  # asserts allowed in tests...
-    "FBT",  # don"t care about booleans as positional arguments in tests
-    "INP001", # no implicit namespace
-    "D",  # don"t care about documentation in tests
-    "S603",  # `subprocess` call: check for execution of untrusted input
-    "PLR2004",  # Magic value used in comparison, consider replacing with a constant variable
+  "S101",    # asserts allowed in tests...
+  "FBT",     # don"t care about booleans as positional arguments in tests
+  "INP001",  # no implicit namespace
+  "D",       # don't care about documentation in tests
+  "S603",    # `subprocess` call: check for execution of untrusted input
+  "PLR2004", # Magic value used in comparison, consider replacing with a constant variable
+  "PLC2701", # Private name import
+  "PLR0917", # Too many positional arguments
 ]
 
+[tool.codespell]
+builtin = "clear,usage,en-GB_to_en-US"
+count = true
+quiet-level = 3
+
+[tool.docformatter]
+blank = true
+recursive = true
+pre-summary-newline = true
+wrap-descriptions = 120
+wrap-summaries = 120
+
 [tool.coverage]
 html.show_contexts = true
 html.skip_covered = false
diff --git a/src/platformdirs/__init__.py b/src/platformdirs/__init__.py
index 75c8bff..3f7d949 100644
--- a/src/platformdirs/__init__.py
+++ b/src/platformdirs/__init__.py
@@ -1,6 +1,8 @@
 """
-Utilities for determining application-specific dirs. See <https://github.com/platformdirs/platformdirs> for details and
-usage.
+Utilities for determining application-specific dirs.
+
+See <https://github.com/platformdirs/platformdirs> for details and usage.
+
 """
 
 from __future__ import annotations
@@ -20,22 +22,22 @@
 
 def _set_platform_dir_class() -> type[PlatformDirsABC]:
     if sys.platform == "win32":
-        from platformdirs.windows import Windows as Result
+        from platformdirs.windows import Windows as Result  # noqa: PLC0415
     elif sys.platform == "darwin":
-        from platformdirs.macos import MacOS as Result
+        from platformdirs.macos import MacOS as Result  # noqa: PLC0415
     else:
-        from platformdirs.unix import Unix as Result
+        from platformdirs.unix import Unix as Result  # noqa: PLC0415
 
     if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
         if os.getenv("SHELL") or os.getenv("PREFIX"):
             return Result
 
-        from platformdirs.android import _android_folder
+        from platformdirs.android import _android_folder  # noqa: PLC0415
 
         if _android_folder() is not None:
-            from platformdirs.android import Android
+            from platformdirs.android import Android  # noqa: PLC0415
 
-            return Android  # return to avoid redefinition of result
+            return Android  # return to avoid redefinition of a result
 
     return Result
 
@@ -507,7 +509,7 @@
 
 
 def user_documents_path() -> Path:
-    """:returns: documents path tied to the user"""
+    """:returns: documents a path tied to the user"""
     return PlatformDirs().user_documents_path
 
 
@@ -585,41 +587,41 @@
 
 
 __all__ = [
+    "AppDirs",
+    "PlatformDirs",
+    "PlatformDirsABC",
     "__version__",
     "__version_info__",
-    "PlatformDirs",
-    "AppDirs",
-    "PlatformDirsABC",
-    "user_data_dir",
-    "user_config_dir",
-    "user_cache_dir",
-    "user_state_dir",
-    "user_log_dir",
-    "user_documents_dir",
-    "user_downloads_dir",
-    "user_pictures_dir",
-    "user_videos_dir",
-    "user_music_dir",
-    "user_desktop_dir",
-    "user_runtime_dir",
-    "site_data_dir",
-    "site_config_dir",
     "site_cache_dir",
-    "site_runtime_dir",
-    "user_data_path",
-    "user_config_path",
-    "user_cache_path",
-    "user_state_path",
-    "user_log_path",
-    "user_documents_path",
-    "user_downloads_path",
-    "user_pictures_path",
-    "user_videos_path",
-    "user_music_path",
-    "user_desktop_path",
-    "user_runtime_path",
-    "site_data_path",
-    "site_config_path",
     "site_cache_path",
+    "site_config_dir",
+    "site_config_path",
+    "site_data_dir",
+    "site_data_path",
+    "site_runtime_dir",
     "site_runtime_path",
+    "user_cache_dir",
+    "user_cache_path",
+    "user_config_dir",
+    "user_config_path",
+    "user_data_dir",
+    "user_data_path",
+    "user_desktop_dir",
+    "user_desktop_path",
+    "user_documents_dir",
+    "user_documents_path",
+    "user_downloads_dir",
+    "user_downloads_path",
+    "user_log_dir",
+    "user_log_path",
+    "user_music_dir",
+    "user_music_path",
+    "user_pictures_dir",
+    "user_pictures_path",
+    "user_runtime_dir",
+    "user_runtime_path",
+    "user_state_dir",
+    "user_state_path",
+    "user_videos_dir",
+    "user_videos_path",
 ]
diff --git a/src/platformdirs/__main__.py b/src/platformdirs/__main__.py
index 4bf27c9..922c521 100644
--- a/src/platformdirs/__main__.py
+++ b/src/platformdirs/__main__.py
@@ -24,7 +24,7 @@
 
 
 def main() -> None:
-    """Run main entry point."""
+    """Run the main entry point."""
     app_name = "MyApp"
     app_author = "MyCompany"
 
diff --git a/src/platformdirs/android.py b/src/platformdirs/android.py
index 4acdb63..fefafd3 100644
--- a/src/platformdirs/android.py
+++ b/src/platformdirs/android.py
@@ -13,10 +13,11 @@
 
 class Android(PlatformDirsABC):
     """
-    Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_. Makes use of the
-    `appname <platformdirs.api.PlatformDirsABC.appname>`,
-    `version <platformdirs.api.PlatformDirsABC.version>`,
-    `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+    Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_.
+
+    Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `version
+    <platformdirs.api.PlatformDirsABC.version>`, `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
     """
 
     @property
@@ -44,7 +45,7 @@
 
     @property
     def user_cache_dir(self) -> str:
-        """:return: cache directory tied to the user, e.g. e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>``"""
+        """:return: cache directory tied to the user, e.g.,``/data/user/<userid>/<packagename>/cache/<AppName>``"""
         return self._append_app_name_and_version(cast(str, _android_folder()), "cache")
 
     @property
@@ -119,13 +120,13 @@
 def _android_folder() -> str | None:
     """:return: base folder for the Android OS or None if it cannot be found"""
     try:
-        # First try to get path to android app via pyjnius
-        from jnius import autoclass
+        # First try to get a path to android app via pyjnius
+        from jnius import autoclass  # noqa: PLC0415
 
         context = autoclass("android.content.Context")
         result: str | None = context.getFilesDir().getParentFile().getAbsolutePath()
     except Exception:  # noqa: BLE001
-        # if fails find an android folder looking path on the sys.path
+        # if fails find an android folder looking a path on the sys.path
         pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files")
         for path in sys.path:
             if pattern.match(path):
@@ -141,7 +142,7 @@
     """:return: documents folder for the Android OS"""
     # Get directories with pyjnius
     try:
-        from jnius import autoclass
+        from jnius import autoclass  # noqa: PLC0415
 
         context = autoclass("android.content.Context")
         environment = autoclass("android.os.Environment")
@@ -157,7 +158,7 @@
     """:return: downloads folder for the Android OS"""
     # Get directories with pyjnius
     try:
-        from jnius import autoclass
+        from jnius import autoclass  # noqa: PLC0415
 
         context = autoclass("android.content.Context")
         environment = autoclass("android.os.Environment")
@@ -173,7 +174,7 @@
     """:return: pictures folder for the Android OS"""
     # Get directories with pyjnius
     try:
-        from jnius import autoclass
+        from jnius import autoclass  # noqa: PLC0415
 
         context = autoclass("android.content.Context")
         environment = autoclass("android.os.Environment")
@@ -189,7 +190,7 @@
     """:return: videos folder for the Android OS"""
     # Get directories with pyjnius
     try:
-        from jnius import autoclass
+        from jnius import autoclass  # noqa: PLC0415
 
         context = autoclass("android.content.Context")
         environment = autoclass("android.os.Environment")
@@ -205,7 +206,7 @@
     """:return: music folder for the Android OS"""
     # Get directories with pyjnius
     try:
-        from jnius import autoclass
+        from jnius import autoclass  # noqa: PLC0415
 
         context = autoclass("android.content.Context")
         environment = autoclass("android.os.Environment")
diff --git a/src/platformdirs/api.py b/src/platformdirs/api.py
index 031a38a..ba0018e 100644
--- a/src/platformdirs/api.py
+++ b/src/platformdirs/api.py
@@ -11,10 +11,10 @@
     from typing import Iterator, Literal
 
 
-class PlatformDirsABC(ABC):
+class PlatformDirsABC(ABC):  # noqa: PLR0904
     """Abstract base class for platform directories."""
 
-    def __init__(  # noqa: PLR0913
+    def __init__(  # noqa: PLR0913, PLR0917
         self,
         appname: str | None = None,
         appauthor: str | None | Literal[False] = None,
@@ -34,34 +34,47 @@
         :param multipath: See `multipath`.
         :param opinion: See `opinion`.
         :param ensure_exists: See `ensure_exists`.
+
         """
         self.appname = appname  #: The name of application.
         self.appauthor = appauthor
         """
-        The name of the app author or distributing body for this application. Typically, it is the owning company name.
-        Defaults to `appname`. You may pass ``False`` to disable it.
+        The name of the app author or distributing body for this application.
+
+        Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it.
+
         """
         self.version = version
         """
-        An optional version path element to append to the path. You might want to use this if you want multiple versions
-        of your app to be able to run independently. If used, this would typically be ``<major>.<minor>``.
+        An optional version path element to append to the path.
+
+        You might want to use this if you want multiple versions of your app to be able to run independently. If used,
+        this would typically be ``<major>.<minor>``.
+
         """
         self.roaming = roaming
         """
-        Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup
-        for roaming profiles, this user data will be synced on login (see
+        Whether to use the roaming appdata directory on Windows.
+
+        That means that for users on a Windows network setup for roaming profiles, this user data will be synced on
+        login (see
         `here <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_).
+
         """
         self.multipath = multipath
         """
         An optional parameter which indicates that the entire list of data dirs should be returned.
+
         By default, the first item would only be returned.
+
         """
         self.opinion = opinion  #: A flag to indicating to use opinionated values.
         self.ensure_exists = ensure_exists
         """
         Optionally create the directory (and any missing parents) upon access if it does not exist.
+
         By default, no directories are created.
+
         """
 
     def _append_app_name_and_version(self, *base: str) -> str:
@@ -200,7 +213,7 @@
 
     @property
     def user_documents_path(self) -> Path:
-        """:return: documents path tied to the user"""
+        """:return: documents a path tied to the user"""
         return Path(self.user_documents_dir)
 
     @property
diff --git a/src/platformdirs/macos.py b/src/platformdirs/macos.py
index b7b4880..eb1ba5d 100644
--- a/src/platformdirs/macos.py
+++ b/src/platformdirs/macos.py
@@ -10,11 +10,14 @@
 
 class MacOS(PlatformDirsABC):
     """
-    Platform directories for the macOS operating system. Follows the guidance from `Apple documentation
-    <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_.
+    Platform directories for the macOS operating system.
+
+    Follows the guidance from
+    `Apple documentation <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_.
     Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`,
     `version <platformdirs.api.PlatformDirsABC.version>`,
     `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
     """
 
     @property
@@ -28,7 +31,7 @@
         :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``.
           If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory
           will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``.
-          If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled and we're in Homebrew,
+          If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew,
           the response is a multi-path string separated by ":", e.g.
           ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version``
         """
@@ -60,7 +63,7 @@
         :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``.
           If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory
           will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``.
-          If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled and we're in Homebrew,
+          If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew,
           the response is a multi-path string separated by ":", e.g.
           ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version``
         """
diff --git a/src/platformdirs/unix.py b/src/platformdirs/unix.py
index ca4728e..bee1b8b 100644
--- a/src/platformdirs/unix.py
+++ b/src/platformdirs/unix.py
@@ -20,17 +20,17 @@
     from os import getuid
 
 
-class Unix(PlatformDirsABC):
+class Unix(PlatformDirsABC):  # noqa: PLR0904
     """
-    On Unix/Linux, we follow the
-    `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_. The spec allows
-    overriding directories with environment variables. The examples show are the default values, alongside the name of
-    the environment variable that overrides them. Makes use of the
-    `appname <platformdirs.api.PlatformDirsABC.appname>`,
-    `version <platformdirs.api.PlatformDirsABC.version>`,
-    `multipath <platformdirs.api.PlatformDirsABC.multipath>`,
-    `opinion <platformdirs.api.PlatformDirsABC.opinion>`,
-    `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+    On Unix/Linux, we follow the `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-
+    latest.html>`_.
+
+    The spec allows overriding directories with environment variables. The examples show are the default values,
+    alongside the name of the environment variable that overrides them. Makes use of the `appname
+    <platformdirs.api.PlatformDirsABC.appname>`, `version <platformdirs.api.PlatformDirsABC.version>`, `multipath
+    <platformdirs.api.PlatformDirsABC.multipath>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists
+    <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
     """
 
     @property
@@ -205,17 +205,17 @@
 
     @property
     def site_data_path(self) -> Path:
-        """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
+        """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
         return self._first_item_as_path_if_multipath(self.site_data_dir)
 
     @property
     def site_config_path(self) -> Path:
-        """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``"""
+        """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``"""
         return self._first_item_as_path_if_multipath(self.site_config_dir)
 
     @property
     def site_cache_path(self) -> Path:
-        """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
+        """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
         return self._first_item_as_path_if_multipath(self.site_cache_dir)
 
     def _first_item_as_path_if_multipath(self, directory: str) -> Path:
@@ -246,7 +246,12 @@
 
 
 def _get_user_dirs_folder(key: str) -> str | None:
-    """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/."""
+    """
+    Return directory from user-dirs.dirs config file.
+
+    See https://freedesktop.org/wiki/Software/xdg-user-dirs/.
+
+    """
     user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs"
     if user_dirs_config_path.exists():
         parser = ConfigParser()
diff --git a/src/platformdirs/windows.py b/src/platformdirs/windows.py
index c62d0c8..a4a13ea 100644
--- a/src/platformdirs/windows.py
+++ b/src/platformdirs/windows.py
@@ -16,15 +16,14 @@
 
 class Windows(PlatformDirsABC):
     """
-    `MSDN on where to store app data files
-    <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_.
-    Makes use of the
-    `appname <platformdirs.api.PlatformDirsABC.appname>`,
-    `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`,
-    `version <platformdirs.api.PlatformDirsABC.version>`,
-    `roaming <platformdirs.api.PlatformDirsABC.roaming>`,
-    `opinion <platformdirs.api.PlatformDirsABC.opinion>`,
-    `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+    `MSDN on where to store app data files <http://support.microsoft.com/default.aspx?scid=kb;en-
+    us;310294#XSLTH3194121123120121120120>`_.
+
+    Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `appauthor
+    <platformdirs.api.PlatformDirsABC.appauthor>`, `version <platformdirs.api.PlatformDirsABC.version>`, `roaming
+    <platformdirs.api.PlatformDirsABC.roaming>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists
+    <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
     """
 
     @property
@@ -165,7 +164,7 @@
 
 
 def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None:
-    """Get folder for a CSIDL name that does not exist as an environment variable."""
+    """Get a folder for a CSIDL name that does not exist as an environment variable."""
     if csidl_name == "CSIDL_PERSONAL":
         return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents")  # noqa: PTH118
 
@@ -189,6 +188,7 @@
 
     This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer
     for all CSIDL_* names.
+
     """
     shell_folder_name = {
         "CSIDL_APPDATA": "AppData",
@@ -205,7 +205,7 @@
         raise ValueError(msg)
     if sys.platform != "win32":  # only needed for mypy type checker to know that this code runs only on Windows
         raise NotImplementedError
-    import winreg
+    import winreg  # noqa: PLC0415
 
     key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
     directory, _ = winreg.QueryValueEx(key, shell_folder_name)
@@ -253,7 +253,7 @@
     if hasattr(ctypes, "windll"):
         return get_win_folder_via_ctypes
     try:
-        import winreg  # noqa: F401
+        import winreg  # noqa: PLC0415, F401
     except ImportError:
         return get_win_folder_from_env_vars
     else:
diff --git a/tests/test_android.py b/tests/test_android.py
index 87fa98c..57ac1b5 100644
--- a/tests/test_android.py
+++ b/tests/test_android.py
@@ -68,13 +68,13 @@
 
 
 def test_android_folder_from_jnius(mocker: MockerFixture) -> None:
-    from platformdirs import PlatformDirs
-    from platformdirs.android import _android_folder
+    from platformdirs import PlatformDirs  # noqa: PLC0415
+    from platformdirs.android import _android_folder  # noqa: PLC0415
 
     _android_folder.cache_clear()
 
     if PlatformDirs is Android:
-        import jnius  # pragma: no cover
+        import jnius  # pragma: no cover # noqa: PLC0415
 
         autoclass = mocker.spy(jnius, "autoclass")  # pragma: no cover
     else:
@@ -103,7 +103,7 @@
 def test_android_folder_from_sys_path(mocker: MockerFixture, path: str, monkeypatch: pytest.MonkeyPatch) -> None:
     mocker.patch.dict(sys.modules, {"jnius": MagicMock(autoclass=MagicMock(side_effect=ModuleNotFoundError))})
 
-    from platformdirs.android import _android_folder
+    from platformdirs.android import _android_folder  # noqa: PLC0415
 
     _android_folder.cache_clear()
     monkeypatch.setattr(sys, "path", ["/A", "/B", path])
@@ -115,7 +115,7 @@
 def test_android_folder_not_found(mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch) -> None:
     mocker.patch.dict(sys.modules, {"jnius": MagicMock(autoclass=MagicMock(side_effect=ModuleNotFoundError))})
 
-    from platformdirs.android import _android_folder
+    from platformdirs.android import _android_folder  # noqa: PLC0415
 
     _android_folder.cache_clear()
     monkeypatch.setattr(sys, "path", [])
diff --git a/tests/test_api.py b/tests/test_api.py
index 5c5e7d6..8f3b455 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -68,7 +68,7 @@
         else:
             monkeypatch.setenv(env_var, value)
 
-    from platformdirs.android import _android_folder
+    from platformdirs.android import _android_folder  # noqa: PLC0415
 
     _android_folder.cache_clear()
     monkeypatch.setattr(sys, "path", ["/A", "/B", path])
diff --git a/tests/test_comp_with_appdirs.py b/tests/test_comp_with_appdirs.py
index 89775b4..58d7ae6 100644
--- a/tests/test_comp_with_appdirs.py
+++ b/tests/test_comp_with_appdirs.py
@@ -11,7 +11,7 @@
 
 
 def test_has_backward_compatible_class() -> None:
-    from platformdirs import AppDirs
+    from platformdirs import AppDirs  # noqa: PLC0415
 
     assert AppDirs is platformdirs.PlatformDirs
 
diff --git a/tests/test_macos.py b/tests/test_macos.py
index 551ec0f..f49d446 100644
--- a/tests/test_macos.py
+++ b/tests/test_macos.py
@@ -15,9 +15,7 @@
 
 @pytest.fixture(autouse=True)
 def _fix_os_pathsep(mocker: MockerFixture) -> None:
-    """
-    If we're not actually running on macOS, set `os.pathsep` to what it should be on macOS.
-    """
+    """If we're not running on macOS, set `os.pathsep` to what it should be on macOS."""
     if sys.platform != "darwin":  # pragma: darwin no cover
         mocker.patch("os.pathsep", ":")
         mocker.patch("os.path.pathsep", ":")
diff --git a/tests/test_main.py b/tests/test_main.py
index 2c1eb90..1fc3432 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -1,7 +1,7 @@
 from __future__ import annotations
 
 import sys
-from subprocess import check_output
+from subprocess import check_output  # noqa: S404
 
 from platformdirs import __version__
 from platformdirs.__main__ import PROPS
diff --git a/whitelist.txt b/whitelist.txt
deleted file mode 100644
index ac5ecbc..0000000
--- a/whitelist.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-appauthor
-appdirs
-appname
-autoclass
-autodoc
-autosectionlabel
-buf
-buf2
-csidl
-dcim
-delenv
-getuid
-highbit
-hkey
-intersphinx
-isfunction
-jnius
-macos
-multipath
-platformdirs
-py38
-pygments
-pyjnius
-setenv
-shell32
-typehints
-usefixtures
-win32
-winreg
-xdg