From de24fd0b76f6d86672a721f8c130642b0be4bcf0 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Fri, 25 Oct 2024 23:06:19 +0100 Subject: [PATCH] Use ``_StrPath`` in ``sphinx.cmd.make_mode`` --- sphinx/cmd/make_mode.py | 48 ++++++++++++++++++++++++----------------- sphinx/util/osutil.py | 2 +- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/sphinx/cmd/make_mode.py b/sphinx/cmd/make_mode.py index ac22ba998..00c874486 100644 --- a/sphinx/cmd/make_mode.py +++ b/sphinx/cmd/make_mode.py @@ -13,11 +13,11 @@ import os import subprocess import sys from contextlib import chdir -from os import path from typing import TYPE_CHECKING import sphinx from sphinx.cmd.build import build_main +from sphinx.util._pathlib import _StrPath from sphinx.util.console import blue, bold, color_terminal, nocolor from sphinx.util.osutil import rmtree @@ -57,30 +57,36 @@ BUILDERS = [ class Make: - def __init__(self, *, source_dir: str, build_dir: str, opts: Sequence[str]) -> None: - self.source_dir = source_dir - self.build_dir = build_dir + def __init__( + self, + *, + source_dir: str | os.PathLike[str], + build_dir: str | os.PathLike[str], + opts: Sequence[str], + ) -> None: + self.source_dir = _StrPath(source_dir) + self.build_dir = _StrPath(build_dir) self.opts = [*opts] - def build_dir_join(self, *comps: str) -> str: - return path.join(self.build_dir, *comps) + def build_dir_join(self, *comps: str | os.PathLike[str]) -> _StrPath: + return self.build_dir.joinpath(*comps) def build_clean(self) -> int: - source_dir = path.abspath(self.source_dir) - build_dir = path.abspath(self.build_dir) - if not path.exists(self.build_dir): + source_dir = self.source_dir.resolve() + build_dir = self.build_dir.resolve() + if not self.build_dir.exists(): return 0 - elif not path.isdir(self.build_dir): - print('Error: %r is not a directory!' % self.build_dir) + elif not self.build_dir.is_dir(): + print("Error: '%s' is not a directory!" % self.build_dir) return 1 elif source_dir == build_dir: - print('Error: %r is same as source directory!' % self.build_dir) + print("Error: '%s' is same as source directory!" % self.build_dir) return 1 - elif path.commonpath([source_dir, build_dir]) == build_dir: - print('Error: %r directory contains source directory!' % self.build_dir) + elif source_dir.is_relative_to(build_dir): + print("Error: '%s' directory contains source directory!" % self.build_dir) return 1 - print('Removing everything under %r...' % self.build_dir) - for item in os.listdir(self.build_dir): + print("Removing everything under '%s'..." % self.build_dir) + for item in self.build_dir.iterdir(): rmtree(self.build_dir_join(item)) return 0 @@ -179,7 +185,9 @@ class Make: return 1 return 0 - def run_generic_build(self, builder: str, doctreedir: str | None = None) -> int: + def run_generic_build( + self, builder: str, doctreedir: str | os.PathLike[str] | None = None + ) -> int: # compatibility with old Makefile paper_size = os.getenv('PAPER', '') if paper_size in {'a4', 'letter'}: @@ -191,9 +199,9 @@ class Make: '--builder', builder, '--doctree-dir', - doctreedir, - self.source_dir, - self.build_dir_join(builder), + str(doctreedir), + str(self.source_dir), + str(self.build_dir_join(builder)), ] return build_main(args + self.opts) diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py index 4e092692b..7ec14d446 100644 --- a/sphinx/util/osutil.py +++ b/sphinx/util/osutil.py @@ -236,7 +236,7 @@ class FileAvoidWrite: return getattr(self._io, name) -def rmtree(path: str) -> None: +def rmtree(path: str | os.PathLike[str], /) -> None: if os.path.isdir(path): shutil.rmtree(path) else: