Skip to content

Commit fc62472

Browse files
authored
Replace os.path.join with pathlib (#13252)
1 parent 4b1d64d commit fc62472

23 files changed

+163
-166
lines changed

sphinx/builders/__init__.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ def build(
414414

415415
with (
416416
progress_message(__('pickling environment')),
417-
open(os.path.join(self.doctreedir, ENV_PICKLE_FILENAME), 'wb') as f,
417+
open(self.doctreedir / ENV_PICKLE_FILENAME, 'wb') as f,
418418
):
419419
pickle.dump(self.env, f, pickle.HIGHEST_PROTOCOL)
420420

@@ -622,7 +622,7 @@ def read_doc(self, docname: str, *, _cache: bool = True) -> None:
622622
env.prepare_settings(docname)
623623

624624
# Add confdir/docutils.conf to dependencies list if exists
625-
docutilsconf = os.path.join(self.confdir, 'docutils.conf')
625+
docutilsconf = self.confdir / 'docutils.conf'
626626
if os.path.isfile(docutilsconf):
627627
env.note_dependency(docutilsconf)
628628

@@ -674,7 +674,7 @@ def write_doctree(
674674
doctree.settings.env = None
675675
doctree.settings.record_dependencies = None
676676

677-
doctree_filename = os.path.join(self.doctreedir, docname + '.doctree')
677+
doctree_filename = self.doctreedir / f'{docname}.doctree'
678678
ensuredir(os.path.dirname(doctree_filename))
679679
with open(doctree_filename, 'wb') as f:
680680
pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)

sphinx/builders/_epub_base.py

+19-17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import os.path
88
import re
99
import time
10+
from pathlib import Path
1011
from typing import TYPE_CHECKING, NamedTuple
1112
from urllib.parse import quote
1213
from zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile
@@ -19,12 +20,12 @@
1920
from sphinx.builders.html._build_info import BuildInfo
2021
from sphinx.locale import __
2122
from sphinx.util import logging
23+
from sphinx.util._pathlib import _StrPath
2224
from sphinx.util.display import status_iterator
2325
from sphinx.util.fileutil import copy_asset_file
2426
from sphinx.util.osutil import copyfile, ensuredir, relpath
2527

2628
if TYPE_CHECKING:
27-
from pathlib import Path
2829
from typing import Any
2930

3031
from docutils.nodes import Element, Node
@@ -158,7 +159,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
158159
guide_titles = GUIDE_TITLES
159160
media_types = MEDIA_TYPES
160161
refuri_re = REFURI_RE
161-
template_dir = ''
162+
template_dir: _StrPath = _StrPath()
162163
doctype = ''
163164

164165
def init(self) -> None:
@@ -417,7 +418,7 @@ def copy_image_files_pil(self) -> None:
417418
The method tries to read and write the files with Pillow, converting
418419
the format and resizing the image if necessary/possible.
419420
"""
420-
ensuredir(os.path.join(self.outdir, self.imagedir))
421+
ensuredir(self.outdir / self.imagedir)
421422
for src in status_iterator(
422423
self.images,
423424
__('copying images... '),
@@ -427,12 +428,12 @@ def copy_image_files_pil(self) -> None:
427428
):
428429
dest = self.images[src]
429430
try:
430-
img = Image.open(os.path.join(self.srcdir, src))
431+
img = Image.open(self.srcdir / src)
431432
except OSError:
432433
if not self.is_vector_graphics(src):
433434
logger.warning(
434435
__('cannot read image file %r: copying it instead'),
435-
os.path.join(self.srcdir, src),
436+
self.srcdir / src,
436437
)
437438
try:
438439
copyfile(
@@ -443,7 +444,7 @@ def copy_image_files_pil(self) -> None:
443444
except OSError as err:
444445
logger.warning(
445446
__('cannot copy image file %r: %s'),
446-
os.path.join(self.srcdir, src),
447+
self.srcdir / src,
447448
err,
448449
)
449450
continue
@@ -459,11 +460,11 @@ def copy_image_files_pil(self) -> None:
459460
nh = round((height * nw) / width)
460461
img = img.resize((nw, nh), Image.BICUBIC)
461462
try:
462-
img.save(os.path.join(self.outdir, self.imagedir, dest))
463+
img.save(self.outdir / self.imagedir / dest)
463464
except OSError as err:
464465
logger.warning(
465466
__('cannot write image file %r: %s'),
466-
os.path.join(self.srcdir, src),
467+
self.srcdir / src,
467468
err,
468469
)
469470

@@ -511,7 +512,7 @@ def build_mimetype(self) -> None:
511512
"""Write the metainfo file mimetype."""
512513
logger.info(__('writing mimetype file...'))
513514
copyfile(
514-
os.path.join(self.template_dir, 'mimetype'),
515+
self.template_dir / 'mimetype',
515516
self.outdir / 'mimetype',
516517
force=True,
517518
)
@@ -522,7 +523,7 @@ def build_container(self, outname: str = 'META-INF/container.xml') -> None:
522523
outdir = self.outdir / 'META-INF'
523524
ensuredir(outdir)
524525
copyfile(
525-
os.path.join(self.template_dir, 'container.xml'),
526+
self.template_dir / 'container.xml',
526527
outdir / 'container.xml',
527528
force=True,
528529
)
@@ -577,9 +578,10 @@ def build_content(self) -> None:
577578
if not self.use_index:
578579
self.ignored_files.append('genindex' + self.out_suffix)
579580
for root, dirs, files in os.walk(self.outdir):
581+
root_path = Path(root)
580582
dirs.sort()
581583
for fn in sorted(files):
582-
filename = relpath(os.path.join(root, fn), self.outdir)
584+
filename = relpath(root_path / fn, self.outdir)
583585
if filename in self.ignored_files:
584586
continue
585587
ext = os.path.splitext(filename)[-1]
@@ -684,7 +686,7 @@ def build_content(self) -> None:
684686

685687
# write the project file
686688
copy_asset_file(
687-
os.path.join(self.template_dir, 'content.opf.jinja'),
689+
self.template_dir / 'content.opf.jinja',
688690
self.outdir,
689691
context=metadata,
690692
force=True,
@@ -778,7 +780,7 @@ def build_toc(self) -> None:
778780
level = max(item['level'] for item in self.refnodes)
779781
level = min(level, self.config.epub_tocdepth)
780782
copy_asset_file(
781-
os.path.join(self.template_dir, 'toc.ncx.jinja'),
783+
self.template_dir / 'toc.ncx.jinja',
782784
self.outdir,
783785
context=self.toc_metadata(level, navpoints),
784786
force=True,
@@ -792,10 +794,10 @@ def build_epub(self) -> None:
792794
"""
793795
outname = self.config.epub_basename + '.epub'
794796
logger.info(__('writing %s file...'), outname)
795-
epub_filename = os.path.join(self.outdir, outname)
797+
epub_filename = self.outdir / outname
796798
with ZipFile(epub_filename, 'w', ZIP_DEFLATED) as epub:
797-
epub.write(os.path.join(self.outdir, 'mimetype'), 'mimetype', ZIP_STORED)
799+
epub.write(self.outdir / 'mimetype', 'mimetype', ZIP_STORED)
798800
for filename in ('META-INF/container.xml', 'content.opf', 'toc.ncx'):
799-
epub.write(os.path.join(self.outdir, filename), filename, ZIP_DEFLATED)
801+
epub.write(self.outdir / filename, filename, ZIP_DEFLATED)
800802
for filename in self.files:
801-
epub.write(os.path.join(self.outdir, filename), filename, ZIP_DEFLATED)
803+
epub.write(self.outdir / filename, filename, ZIP_DEFLATED)

sphinx/builders/changes.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import html
66
import os.path
7+
from pathlib import Path
78
from typing import TYPE_CHECKING
89

910
from sphinx import package_dir
@@ -13,7 +14,7 @@
1314
from sphinx.theming import HTMLThemeFactory
1415
from sphinx.util import logging
1516
from sphinx.util.fileutil import copy_asset_file
16-
from sphinx.util.osutil import ensuredir, os_path
17+
from sphinx.util.osutil import ensuredir
1718

1819
if TYPE_CHECKING:
1920
from collections.abc import Set
@@ -103,9 +104,9 @@ def write_documents(self, _docnames: Set[str]) -> None:
103104
'show_copyright': self.config.html_show_copyright,
104105
'show_sphinx': self.config.html_show_sphinx,
105106
}
106-
with open(os.path.join(self.outdir, 'index.html'), 'w', encoding='utf8') as f:
107+
with open(self.outdir / 'index.html', 'w', encoding='utf8') as f:
107108
f.write(self.templates.render('changes/frameset.html', ctx))
108-
with open(os.path.join(self.outdir, 'changes.html'), 'w', encoding='utf8') as f:
109+
with open(self.outdir / 'changes.html', 'w', encoding='utf8') as f:
109110
f.write(self.templates.render('changes/versionchanges.html', ctx))
110111

111112
hltext = [
@@ -141,24 +142,22 @@ def hl(no: int, line: str) -> str:
141142
'text': text,
142143
}
143144
rendered = self.templates.render('changes/rstsource.html', ctx)
144-
targetfn = os.path.join(self.outdir, 'rst', os_path(docname)) + '.html'
145+
targetfn = self.outdir / 'rst' / f'{docname}.html'
145146
ensuredir(os.path.dirname(targetfn))
146147
with open(targetfn, 'w', encoding='utf-8') as f:
147148
f.write(rendered)
148149
themectx = {
149150
'theme_' + key: val for (key, val) in self.theme.get_options({}).items()
150151
}
151152
copy_asset_file(
152-
os.path.join(
153-
package_dir, 'themes', 'default', 'static', 'default.css.jinja'
154-
),
153+
Path(package_dir, 'themes', 'default', 'static', 'default.css.jinja'),
155154
self.outdir,
156155
context=themectx,
157156
renderer=self.templates,
158157
force=True,
159158
)
160159
copy_asset_file(
161-
os.path.join(package_dir, 'themes', 'basic', 'static', 'basic.css'),
160+
Path(package_dir, 'themes', 'basic', 'static', 'basic.css'),
162161
self.outdir / 'basic.css',
163162
force=True,
164163
)

sphinx/builders/epub3.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from sphinx.config import ENUM
1818
from sphinx.locale import __
1919
from sphinx.util import logging
20+
from sphinx.util._pathlib import _StrPath
2021
from sphinx.util.fileutil import copy_asset_file
2122
from sphinx.util.osutil import make_filename
2223

@@ -84,7 +85,7 @@ class Epub3Builder(_epub_base.EpubBuilder):
8485
epilog = __('The ePub file is in %(outdir)s.')
8586

8687
supported_remote_images = False
87-
template_dir = os.path.join(package_dir, 'templates', 'epub3')
88+
template_dir = _StrPath(package_dir, 'templates', 'epub3')
8889
doctype = DOCTYPE
8990
html_tag = HTML_TAG
9091
use_meta_charset = True
@@ -199,7 +200,7 @@ def build_navigation_doc(self) -> None:
199200
refnodes = self.refnodes
200201
navlist = self.build_navlist(refnodes)
201202
copy_asset_file(
202-
os.path.join(self.template_dir, 'nav.xhtml.jinja'),
203+
self.template_dir / 'nav.xhtml.jinja',
203204
self.outdir,
204205
context=self.navigation_doc_metadata(navlist),
205206
force=True,

sphinx/builders/gettext.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,11 @@ def write_doc(self, docname: str, doctree: nodes.document) -> None:
209209
ctime = time.strftime('%Y-%m-%d %H:%M%z', timestamp)
210210

211211

212-
def should_write(filepath: str, new_content: str) -> bool:
212+
def should_write(filepath: str | os.PathLike[str], new_content: str) -> bool:
213213
if not os.path.exists(filepath):
214214
return True
215215
try:
216-
with codecs.open(filepath, encoding='utf-8') as oldpot:
216+
with codecs.open(str(filepath), encoding='utf-8') as oldpot:
217217
old_content = oldpot.read()
218218
old_header_index = old_content.index('"POT-Creation-Date:')
219219
new_header_index = new_content.index('"POT-Creation-Date:')
@@ -252,11 +252,11 @@ def init(self) -> None:
252252
def _collect_templates(self) -> set[str]:
253253
template_files = set()
254254
for template_path in self.config.templates_path:
255-
tmpl_abs_path = os.path.join(self.app.srcdir, template_path)
255+
tmpl_abs_path = self.app.srcdir / template_path
256256
for dirpath, _dirs, files in walk(tmpl_abs_path):
257257
for fn in files:
258258
if fn.endswith('.html'):
259-
filename = canon_path(os.path.join(dirpath, fn))
259+
filename = Path(dirpath, fn).as_posix()
260260
template_files.add(filename)
261261
return template_files
262262

@@ -312,7 +312,7 @@ def finish(self) -> None:
312312
operator.itemgetter(0),
313313
):
314314
# noop if config.gettext_compact is set
315-
ensuredir(os.path.join(self.outdir, os.path.dirname(textdomain)))
315+
ensuredir(self.outdir / os.path.dirname(textdomain))
316316

317317
context['messages'] = list(catalog)
318318
template_path = [
@@ -321,9 +321,9 @@ def finish(self) -> None:
321321
renderer = GettextRenderer(template_path, outdir=self.outdir)
322322
content = renderer.render('message.pot.jinja', context)
323323

324-
pofn = os.path.join(self.outdir, textdomain + '.pot')
324+
pofn = self.outdir / f'{textdomain}.pot'
325325
if should_write(pofn, content):
326-
with codecs.open(pofn, 'w', encoding='utf-8') as pofile:
326+
with codecs.open(str(pofn), 'w', encoding='utf-8') as pofile:
327327
pofile.write(content)
328328

329329

sphinx/builders/latex/__init__.py

+10-13
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def init_multilingual(self) -> None:
277277

278278
def write_stylesheet(self) -> None:
279279
highlighter = highlighting.PygmentsBridge('latex', self.config.pygments_style)
280-
stylesheet = os.path.join(self.outdir, 'sphinxhighlight.sty')
280+
stylesheet = self.outdir / 'sphinxhighlight.sty'
281281
with open(stylesheet, 'w', encoding='utf-8') as f:
282282
f.write('\\NeedsTeXFormat{LaTeX2e}[1995/12/01]\n')
283283
f.write(
@@ -318,7 +318,7 @@ def write_documents(self, _docnames: Set[str]) -> None:
318318
if len(entry) > 5:
319319
toctree_only = entry[5]
320320
destination = SphinxFileOutput(
321-
destination_path=os.path.join(self.outdir, targetname),
321+
destination_path=self.outdir / targetname,
322322
encoding='utf-8',
323323
overwrite_if_changed=True,
324324
)
@@ -444,21 +444,21 @@ def copy_support_files(self) -> None:
444444
'xindy_lang_option': xindy_lang_option,
445445
'xindy_cyrillic': xindy_cyrillic,
446446
}
447-
staticdirname = os.path.join(package_dir, 'texinputs')
448-
for filename in Path(staticdirname).iterdir():
447+
static_dir_name = Path(package_dir, 'texinputs')
448+
for filename in Path(static_dir_name).iterdir():
449449
if not filename.name.startswith('.'):
450450
copy_asset_file(
451-
os.path.join(staticdirname, filename),
451+
static_dir_name / filename,
452452
self.outdir,
453453
context=context,
454454
force=True,
455455
)
456456

457457
# use pre-1.6.x Makefile for make latexpdf on Windows
458458
if os.name == 'nt':
459-
staticdirname = os.path.join(package_dir, 'texinputs_win')
459+
static_dir_name = Path(package_dir, 'texinputs_win')
460460
copy_asset_file(
461-
os.path.join(staticdirname, 'Makefile.jinja'),
461+
static_dir_name / 'Makefile.jinja',
462462
self.outdir,
463463
context=context,
464464
force=True,
@@ -496,11 +496,11 @@ def copy_image_files(self) -> None:
496496
except Exception as err:
497497
logger.warning(
498498
__('cannot copy image file %r: %s'),
499-
os.path.join(self.srcdir, src),
499+
self.srcdir / src,
500500
err,
501501
)
502502
if self.config.latex_logo:
503-
if not os.path.isfile(os.path.join(self.confdir, self.config.latex_logo)):
503+
if not os.path.isfile(self.confdir / self.config.latex_logo):
504504
raise SphinxError(
505505
__('logo file %r does not exist') % self.config.latex_logo
506506
)
@@ -523,11 +523,8 @@ def write_message_catalog(self) -> None:
523523
if self.context['babel'] or self.context['polyglossia']:
524524
context['addtocaptions'] = r'\addto\captions%s' % self.babel.get_language()
525525

526-
filename = os.path.join(
527-
package_dir, 'templates', 'latex', 'sphinxmessages.sty.jinja'
528-
)
529526
copy_asset_file(
530-
filename,
527+
Path(package_dir, 'templates', 'latex', 'sphinxmessages.sty.jinja'),
531528
self.outdir,
532529
context=context,
533530
renderer=LaTeXRenderer(),

0 commit comments

Comments
 (0)